Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 6

Lawe ʻia ka mea o ka ʻatikala mai kaʻu zen channel.

Ka hoʻouna ʻana i kahi hōʻailona leo ma ke kahawai RTP

Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 6

I ka hope loa 'ōlelo Ua hōʻuluʻulu mākou i kahi kaapuni kaʻa mamao mai kahi mea hana leo a me kahi mea ʻike leo e hana ana i loko o ka papahana like. Ma kēia ʻatikala e aʻo mākou pehea e hoʻohana ai i ka protocol RTP (RFC 3550 - RTP: He Kaʻa Kaʻa no nā noi manawa maoli) no ka loaʻa ʻana/ka hoʻouna ʻana i kahi hōʻailona leo ma kahi pūnaewele Ethernet.

RTP protocol (Kūkākūkā manawa maoli) unuhi ʻia ʻo ia hoʻi ka protocol manawa maoli, hoʻohana ʻia ia e hoʻouna i nā leo, wikiō, ʻikepili, nā mea āpau e pono ai ka hoʻouna ʻana i ka manawa maoli. E lawe kākou i ka hōʻailona leo i laʻana. ʻO ka maʻalahi o ka protocol ka mea e hiki ai iā ʻoe ke hoʻouna i kahi hōʻailona leo me kahi kūlana i koho mua ʻia.

Lawe ʻia ka hoʻouna ʻana me ka hoʻohana ʻana i nā ʻeke UDP, ʻo ia hoʻi, ʻae ʻia ka poho o ka packet i ka wā o ka lawe ʻana. Loaʻa i kēlā me kēia ʻeke kahi poʻomanaʻo RTP kūikawā a me kahi poloka ʻikepili o ka hōʻailona i hoʻouna ʻia. Aia i loko o ke poʻo kekahi mea hōʻailona kumu hōʻailona i koho ʻia, ʻike e pili ana i ke ʻano o ka hōʻailona e hoʻouna ʻia ana, a me kahi helu kaʻina o ka ʻeke kūʻokoʻa i hiki ke hoʻonohonoho ʻia nā ʻeke ma ke ʻano kūpono i ka wā e hoʻololi ai, me ka nānā ʻole i ke kauoha i hāʻawi ʻia e ka pūnaewele. Hiki i ke poʻomanaʻo ke loaʻa nā ʻike hou aʻe, ka mea i kapa ʻia ʻo extension, e hiki ai ke hoʻololi ʻia ke poʻo no ka hoʻohana ʻana i kahi hana noi kikoʻī.

Aia i loko o ka poloka ʻikepili ka uku o ka ʻeke. ʻO ka hoʻonohonoho kūloko o ka ʻike e pili ana i ke ʻano o ka ukana, hiki ke lilo i mau laʻana o kahi hōʻailona mono, kahi hōʻailona stereo, laina kiʻi wikiō, etc.

Hōʻike ʻia ke ʻano hoʻouka e kahi helu ʻehiku-bit. Manaʻo RFC3551 (Hōʻike RTP no nā hālāwai leo a me nā wikiō me ka mana liʻiliʻi) e hoʻokumu i kekahi mau ʻano o ka ukana; ʻo ka papa kuhikuhi pili i ka wehewehe ʻana i nā ʻano o ka ukana a me ke ʻano o nā code i koho ʻia ai lākou. ʻAʻole pili paʻa ʻia kekahi mau code i kekahi ʻano o ka ukana; hiki ke hoʻohana ʻia e koho i kahi haʻahaʻa ʻole.

Ua kaupalena ʻia ka nui o kahi poloka ʻikepili ma luna o ka nui o ka packet nui hiki ke hoʻouna ʻia ma kahi pūnaewele i hāʻawi ʻia me ka ʻole o ka ʻāpana (MTU parameter). Ma ka laulā, ʻaʻole ʻoi aku kēia ma mua o 1500 bytes. No laila, i mea e hoʻonui ai i ka nui o ka ʻikepili i hoʻouna ʻia i kēlā me kēia kekona, hiki iā ʻoe ke hoʻonui i ka nui o ka ʻeke a hiki i kahi kikoʻī, a laila pono ʻoe e hoʻonui i ka pinepine o ka hoʻouna ʻana i nā ʻeke. Ma kahi streamer media, he hoʻonohonoho hoʻonohonoho kēia. ʻO ka maʻamau ʻo 50 Hz, ʻo ia. 50 mau ʻeke i kekona. E kapa mākou i ke kaʻina o nā ʻeke RTP i hoʻouna ʻia he kahawai RTP.

No ka hoʻomaka ʻana i ka hoʻouna ʻana i ka ʻikepili ma waena o ke kumu a me ka mea hoʻokipa, ua lawa ka ʻike o ka mea hoʻouna i ka IP address o ka mea hoʻokipa a me ka helu awa e hoʻohana ai no ka loaʻa ʻana. ʻO kēlā mau. me ka ʻole o nā kaʻina hana mua, hoʻomaka ke kumu e hoʻouna i ka ʻikepili, a ʻo ka mea hoʻokipa, ua mākaukau e loaʻa koke a hana. E like me ka maʻamau, ʻo ka helu awa i hoʻohana ʻia e hoʻouna a loaʻa paha i kahi kahawai RTP pono e like.

