Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 6

Cov ntaub ntawv ntawm tsab xov xwm yog muab los ntawm kuv zen channel.

Xa ib lub suab teeb liab ntawm RTP kwj

Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 6

Thaum kawg Tshooj Peb tau sib sau ua ke cov chaw taws teeb tswj Circuit Court los ntawm lub tshuab hluav taws xob lub suab thiab lub suab ntes uas ua haujlwm nyob rau hauv tib txoj haujlwm. Hauv tsab xov xwm no peb yuav kawm paub siv RTP raws tu qauv (RFC 3550 - RTP: Txoj Cai Thauj Mus Los rau Cov Ntawv Thov Hauv Sijhawm) rau kev txais / xa cov teeb liab suab ntawm Ethernet network.

RTP raws tu qauv (Real Time Protocol) txhais tau hais tias raws tu qauv ntawm lub sijhawm tiag tiag, nws yog siv los xa cov suab, video, cov ntaub ntawv, txhua yam uas yuav tsum tau xa mus rau lub sijhawm. Cia peb ua ib qho piv txwv. Qhov yooj yim ntawm cov txheej txheem yog xws li tias nws tso cai rau koj xa cov teeb liab lub suab nrog qhov kev txiav txim siab zoo.

Kev xa tawm yog nqa tawm siv UDP pob ntawv, uas txhais tau hais tias cov pob ntawv poob tau txais txiaj ntsig zoo thaum sib kis. Txhua pob ntawv muaj RTP header tshwj xeeb thiab cov ntaub ntawv thaiv ntawm cov teeb liab kis. Lub header muaj ib tug randomly xaiv lub teeb liab qhov chaw identifier, cov ntaub ntawv hais txog hom teeb liab kis tau tus mob, thiab ib tug tshwj xeeb pob ntawv raws li ib tug xov tooj kom cov pob ntawv yuav tsum tau teem nyob rau hauv qhov kev txiav txim kom raug thaum decoding, tsis hais qhov kev txiav txim nyob rau hauv uas lawv tau xa los ntawm lub network. Lub header tseem tuaj yeem muaj cov ntaub ntawv ntxiv, lub npe hu ua extension, uas tso cai rau lub header yuav tsum tau yoog rau siv nyob rau hauv ib tug tshwj xeeb daim ntawv thov.

Cov ntaub ntawv thaiv muaj cov payload ntawm pob ntawv. Lub koom haum sab hauv ntawm cov ntsiab lus nyob ntawm seb hom kev thauj khoom, nws tuaj yeem yog cov qauv ntawm lub teeb liab mono, lub tso suab teeb liab, kab duab video, thiab lwm yam.

Hom kev thauj khoom yog qhia los ntawm tus lej xya-ntsis. Kev pom zoo RFC3551 (RTP Profile rau Suab thiab Video Conferences nrog tsawg tswj) tsim kom muaj ntau hom kev thauj khoom; cov lus sib thooj muab cov lus piav qhia ntawm hom kev thauj khoom thiab lub ntsiab lus ntawm cov lis dej num uas lawv raug xaiv. Qee cov lis dej num tsis nruj me ntsis khi rau txhua hom kev thauj khoom; lawv tuaj yeem siv los xaiv qhov kev txiav txim siab.

Qhov loj ntawm cov ntaub ntawv thaiv yog txwv saum toj no los ntawm qhov siab tshaj plaws pob ntawv loj uas tuaj yeem xa mus rau ntawm ib lub network tsis muaj segmentation (MTU parameter). Feem ntau, qhov no tsis ntau tshaj 1500 bytes. Yog li, txhawm rau txhawm rau nce cov ntaub ntawv xa mus rau ib ob, koj tuaj yeem ua kom cov pob ntawv loj tuaj mus rau qee qhov taw tes, thiab tom qab ntawd koj yuav tsum tau nce qhov zaus ntawm kev xa cov pob ntawv. Hauv kev tshaj tawm xov xwm, qhov no yog qhov chaw teeb tsa. Los ntawm lub neej ntawd nws yog 50 Hz, i.e. 50 pob ntawv ib ob. Peb yuav hu cov kab ke sib kis ntawm RTP pob ntawv ib qho RTP kwj.

