Su'esu'e le afi Mediastreamer2 VoIP. Vaega 6

O mea o le tusiga e maua mai i laʻu zen alavai.

Tuuina atu o se faailo leo e ala i le RTP stream

Su'esu'e le afi Mediastreamer2 VoIP. Vaega 6

I le mulimuli tusiga Ua matou fa'aputuina se ta'amilosaga mamao e fa'atonutonu mai se fa'aola leo ma se fa'ailoga leo o lo'o galue i totonu o le polokalame lava e tasi. I lenei tusiga o le a tatou aʻoaʻoina pe faʻapefea ona faʻaogaina le RTP protocol (RFC 3550 - RTP: Ose Felauaiga Fe'avea'i mo Taimi Moni Taimi) mo le mauaina/fa'asalalauina o se fa'ailoga leo i luga ole feso'ota'iga Ethernet.

RTP protocol (Polokalama Taimi Moni) fa'aliliuina o lona uiga o le taimi moni, e fa'aaogaina e tu'uina atu le leo, vitio, fa'amaumauga, mea uma e mana'omia ai le fa'asalalauga i le taimi moni. Se'i fai se fa'ailo fa'alogo e fai ma fa'ata'ita'iga. O le fetuutuuna'i o le protocol e fa'ataga e mafai ai ona e fa'asalalauina se fa'ailo fa'alogo ma se tulaga lelei na fa'atonuina.

O le fa'asalalauga o lo'o fa'atinoina i le fa'aaogaina o pa'u UDP, o lona uiga o le gau o le pa'u e talia lelei a'o fa'asalalau atu. O pusa taʻitasi o loʻo i ai se ulutala RTP faʻapitoa ma se poloka faʻamaumauga o le faʻailoga faʻasalalau. O le ulutala o loʻo i ai se faʻamatalaga faʻailoga e filifilia faʻafuaseʻi, faʻamatalaga e uiga i le ituaiga o faʻailoga o loʻo tuʻuina atu, ma se numera faʻasologa tulaga ese ina ia mafai ai ona faʻatulagaina pepa i le faasologa saʻo pe a faʻavasegaina, e tusa lava po o le a le faasologa na tuʻuina atu e le feso'ota'iga. O le ulutala e mafai foi ona aofia ai faʻamatalaga faaopoopo, o le mea e taʻua o le faʻaopoopoga, lea e mafai ai ona faʻafetaui le ulutala mo le faʻaaogaina i se galuega faʻapitoa.

O le poloka faʻamatalaga o loʻo i ai le uta o le afifi. O le faʻalapotopotoga i totonu o le anotusi e faʻalagolago i le ituaiga o uta, e mafai ona avea ma faʻataʻitaʻiga o se faʻailoga mono, faʻailoga leo, laina ata vitio, ma isi.

