Ịchọgharị igwe Mediastreamer2 VoIP. Nkeji 9

A na-ewepụta ihe nke isiokwu ahụ site na nke m zen ọwa.

Duplex intercom

Ịchọgharị igwe Mediastreamer2 VoIP. Nkeji 9

Na nke ikpeazu ederede a mara ọkwa intercom duplex, na nke a anyị ga-eme ya.

Egosiri eserese a n'onu aha aha. Igwe nzacha dị ala na-etolite ụzọ nnyefe, nke na-amalite site na kaadị ụda. Ọ na-enye nlele mgbama sitere na igwe okwu. Site na ndabara, nke a na-eme na ọnụego 8000 sample kwa nkeji. Omimi bit data nke mgbasa ozi streamer audio nzacha ji bụ 16 ibe n'ibe (nke a adịghị mkpa; ọ bụrụ na-ịchọrọ, ị nwere ike dee nzacha ga-arụ ọrụ na a elu bit omimi). A na-achịkọta data ahụ n'ime ngọngọ nke ihe nlele 160. Ya mere, ngọngọ nke ọ bụla bụ 320 bytes n'ogo. Na-esote, anyị na-enye data na ntinye nke generator, nke, mgbe agbanyụrụ, bụ "ụzọ" na data. M gbakwunyere ya ma ọ bụrụ na ike gwụ gị ikwu okwu n'ime igwe okwu n'oge nrụpụta - ị nwere ike iji igwe na-emepụta ihe were akara ụda were "gbaa" ụzọ.

Mgbe onye na-emepụta ọkụ gachara, mgbama ahụ na-aga na encoder, nke na-atụgharị ihe nlele 16-bit anyị dị ka μ-law (ụkpụrụ G.711) ka ọ bụrụ asatọ-bit. Na mmepụta nke encoder, anyị enweelarị ngọngọ data ọkara nke nha. N'ozuzu, anyị nwere ike ịnyefe data na-enweghị mkpakọ ma ọ bụrụ na anyị achọghị ịchekwa okporo ụzọ. Mana ebe a ọ bara uru iji ihe ngbanwe, ebe Wireshark nwere ike imepụtagharị ọdịyo sitere na iyi RTP naanị mgbe etinyere ya dịka µ-law ma ọ bụ iwu iwu siri dị.

Mgbe encoder ahụ gasịrị, a na-ezigara data dị ọkụ na nzacha rtpsend, nke ga-etinye ha na ngwugwu RTP, debe ọkọlọtọ ndị dị mkpa ma nye ya na mgbasa ozi mgbasa ozi maka nnyefe na netwọk n'ụdị ngwugwu UDP.

Ihe nzacha nke elu na-etolite ụzọ nnata; ngwugwu RTP nke ndị mgbasa ozi na-enweta site na netwọkụ ahụ na-abanye nzacha rtprecv, na mmepụta nke ha na-apụta n'ụdị ngọngọ data, nke ọ bụla dabara na ngwugwu natara. Ihe mgbochi ahụ nwere naanị data ịkwụ ụgwọ; n'isiokwu gara aga, egosiri ha na akwụkwọ ndụ akwụkwọ ndụ na ihe atụ.

Na-esote, a na-eziga ihe mgbochi ndị ahụ na nzacha decoder, nke na-agbanwe ihe nlele otu-byte dị n'ime ha n'ime linear, 16-bit. Nke enwere ike ịhazi ya site na nzacha mgbasa ozi iyi. N'ọnọdụ anyị, anyị na-eziga ha na kaadị ụda maka ịkpọghachi na ndị na-ekwu okwu nke ekweisi gị.

Ugbu a, ka anyị gaa n'ihu na mmejuputa software. Iji mee nke a, anyị ga-ejikọta faịlụ nnata na nnyefe nke anyị kewapụrụ na mbụ. Tupu nke a, anyị na-eji ntọala edozi maka ọdụ ụgbọ mmiri na adreesị, ma ugbu a, anyị chọrọ mmemme iji nwee ike iji ntọala ndị anyị na-akọwapụta na mmalite. Iji mee nke a, anyị ga-agbakwunye ọrụ maka ịhazi arụmụka ahịrị iwu. Mgbe nke a gasịrị, anyị ga-enwe ike ịtọ adreesị IP na ọdụ ụgbọ mmiri nke intercom nke anyị chọrọ iji guzobe njikọ.

Nke mbụ, ka anyị tinye usoro na mmemme nke ga-echekwa ntọala ya:

struct _app_vars
{
  int  local_port;              /* Локальный порт. */
  int  remote_port;             /* Порт переговорного устройства на удаленном компьютере. */
  char remote_addr[128];        /* IP-адрес удаленного компьютера. */
  MSDtmfGenCustomTone dtmf_cfg; /* Настройки тестового сигнала генератора. */
};

typedef struct _app_vars app_vars;

Mmemme ga-ekwupụta usoro nke ụdị a a na-akpọ vars.
Na-esote, ka anyị gbakwunye ọrụ iji kpachapụta arụmụka ahịrị iwu:

/* Функция преобразования аргументов командной строки в
* настройки программы. */
void  scan_args(int argc, char *argv[], app_vars *v)
{
    char i;
    for (i=0; i<argc; i++)
    {
        if (!strcmp(argv[i], "--help"))
        {
            char *p=argv[0]; p=p + 2;
            printf("  %s walkie talkienn", p);
            printf("--help      List of options.n");
            printf("--version   Version of application.n");
            printf("--addr      Remote abonent IP address string.n");
            printf("--port      Remote abonent port number.n");
            printf("--lport     Local port number.n");
            printf("--gen       Generator frequency.n");
            exit(0);
        }

        if (!strcmp(argv[i], "--version"))
        {
            printf("0.1n");
            exit(0);
        }

        if (!strcmp(argv[i], "--addr"))
        {
            strncpy(v->remote_addr, argv[i+1], 16);
            v->remote_addr[16]=0;
            printf("remote addr: %sn", v->remote_addr);
        }

        if (!strcmp(argv[i], "--port"))
        {
            v->remote_port=atoi(argv[i+1]);
            printf("remote port: %in", v->remote_port);
        }

        if (!strcmp(argv[i], "--lport"))
        {
            v->local_port=atoi(argv[i+1]);
            printf("local port : %in", v->local_port);
        }

        if (!strcmp(argv[i], "--gen"))
        {
            v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
                printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
        }
    }
}

N'ihi ntule, a ga-etinye arụmụka ahịrị iwu n'ọhịa nke usoro vars. Isi ọrụ nke ngwa a ga-abụ ịnakọta nnyefe na ịnata ụzọ site na nzacha; mgbe ejikọtara akara ahụ, a ga-ebufe njikwa na akaghị ngwụcha nke, ọ bụrụ na edobere ugboro generator ka ọ bụrụ nke na-abụghị efu, ga-amalitegharị generator nke na-eme nnwale. ọ na-arụ ọrụ na-enweghị nkwụsị.

Generator ga-achọ ịmalitegharị ndị a n'ihi imewe ya; n'ihi ihe ụfọdụ ọ pụghị ịmepụta mgbaàmà na-adịgide karịa 16 sekọnd. Ekwesiri iburu n'uche na a na-akọwa oge ya site na nọmba 32-bit.

Mmemme niile ga-adị ka nke a:

/* Файл mstest8.c Имитатор переговорного устройства. */

#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>

/* Подключаем файл общих функций. */
#include "mstest_common.c"

/*----------------------------------------------------------*/
struct _app_vars
{
    int  local_port;              /* Локальный порт. */
    int  remote_port;             /* Порт переговорного устройства на удаленном компьютере. */
    char remote_addr[128];        /* IP-адрес удаленного компьютера. */
    MSDtmfGenCustomTone dtmf_cfg; /* Настройки тестового сигнала генератора. */
};

typedef struct _app_vars app_vars;

/*----------------------------------------------------------*/
/* Создаем дуплексную RTP-сессию. */
RtpSession* create_duplex_rtp_session(app_vars v)
{
    RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1, FALSE, RTP_SESSION_SENDRECV);
    rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port, v.remote_port + 1);
    rtp_session_set_send_payload_type(session, PCMU);
    return session;
}

/*----------------------------------------------------------*/
/* Функция преобразования аргументов командной строки в
* настройки программы. */
void  scan_args(int argc, char *argv[], app_vars *v)
{
    char i;
    for (i=0; i<argc; i++)
    {
        if (!strcmp(argv[i], "--help"))
        {
            char *p=argv[0]; p=p + 2;
            printf("  %s walkie talkienn", p);
            printf("--help      List of options.n");
            printf("--version   Version of application.n");
            printf("--addr      Remote abonent IP address string.n");
            printf("--port      Remote abonent port number.n");
            printf("--lport     Local port number.n");
            printf("--gen       Generator frequency.n");
            exit(0);
        }

        if (!strcmp(argv[i], "--version"))
        {
            printf("0.1n");
            exit(0);
        }

        if (!strcmp(argv[i], "--addr"))
        {
            strncpy(v->remote_addr, argv[i+1], 16);
            v->remote_addr[16]=0;
            printf("remote addr: %sn", v->remote_addr);
        }

        if (!strcmp(argv[i], "--port"))
        {
            v->remote_port=atoi(argv[i+1]);
            printf("remote port: %in", v->remote_port);
        }

        if (!strcmp(argv[i], "--lport"))
        {
            v->local_port=atoi(argv[i+1]);
            printf("local port : %in", v->local_port);
        }

        if (!strcmp(argv[i], "--gen"))
        {
            v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
                printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
        }
    }
}