Ma nā kūlana hiki ʻole ke ʻike mua i ka helu o ka mea hoʻokipa, hoʻohana ʻia nā kikowaena kahi e haʻalele ai nā mea hoʻokipa i kā lākou helu wahi, a hiki i ka mea hoʻouna ke noi iā ia ma ke kuhikuhi ʻana i kekahi inoa kūʻokoʻa o ka mea hoʻokipa.

I nā hihia kahi i ʻike ʻole ʻia ai ka maikaʻi o ke kaila kamaʻilio a i ʻole nā ​​​​hiki o ka mea hoʻokipa, ua hoʻonohonoho ʻia kahi ala manaʻo e hiki ai i ka mea hoʻokipa ke hoʻomaopopo i ka transmitter e pili ana i kona hiki, ka nui o nā ʻeke i hala, etc. Ke hoʻohana nei kēia kanal i ka protocol RTCP. Ua wehewehe ʻia ke ʻano o nā ʻeke i hoʻouna ʻia ma kēia kahawai ma RFC 3605. Ua hoʻouna ʻia nā ʻikepili liʻiliʻi ma luna o kēia kahawai, 200..300 bytes i kēlā me kēia kekona, no laila ma ka laulā, ʻaʻole kaumaha kona hele ʻana. He mea ʻokoʻa ka helu awa i hoʻouna ʻia ai nā ʻeke RTCP a ʻoi aku ka nui ma mua o ka helu awa i hele mai ai ke kahawai RTP. I kā mākou hiʻohiʻona, ʻaʻole mākou e hoʻohana i kēia kahawai, no ka mea, ʻoi aku ka nui o ka hiki o ka mea hoʻokipa a me ke kahawai ma mua o kā mākou pono.

Ma kā mākou papahana, e hoʻokaʻawale ʻia ka kaapuni hoʻoili ʻikepili, ʻaʻole like me ka laʻana mua, i ʻelua ʻāpana: kahi ala hoʻouna a me kahi ala e loaʻa ai. No kēlā me kēia ʻāpana e hana mākou i kā mākou kumu uaki ponoʻī, e like me ka mea i hōʻike ʻia ma ke kiʻi poʻo inoa.

E hoʻokō ʻia ke kamaʻilio ʻana ma waena o lākou me ka hoʻohana ʻana i ka protocol RTP. Ma kēia hiʻohiʻona, ʻaʻole pono mākou i kahi pūnaewele waho, no ka mea, aia ka mea hoʻouna a me ka mea hoʻokipa ma ka kamepiula hoʻokahi - e hele nā ​​ʻeke i loko.

No ka hoʻokumu ʻana i kahi kahawai RTP, hoʻohana ka streamer media i ʻelua kānana: MS_RTP_SEND a me MS_RTP_RECV. Hoʻouna ka mea mua i ka lua a loaʻa ke kahawai RTP. I mea e hana ai kēia mau kānana, pono lākou e hāʻawi i kahi kuhikuhi i kahi mea hālāwai RTP, hiki iā ia ke hoʻololi i kahi kahawai o nā poloka ʻikepili i kahi kahawai o nā ʻeke RTP a i ʻole e hana i ka ʻaoʻao. No ka mea, ʻaʻole i kūlike ka ʻano ʻikepili kūloko o ka streamer media i ka hōpili ʻikepili o ka ʻeke RTP, ma mua o ka hoʻololi ʻana i ka ʻikepili iā MS_RTP_SEND, pono ʻoe e hoʻohana i kahi kānana encoder e hoʻololi i nā hōʻailona hōʻailona leo 16-bit i ʻewalu-bit i hoʻopaʻa ʻia e like me ka u-law (mu-law). Ma ka ʻaoʻao e loaʻa ana, hana ka kānana decoder i ka hana ʻē aʻe.

Aia ma lalo ka kikokikona o ka papahana e hoʻokō nei i ke kumumanaʻo i hōʻike ʻia ma ke kiʻi (nā hōʻailona # ma mua o ka wehe ʻana o nā kuhikuhi, mai poina e hoʻokomo iā lākou):

/* Файл 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);
}
}

Hoʻopili mākou a holo. E hana ka papahana e like me ka laʻana ma mua, akā e hoʻouna ʻia ka ʻikepili ma o kahi kahawai RTP.

Ma ka ʻatikala aʻe e hoʻokaʻawale mākou i kēia papahana i ʻelua mau noi kūʻokoʻa - kahi mea hoʻokipa a me kahi transmitter a hoʻokuʻu iā lākou i nā ʻāpana like ʻole. Ma ka manawa like, e aʻo mākou pehea e nānā ai i nā ʻeke RTP me ka hoʻohana ʻana i ka papahana TShark.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka