Mediastreamer2 VoIP ์—”์ง„ ํƒ์ƒ‰. 2 ๋ถ€

๊ธ€์˜ ์†Œ์žฌ๋Š” ์ œ ๊ธ€์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์   ์ฑ„๋„.

Mediastreamer2 VoIP ์—”์ง„ ํƒ์ƒ‰. 2 ๋ถ€

ํ†ค ์ƒ์„ฑ๊ธฐ ๋งŒ๋“ค๊ธฐ

์ด์ „ ๊ธฐ์‚ฌ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆฌ๋จธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ‰๊ฐ€ํŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜์—ฌ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์‚ฌ์šด๋“œ ์นด๋“œ์—์„œ ํ†ค ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์•„๋ž˜ ํ‘œ์‹œ๋œ ์‚ฌ์šด๋“œ ์ƒ์„ฑ๊ธฐ ํšŒ๋กœ์— ํ•„ํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Mediastreamer2 VoIP ์—”์ง„ ํƒ์ƒ‰. 2 ๋ถ€

๋‹ค์ด์–ด๊ทธ๋žจ์„ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์ด๋™ํ•˜๋Š” ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ๋„ ์ด๋ฅผ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค. ์ง์‚ฌ๊ฐํ˜•์€ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ง์‚ฌ๊ฐํ˜• ์•ˆ์—๋Š” ์—ญํ• ์ด ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ฐ”๋กœ ์•„๋ž˜์—๋Š” ํ•„ํ„ฐ ์œ ํ˜•์ด ๋Œ€๋ฌธ์ž๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง์‚ฌ๊ฐํ˜•์„ ์—ฐ๊ฒฐํ•˜๋Š” ํ™”์‚ดํ‘œ๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋ก์ด ํ•„ํ„ฐ์—์„œ ํ•„ํ„ฐ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋Œ€๊ธฐ์—ด์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„ํ„ฐ์—๋Š” ๋งŽ์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์€ ํ•„ํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์‚ฐ๋˜๋Š” ํ…œํฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ํด๋Ÿญ ์†Œ์Šค์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํด๋ก ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ๊ฐ ํ•„ํ„ฐ๋Š” ์ž…๋ ฅ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๋‹ด๊ธด ๋ธ”๋ก์„ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ํด๋ก ์†Œ์Šค์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ•„ํ„ฐ๊ฐ€ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ์ถœ๋ ฅ์— ์—ฐ๊ฒฐ๋œ ํ•„ํ„ฐ(์ถœ๋ ฅ์ด ๋งŽ์„ ์ˆ˜ ์žˆ์Œ) ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฒด์ธ์˜ ๋งˆ์ง€๋ง‰ ํ•„ํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ์ƒˆ ์‹œ๊ณ„๊ฐ€ ๋„์ฐฉํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 10๋ฐ€๋ฆฌ์ดˆ ๊ฐ„๊ฒฉ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํด๋ก ์‚ฌ์ดํด์€ ๋ฌด์Œ ์†Œ์Šค์˜ ์ž…๋ ฅ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ํด๋ก ์‚ฌ์ดํด์˜ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹XNUMX์„ ํฌํ•จํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋ฐ”์œ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด ๋ธ”๋ก์„ ์‚ฌ์šด๋“œ ์ƒ˜ํ”Œ ๋ธ”๋ก์œผ๋กœ ๊ฐ„์ฃผํ•˜๋ฉด ์ด๋Š” ์นจ๋ฌต์— ์ง€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๊ธฐ์—๋Š” ์นจ๋ฌต์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋“ค์„ ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ธ”๋ก์€ ์‚ฌ์šด๋“œ ์‹ ํ˜ธ ์ƒ์„ฑ๊ธฐ์˜ ์ž‘๋™์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๊ธฐ๋Š” ์ด๋Ÿฌํ•œ ๋ธ”๋ก์„ ๋นˆ ์ข…์ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šด๋“œ ์ƒ˜ํ”Œ์„ ๋…น์Œํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ ์ƒํƒœ์—์„œ๋Š” ์ƒ์„ฑ๊ธฐ๊ฐ€ ๊บผ์ง€๊ณ  ๋‹จ์ˆœํžˆ ์ž…๋ ฅ ๋ธ”๋ก์„ ์ถœ๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์นจ๋ฌต์˜ ๋ธ”๋ก์€ ์ „์ฒด ํšŒ๋กœ๋ฅผ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ณ€๊ฒฝ ์—†์ด ํ†ต๊ณผํ•˜์—ฌ ์‚ฌ์šด๋“œ ์นด๋“œ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ์— ์—ฐ๊ฒฐ๋œ ๋Œ€๊ธฐ์—ด์—์„œ ์ž๋™์œผ๋กœ ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ๊ธฐ์— ์‚ฌ์šด๋“œ ์žฌ์ƒ ๋ช…๋ น์ด ์ฃผ์–ด์ง€๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šด๋“œ ์ƒ˜ํ”Œ์„ ์ƒ์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ์ด๋ฅผ ์ž…๋ ฅ ๋ธ”๋ก์˜ ์ƒ˜ํ”Œ๋กœ ๋Œ€์ฒดํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๋ธ”๋ก์„ ์ถœ๋ ฅ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šด๋“œ ์นด๋“œ๊ฐ€ ์†Œ๋ฆฌ๋ฅผ ์žฌ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ž‘์—… ๊ณ„ํš์„ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