O le ituaiga o uta o loʻo faʻaalia e se numera fitu-bit. Fautuaga RFC3551 (Fa'amatalaga RTP mo Konafesi Leo ma Vitio ma le Pule Laiti) fa'atūina le tele o ituaiga o uta; o le laulau tutusa o lo'o tu'uina mai ai se fa'amatalaga o ituaiga o uta ma le uiga o tulafono laiti e fa'asino ai. O nisi tulafono laiti e le o matua'i noatia i so'o se ituaiga o uta; e mafai ona fa'aogaina e fa'ailoa ai se uta fa'aletonu.

Ole tele ole poloka fa'amaumauga e fa'atapula'aina i luga e le maualuga o le pa'u e mafai ona tu'uina atu ile feso'ota'iga tu'ufa'atasia e aunoa ma se fa'avasegaga (MTU parameter). I se tulaga lautele, e le sili atu i le 1500 bytes. O le mea lea, ina ia faʻateleina le aofaʻi o faʻamatalaga e tuʻuina atu i le sekone, e mafai ona e faʻateleina le tele o le afifi i se tulaga patino, ona e manaʻomia lea e faʻateleina le tele o le lafoina o pepa. I totonu o se fa'asalalauga fa'asalalau, o se fa'atulagaina lea. E ala i le faaletonu o le 50 Hz, i.e. 50 pepa i le sekone. Matou te taʻua le faʻasologa o pusa RTP faʻasalalau o se RTP stream.

Ina ia amata faʻasalalau faʻamatalaga i le va o le punavai ma le tagata e taliaina, ua lava le iloa e le transmitter le tuatusi IP o le tagata e taliaina ma le numera o le taulaga e faʻaaogaina mo le mauaina. O na. e aunoa ma ni faʻataʻitaʻiga muamua, o le puna e amata ona tuʻuina atu faʻamatalaga, ma o le tagata e taliaina, i le isi itu, ua sauni e vave maua ma faʻatautaia. E tusa ai ma le faʻataʻitaʻiga, o le numera o le taulaga e faʻaaogaina pe maua ai se vaitafe RTP e tatau ona tutusa.

I tulaga e le mafai ai ona iloa muamua le tuatusi o le tagata e taliaina, e faʻaaogaina 'auʻaunaga pe a tuʻuina atu e le au faʻasalalau a latou tuatusi, ma e mafai e le transmitter ona talosagaina e ala i le faʻasino i se igoa tulaga ese o le tagata e taliaina.

I tulaga e le o iloa ai le lelei o le auala fesoʻotaʻiga poʻo le gafatia o le tagata e taliaina, ua faʻatulagaina se auala faʻaalia e mafai ai e le tagata faʻasalalau ona logoina le transmitter e uiga i ona gafatia, numera o pepa na misia, ma isi. O le ala lea e fa'aogaina ai le RTCP protocol. O le faʻatulagaina o paʻu faʻasalalau i totonu o lenei alalaupapa o loʻo faʻamatalaina i le RFC 3605. E laʻititi faʻamaumauga e tuʻuina atu i luga o lenei auala, 200..300 bytes i le sekone, o lona uiga lautele, o lona i ai e le mamafa. O le numera o le taulaga e lafo i ai le RTCP e tatau ona ese ma le tasi e sili atu nai lo le numera o le taulaga lea e sau ai le RTP stream. I la matou faʻataʻitaʻiga, matou te le faʻaogaina lenei auala, talu ai o le gafatia o le tagata e taliaina ma le alalaupapa e mautinoa lava e sili atu nai lo o tatou manaʻoga.

I la matou polokalame, o le faʻasalalauga faʻasalalau faʻamatalaga, e le pei o le faʻataʻitaʻiga muamua, o le a vaevaeina i ni vaega se lua: o se auala faʻasalalau ma se auala e maua ai. Mo vaega taitasi o le a tatou faia a tatou lava puna uati, e pei ona faaalia i le ulutala ata.

O fesoʻotaʻiga tasi-auala i le va oi latou o le a faia e faʻaaoga ai le RTP protocol. I lenei faʻataʻitaʻiga, matou te le manaʻomia se fesoʻotaʻiga i fafo, talu ai o le transmitter ma le receiver o le a tuʻu i luga o le komepiuta lava e tasi - o le a faimalaga i totonu.

Ina ia fa'atuina se RTP stream, e fa'aogaina e le fa'asalalauga fa'asalalauga ni filiga se lua: MS_RTP_SEND ma le MS_RTP_RECV. O le mea muamua e tuʻuina atu le lona lua ma maua le RTP stream. Ina ia mafai ona galue nei filiga, latou te manaʻomia le tuʻuina atu o se faʻailoga i se mea faʻaoga RTP, lea e mafai ona faʻaliliuina se vaitafe o poloka faʻamaumauga i totonu o se vaitafe o paʻu RTP pe fai le faʻafeagai. Talu ai ona o le faʻatulagaina o faʻamaumauga i totonu o le alalaupapa faʻasalalau e le fetaui ma le faʻasologa o faʻamaumauga o le RTP packet, aʻo leʻi tuʻuina atu faʻamatalaga i MS_RTP_SEND, e tatau ona e faʻaogaina se faamama encoder e faʻaliliuina ai faʻataʻitaʻiga leo leo 16-bit i le valu-bit faʻapipiʻiina e tusa ai ma le u-tulafono (mu-law). I le itu e maua ai, o le faamama decoder e faia le galuega faafeagai.

O loʻo i lalo le tusiga o le polokalame o loʻo faʻatinoina le polokalame o loʻo faʻaalia i le ata (o le # faʻailoga aʻo leʻi tuʻuina atu faʻatonuga e aofia ai, aua nei galo e aofia ai):

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

Matou te tuufaatasia ma tamomoe. O le polokalame o le a galue e pei o le faʻataʻitaʻiga muamua, ae o faʻamatalaga o le a tuʻuina atu e ala i le RTP stream.

I le isi mataupu o le a tatou vaevaeina lenei polokalame i ni talosaga tutoatasi se lua - o se tagata e taliaina ma se transmitter ma fa'alauiloa i latou i laina eseese. I le taimi lava e tasi, o le a tatou aʻoaʻoina pe faʻafefea ona faʻavasega RTP paʻu e faʻaaoga ai le TShark polokalame.

puna: www.habr.com

Faaopoopo i ai se faamatalaga