Txhawm rau pib xa cov ntaub ntawv ntawm qhov chaw thiab tus txais, nws yog qhov txaus uas lub transmitter paub tus IP chaw nyob ntawm tus txais thiab tus lej chaw nres nkoj uas nws siv rau kev txais. Cov. yam tsis muaj cov txheej txheem ua ntej, lub hauv paus pib xa cov ntaub ntawv, thiab tus txais, tig, npaj tau tam sim ntawd thiab ua tiav nws. Raws li tus qauv, tus naj npawb chaw nres nkoj siv los xa lossis tau txais RTP kwj yuav tsum yog.

Nyob rau hauv cov xwm txheej uas nws tsis tuaj yeem paub tus neeg txais qhov chaw nyob ua ntej, cov servers tau siv qhov twg cov neeg txais tau tawm ntawm lawv qhov chaw nyob, thiab lub tshuab xa tawm tuaj yeem thov nws los ntawm kev xa mus rau qee lub npe tshwj xeeb ntawm tus txais.

Nyob rau hauv rooj plaub uas qhov zoo ntawm kev sib txuas lus channel lossis lub peev xwm ntawm tus txais tsis paub, lub tswv yim channel raug teeb tsa los ntawm tus neeg txais tuaj yeem qhia tus neeg xa xov xwm txog nws lub peev xwm, pes tsawg pob ntawv nws tsis tuaj, thiab lwm yam. Cov channel no siv RTCP raws tu qauv. Cov hom ntawv ntawm cov pob ntawv xa mus rau hauv cov channel no tau txhais hauv RFC 3605. Cov ntaub ntawv me me raug xa tawm ntawm cov channel no, 200..300 bytes ib ob, yog li feem ntau, nws lub xub ntiag tsis yog lub nra hnyav. Tus lej chaw nres nkoj uas RTCP cov pob khoom xa tuaj yuav tsum yog khib thiab ib qho loj dua tus lej chaw nres nkoj uas RTP ntws los. Hauv peb qhov piv txwv, peb yuav tsis siv cov channel no, txij li lub peev xwm ntawm tus txais thiab channel pom tseeb dhau ntawm peb, kom deb li deb, xav tau.

Hauv peb qhov kev pab cuam, cov ntaub ntawv xa xov hluav taws xob, tsis zoo li qhov piv txwv yav dhau los, yuav muab faib ua ob ntu: txoj kev xa tawm thiab txoj kev txais. Rau txhua qhov peb yuav ua peb tus kheej lub moos, raws li pom hauv daim duab npe.

Kev sib txuas lus ib leeg ntawm lawv yuav ua tiav siv RTP raws tu qauv. Hauv qhov piv txwv no, peb tsis xav tau ib lub network sab nraud, vim tias ob qho tib si transmitter thiab receiver yuav nyob ntawm tib lub computer - cov pob ntawv yuav mus hauv nws.

Txhawm rau tsim RTP kwj, cov xov xwm streamer siv ob lub lim dej: MS_RTP_SEND thiab MS_RTP_RECV. Thawj tus kis tus thib ob thiab tau txais RTP kwj. Txhawm rau kom cov ntxaij lim dej no ua haujlwm, lawv yuav tsum dhau tus taw tes rau qhov khoom siv RTP, uas tuaj yeem hloov cov kwj ntawm cov ntaub ntawv thaiv rau hauv cov kwj ntawm RTP pob ntawv lossis ua qhov sib txawv. Txij li cov ntaub ntawv sab hauv ntawm cov xov xwm streamer tsis sib xws cov ntaub ntawv hom ntawv ntawm RTP pob ntawv, ua ntej hloov cov ntaub ntawv mus rau MS_RTP_SEND, koj yuav tsum siv lub lim encoder uas hloov 16-ntsis suab teeb liab qauv mus rau yim-ntsis encoded raws li tus u-law (mu-law). Nyob rau sab txais, lub decoder lim ua qhov kev ua haujlwm rov qab.