/*----------------------------------------------------------*/
int main(int argc, char *argv[])
{
    /* Устанавливаем настройки по умолчанию. */
    app_vars vars={5004, 7010, "127.0.0.1", {0}};

    /* Устанавливаем настройки настройки программы в
     * соответствии с аргументами командной строки. */
    scan_args(argc, argv, &vars);

    ms_init();

    /* Создаем экземпляры фильтров передающего тракта. */
    MSSndCard *snd_card =
        ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);
    MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
    MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);

    /* Создаем фильтр кодера. */
    MSFilter *encoder = ms_filter_create_encoder("PCMU");

    /* Регистрируем типы нагрузки. */
    register_payloads();

    /* Создаем дуплексную RTP-сессию. */
    RtpSession* rtp_session= create_duplex_rtp_session(vars);
    ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);

    /* Соединяем фильтры передатчика. */
    ms_filter_link(snd_card_read, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, encoder, 0);
    ms_filter_link(encoder, 0, rtpsend, 0);

    /* Создаем фильтры приемного тракта. */
    MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
    ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);

    /* Создаем фильтр декодера, */
    MSFilter *decoder=ms_filter_create_decoder("PCMU");

    /* Создаем фильтр звуковой карты. */
    MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);

    /* Соединяем фильтры приёмного тракта. */
    ms_filter_link(rtprecv, 0, decoder, 0);
    ms_filter_link(decoder, 0,  snd_card_write, 0);

    /* Создаем источник тактов - тикер. */
    MSTicker *ticker = ms_ticker_new();

    /* Подключаем источник тактов. */
    ms_ticker_attach(ticker, snd_card_read);
    ms_ticker_attach(ticker, rtprecv);

    /* Если настройка частоты генератора отлична от нуля, то запускаем генератор. */   
    if (vars.dtmf_cfg.frequencies[0])
    {
        /* Настраиваем структуру, управляющую выходным сигналом генератора. */
        vars.dtmf_cfg.duration = 10000;
        vars.dtmf_cfg.amplitude = 1.0;
    }

    /* Организуем цикл перезапуска генератора. */
    while(TRUE)
    {
        if(vars.dtmf_cfg.frequencies[0])
        {
            /* Включаем звуковой генератор. */
            ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
                    (void*)&vars.dtmf_cfg);
        }
        /* Укладываем тред в спячку на 20мс, чтобы другие треды
         * приложения получили время на работу. */
        ms_usleep(20000);
    }
}

Ka anyị chịkọta. Mgbe ahụ mmemme nwere ike na-agba ọsọ na abụọ na kọmputa. Ma ọ bụ na otu, dị ka m ga-eme ugbu a. Anyị ji arụmụka ndị a malite TShark:

$ sudo tshark -i lo -f "udp dst port 7010" -P -V -O RTP -o rtp.heuristic_rtp:TRUE -x

Ọ bụrụ na oghere mmalite dị na njikwa ahụ na-egosiputa ozi banyere mmalite nke ijide, mgbe ahụ nke a bụ ezigbo akara - ọ pụtara na ọdụ ụgbọ mmiri anyị yikarịrị ka ọ bụghị mmemme ndị ọzọ. N'ọnụ ụzọ ọzọ, anyị na-ebupụta ihe atụ mmemme nke ga-eme ka intercom "remote" site na ịkọwa nọmba ọdụ ụgbọ mmiri a:

$ ./mstest8 --port 9010 --lport 7010

Dịka enwere ike ịhụ site na ederede mmemme, adreesị IP nke ndabara bụ 127.0.0.1 (loopback mpaghara).

N'ọnụ ụzọ ọzọ, anyị na-amalite usoro ihe omume nke abụọ, nke na-eme ka ngwaọrụ mpaghara. Anyị na-eji arụmụka agbakwunyere nke na-enye ohere ka generator ule arụnyere arụ ọrụ:

$ ./mstest8  --port 7010 --lport 9010 --gen 440

N'oge a, ngwugwu na-ebufe gaa na ngwaọrụ "nke dịpụrụ adịpụ" kwesịrị ịmalite ịmalite na njikwa na TShark, a ga-anụkwa ụda na-aga n'ihu site na ọkà okwu kọmputa.

Ọ bụrụ na ihe niile mere dị ka e dere, mgbe ahụ anyị na-amaliteghachi nke abụọ oyiri nke mmemme, ma na-enweghị isi na arụmụka "- gen 440". Ị ga-egwu ugbu a ọrụ nke generator. Mgbe nke a gasịrị, ị nwere ike ime mkpọtụ n'ime igwe okwu; ị ga-anụ ụda kwekọrọ na igwe okwu ma ọ bụ ekweisi. Mkpali onwe onye nke Acoustic nwere ike ime; gbadaa olu okwu, mmetụta ya ga-apụ n'anya.

Ọ bụrụ na ị na-agba ya na kọmputa abụọ ma ghara inwe mgbagwoju anya banyere adreesị IP, mgbe ahụ otu nsonaazụ ahụ na-echere gị - nkwurịta okwu ụda olu dijitalụ ụzọ abụọ.

N'isiokwu na-esonụ, anyị ga-amụta otú e si dee anyị onwe anyị nzacha - plugins, ekele a nkà ị ga-enwe ike iji media streamer ọ bụghị nanị maka ọdịyo na video, kamakwa na ụfọdụ ndị ọzọ kpọmkwem ebe.

isi: www.habr.com

Tinye a comment