/* ะคะฐะนะป mstest2.c */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
int main()
{
    ms_init();

    /* ะกะพะทะดะฐะตะผ ัะบะทะตะผะฟะปัั€ั‹ ั„ะธะปัŒั‚ั€ะพะฒ. */
    MSFilter  *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
    MSFilter  *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
    MSSndCard *card_playback = ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter  *snd_card_write = ms_snd_card_create_writer(card_playback);

    /* ะกะพะทะดะฐะตะผ ั‚ะธะบะตั€. */
    MSTicker *ticker = ms_ticker_new();

    /* ะกะพะตะดะธะฝัะตะผ ั„ะธะปัŒั‚ั€ั‹ ะฒ ั†ะตะฟะพั‡ะบัƒ. */
    ms_filter_link(voidsource, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, snd_card_write, 0);

   /* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ. */
   ms_ticker_attach(ticker, voidsource);

   /* ะ’ะบะปัŽั‡ะฐะตะผ ะทะฒัƒะบะพะฒะพะน ะณะตะฝะตั€ะฐั‚ะพั€. */
   char key='1';
   ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY, (void*)&key);

   /* ะ”ะฐะตะผ, ะฒั€ะตะผั, ั‡ั‚ะพะฑั‹ ะฒัะต ะฑะปะพะบะธ ะดะฐะฝะฝั‹ั… ะฑั‹ะปะธ ะฟะพะปัƒั‡ะตะฝั‹ ะทะฒัƒะบะพะฒะพะน ะบะฐั€ั‚ะพะน.*/
   ms_sleep(2);   
}

๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆฌ๋จธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ์„ธ ๊ฐ€์ง€ ํ•„ํ„ฐ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. voidsource, dtmfgen, snd_card_write. ํด๋Ÿญ ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ํšŒ๋กœ์— ๋”ฐ๋ผ ํ•„ํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋ฉฐ ํด๋ก ์†Œ์Šค๋Š” ๋งˆ์ง€๋ง‰์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํšŒ๋กœ๊ฐ€ ์ฆ‰์‹œ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํด๋ก ์†Œ์Šค๋ฅผ ๋ฏธ์™„์„ฑ ํšŒ๋กœ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์ž…๋ ฅ ๋˜๋Š” ๋ชจ๋“  ์ถœ๋ ฅ์ด "๊ณต์ค‘์— ๋งค๋‹ฌ๋ ค ์žˆ๋Š”"(์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Œ) ์ฒด์ธ์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ•„ํ„ฐ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆฌ๋จธ๊ฐ€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„ํ„ฐ ์—ฐ๊ฒฐ์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

ms_filter_link(src, src_out, dst, dst_in)

์—ฌ๊ธฐ์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์†Œ์Šค ํ•„ํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์†Œ์Šค ์ถœ๋ ฅ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค(์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์˜ ๋ฒˆํ˜ธ๋Š” XNUMX๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค). ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์ˆ˜์‹ ์ž ํ•„ํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๊ณ , ๋„ค ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์ˆ˜์‹ ์ž ์ž…๋ ฅ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ํ•„ํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜๊ณ  ํด๋ก ์†Œ์Šค๊ฐ€ ๋งˆ์ง€๋ง‰์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค(์ดํ•˜ ๊ฐ„๋‹จํžˆ ํ‹ฐ์ปค๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค). ๊ทธ ํ›„ ์‚ฌ์šด๋“œ ํšŒ๋กœ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ง€๋งŒ ์•„์ง ์ปดํ“จํ„ฐ ์Šคํ”ผ์ปค์—์„œ๋Š” ์•„๋ฌด ์†Œ๋ฆฌ๋„ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šด๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๊บผ์ง€๊ณ  ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์กฐ์šฉํžˆ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ํ†ค ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ƒ์„ฑ๊ธฐ ํ•„ํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ „ํ™”๊ธฐ์˜ "1" ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ๊ฒƒ์— ํ•ด๋‹นํ•˜๋Š” ํˆฌํ†ค(DTMF) ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ms_filter_call_method() MS_DTMF_GEN_PLAY ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์žฌ์ƒ ์‹ ํ˜ธ๊ฐ€ ๋Œ€์‘ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚จ์€ ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

$ gcc mstest2.c -o mstest2 `pkg-config mediastreamer --libs --cflags`

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

$ ./mstest2

ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๋ฉด ์ปดํ“จํ„ฐ ์Šคํ”ผ์ปค์—์„œ ๋‘ ๊ฐ€์ง€ ํ†ค์œผ๋กœ ๊ตฌ์„ฑ๋œ ์งง์€ ์‚ฌ์šด๋“œ ์‹ ํ˜ธ๊ฐ€ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šด๋“œ ํšŒ๋กœ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•, ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์„ฑ๊ณต์— ๋งŒ์กฑํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ์—ฌ์ „ํžˆ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์— ๊ธฐ์‚ฌ ์šฐ๋ฆฌ๋Š” ์Šค์Šค๋กœ ์ฒญ์†Œํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€