Hauv qab no yog cov ntawv nyeem ntawm qhov kev zov me nyuam uas siv cov tswv yim pom hauv daim duab (tus cim # ua ntej suav nrog cov lus qhia raug tshem tawm, tsis txhob hnov ​​​​qab suav nrog lawv):

/* Π€Π°ΠΉΠ» mstest6.c Π˜ΠΌΠΈΡ‚Π°Ρ‚ΠΎΡ€ ΠΏΡƒΠ»ΡŒΡ‚Π° управлСния ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>
#include <mediastreamer2/mstonedetector.h>
#include <mediastreamer2/msrtp.h>
#include <ortp/rtpsession.h>
#include <ortp/payloadtype.h>
/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с функциями управлСния событиями
* мСдиастримСра.*/
include <mediastreamer2/mseventqueue.h>
#define PCMU 0
/* Ѐункция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½
ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ совпадСниС характСристик Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ сигнала с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. */
static void tone_detected_cb(void *data, MSFilter *f, unsigned int event_id,
MSToneDetectorEvent *ev)
{
printf("ΠŸΡ€ΠΈΠ½ΡΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: %sn", ev->tone_name);
}
/*----------------------------------------------------------------------------*/
/* Ѐункция рСгистрации Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ. */
void register_payloads(void)
{
/*РСгистрируСм Ρ‚ΠΈΠΏΡ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ. ПозднСС, ΠΏΠΎ индСксу
взятому ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° RTP-ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ· этой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ
ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для дСкодирования Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π°. */
rtp_profile_set_payload (&av_profile, PCMU, &payload_type_pcm8000);
}
/*----------------------------------------------------------------------------*/
/* Π­Ρ‚Π° функция создана ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ create_duplex_rtpsession() Π² audiostream.c
мСдиастримСра2. */
static RtpSession *
create_rtpsession (int loc_rtp_port, int loc_rtcp_port,
bool_t ipv6, RtpSessionMode mode)
{
RtpSession *rtpr;
rtpr = rtp_session_new ((int) mode);
rtp_session_set_scheduling_mode (rtpr, 0);
rtp_session_set_blocking_mode (rtpr, 0);
rtp_session_enable_adaptive_jitter_compensation (rtpr, TRUE);
rtp_session_set_symmetric_rtp (rtpr, TRUE);
rtp_session_set_local_addr (rtpr, ipv6 ? "::" : "0.0.0.0", loc_rtp_port,
loc_rtcp_port);
rtp_session_signal_connect (rtpr, "timestamp_jump",
(RtpCallback) rtp_session_resync, 0);
rtp_session_signal_connect (rtpr, "ssrc_changed",
(RtpCallback) rtp_session_resync, 0);
rtp_session_set_ssrc_changed_threshold (rtpr, 0);
rtp_session_set_send_payload_type(rtpr, PCMU);
/* По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ RTCP-сСссию, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ наш ΠΏΡƒΠ»ΡŒΡ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘. */
rtp_session_enable_rtcp (rtpr, FALSE);
return rtpr;
}
/*----------------------------------------------------------------------------*/
int main()
{
ms_init();
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ экзСмпляры Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ². */
MSFilter *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *volume = ms_filter_new(MS_VOLUME_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);
MSFilter *detector = ms_filter_new(MS_TONE_DETECTOR_ID);
/* ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ массив находящийся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° Ρ‚ΠΎΠ½ΠΎΠ², ΠΎΠ½ описываСт
* особыС ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Ρ‹ разыскиваСмых сигналов.*/
ms_filter_call_method(detector, MS_TONE_DETECTOR_CLEAR_SCANS, 0);
/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΊ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. */
ms_filter_set_notify_callback(detector,
(MSFilterNotifyFunc)tone_detected_cb, NULL);
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ массив, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ описываСт характСристику
* ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΎΠ½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ: ВСкстовоС имя
* Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта, частота Π² Π³Π΅Ρ€Ρ†Π°Ρ…, Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² миллисСкундах,
* ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 0,775Π’. */
MSToneDetectorDef scan[6]=
{
{"V+",440, 100, 0.1}, /* Команда "Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ". */
{"V-",540, 100, 0.1}, /* Команда "Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ". */
{"C+",640, 100, 0.1}, /* Команда "Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°". */
{"C-",740, 100, 0.1}, /* Команда "Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°". */
{"ON",840, 100, 0.1}, /* Команда "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€". */
{"OFF", 940, 100, 0.1}/* Команда "Π’Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€". */
};
/* ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ "ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Ρ‹" сигналов Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Ρ‚ΠΎΠ½ΠΎΠ². */
int i;
for (i = 0; i < 6; i++)
{
ms_filter_call_method(detector, MS_TONE_DETECTOR_ADD_SCAN,
&scan[i]);
}
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΊΠΎΠ΄Π΅Ρ€Π° ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π° */
MSFilter *encoder = ms_filter_create_encoder("PCMU");
MSFilter *decoder=ms_filter_create_decoder("PCMU");
/* РСгистрируСм Ρ‚ΠΈΠΏΡ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. */
register_payloads();
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ RTP-сСссию ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°. */
RtpSession *tx_rtp_session = create_rtpsession (8010, 8011, FALSE, RTP_SESSION_SENDONLY);
rtp_session_set_remote_addr_and_port(tx_rtp_session,"127.0.0.1", 7010, 7011);
rtp_session_set_send_payload_type(tx_rtp_session, PCMU);
MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);
ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, tx_rtp_session);
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ RTP-сСссию ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. */
MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
RtpSession *rx_rtp_session = create_rtpsession (7010, 7011, FALSE, RTP_SESSION_RECVONLY);
ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rx_rtp_session);
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ источники Ρ‚Π°ΠΊΡ‚ΠΎΠ² - Ρ‚ΠΈΠΊΠ΅Ρ€Ρ‹. */
MSTicker *ticker_tx = ms_ticker_new();
MSTicker *ticker_rx = ms_ticker_new();
/* БоСдиняСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°. */
ms_filter_link(voidsource, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, volume, 0);
ms_filter_link(volume, 0, encoder, 0);
ms_filter_link(encoder, 0, rtpsend, 0);
/* БоСдиняСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊΠ°. */
ms_filter_link(rtprecv, 0, decoder, 0);
ms_filter_link(decoder, 0, detector, 0);
ms_filter_link(detector, 0, snd_card_write, 0);
/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ источник Ρ‚Π°ΠΊΡ‚ΠΎΠ². */
ms_ticker_attach(ticker_tx, voidsource);
ms_ticker_attach(ticker_rx, rtprecv);
/* НастраиваСм структуру, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ сигналом Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. */
MSDtmfGenCustomTone dtmf_cfg;
dtmf_cfg.tone_name[0] = 0;
dtmf_cfg.duration = 1000;
dtmf_cfg.frequencies[0] = 440;
/* Π‘ΡƒΠ΄Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΎΠ½, частоту Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΎΠ½Π° установим Π² 0. */
dtmf_cfg.frequencies[1] = 0;
dtmf_cfg.amplitude = 1.0;
dtmf_cfg.interval = 0.;
dtmf_cfg.repeat_count = 0.;
/* ΠžΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ Ρ†ΠΈΠΊΠ» сканирования Π½Π°ΠΆΠ°Ρ‚Ρ‹Ρ… клавиш. Π’Π²ΠΎΠ΄ нуля Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚
* Ρ†ΠΈΠΊΠ» ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. */
char key='9';
printf("НаТмитС ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π·Π°Ρ‚Π΅ΠΌ Π²Π²ΠΎΠ΄.n"
"Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ 0.n");
while(key != '0')
{
key = getchar();
if ((key >= 49) && (key <= 54))
{
printf("ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: %cn", key);
/* УстанавливаСм частоту Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π² соотвСтствии с
* ΠΊΠΎΠ΄ΠΎΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши. */
dtmf_cfg.frequencies[0] = 440 + 100*(key-49);
/* Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ c ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ частотой. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&dtmf_cfg);
}
/* Π£ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ Ρ‚Ρ€Π΅Π΄ Π² спячку Π½Π° 20мс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Ρ€Π΅Π΄Ρ‹
* прилоТСния ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ врСмя Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ. */
ms_usleep(20000);
}
}

Peb sau thiab khiav. Qhov kev zov me nyuam yuav ua haujlwm zoo li hauv qhov piv txwv dhau los, tab sis cov ntaub ntawv yuav raug xa mus ntawm RTP kwj.

Nyob rau hauv tsab xov xwm tom ntej no peb yuav faib qhov kev pab cuam no rau hauv ob daim ntawv thov kev ywj pheej - ib lub receiver thiab transmitter thiab tso rau lawv nyob rau hauv txawv terminals. Tib lub sijhawm, peb yuav kawm yuav ua li cas txheeb xyuas RTP pob ntawv siv TShark program.

Tau qhov twg los: www.hab.com

Ntxiv ib saib