Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 9

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

Duplex intercom

Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 9

Thaum kawg Tshooj lub duplex intercom tau tshaj tawm, thiab hauv qhov no peb yuav ua nws.

Daim duab qhia hauv daim duab npe. Cov saw qis ntawm cov lim dej ua rau txoj kev sib kis, uas pib los ntawm daim npav suab. Nws muab cov qauv teeb liab los ntawm lub microphone. Los ntawm lub neej ntawd, qhov no tshwm sim ntawm tus nqi ntawm 8000 tus qauv ib ob. Cov ntaub ntawv me ntsis qhov tob uas media streamer suab lim siv yog 16 khoom (qhov no tsis tseem ceeb; yog tias koj xav tau, koj tuaj yeem sau cov ntxaij lim dej uas yuav ua haujlwm nrog qhov tob me ntsis). Cov ntaub ntawv tau muab faib ua pawg ntawm 160 cov qauv. Yog li, txhua qhov thaiv yog 320 bytes loj. Tom ntej no, peb pub cov ntaub ntawv rau cov tswv yim ntawm lub tshuab hluav taws xob, uas, thaum muab tua, yog "pob tshab" rau cov ntaub ntawv. Kuv ntxiv nws yog tias koj nkees ntawm kev hais lus rau hauv lub microphone thaum lub sijhawm debugging - koj tuaj yeem siv lub tshuab hluav taws xob los "tua" txoj hauv kev nrog lub suab nrov.

Tom qab lub tshuab hluav taws xob, lub teeb liab mus rau lub encoder, uas hloov peb cov qauv 16-ntsis raws li µ-txoj cai (G.711 tus qauv) rau hauv yim-ntsis sawv daws yuav. Ntawm qhov tso zis ntawm tus encoder, peb twb muaj cov ntaub ntawv thaiv ib nrab ntawm qhov loj me. Feem ntau, peb tuaj yeem xa cov ntaub ntawv tsis muaj compression yog tias peb tsis tas yuav txuag tsheb. Tab sis ntawm no nws muaj txiaj ntsig zoo los siv tus encoder, txij li Wireshark tuaj yeem tsim tawm suab los ntawm RTP kwj tsuas yog thaum nws tau compressed raws li µ-txoj cai lossis txoj cai lij choj.

Tom qab lub encoder, cov ntaub ntawv sib zog yuav raug xa mus rau lub lim rtpsend, uas yuav muab tso rau hauv ib pob ntawv RTP, teeb tsa cov chij tsim nyog thiab muab lawv rau cov xov xwm streamer rau kev sib kis hauv lub network hauv daim ntawv ntawm UDP pob ntawv.

Cov saw hlau sab saud ntawm cov lim dej tsim txoj hauv kev tau txais; RTP pob ntawv tau txais los ntawm cov xov xwm streamer los ntawm lub network nkag mus rau rtprecv lim, ntawm cov zis uas lawv tshwm sim hauv daim ntawv ntawm cov ntaub ntawv thaiv, txhua qhov sib raug rau ib pob ntawv tau txais. Lub thaiv tsuas muaj cov ntaub ntawv them nyiaj xwb; nyob rau hauv tsab xov xwm dhau los lawv tau pom hauv ntsuab hauv cov lus piav qhia.

Tom ntej no, cov blocks raug xa mus rau lub decoder lim, uas hloov cov qauv ib-byte uas muaj nyob rau hauv lawv mus rau hauv linear, 16-ntsis sawv daws yuav. Uas twb tau ua tiav los ntawm media streamer lim. Hauv peb cov ntaub ntawv, peb tsuas yog xa lawv mus rau daim npav suab rau kev ua si ntawm cov neeg hais lus ntawm koj lub mloog pob ntseg.

Tam sim no cia peb mus rau kev siv software. Ua li no, peb yuav muab cov ntaub ntawv txais thiab transmitter uas peb tau sib cais ua ntej. Ua ntej qhov no, peb tau siv cov chaw ruaj khov rau cov chaw nres nkoj thiab chaw nyob, tab sis tam sim no peb xav tau qhov kev pab cuam kom siv tau cov chaw uas peb teev thaum pib. Txhawm rau ua qhov no, peb yuav ntxiv kev ua haujlwm rau kev ua cov kab lus hais kom ua. Tom qab ntawd peb yuav tuaj yeem teeb tsa tus IP chaw nyob thiab chaw nres nkoj ntawm intercom uas peb xav tsim kom muaj kev sib txuas.

Ua ntej, cia peb ntxiv cov qauv rau qhov program uas yuav khaws nws cov chaw:

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

typedef struct _app_vars app_vars;

Qhov kev zov me nyuam yuav tshaj tawm cov qauv ntawm hom no hu ua vars.
Tom ntej no, cia peb ntxiv ib txoj haujlwm los txheeb xyuas kab lus sib cav:

/* Функция преобразования аргументов командной строки в
* настройки программы. */
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]);
        }
    }
}

Raws li qhov tshwm sim ntawm parsing, cov lus txib kab lus sib cav yuav muab tso rau hauv cov teb ntawm cov qauv vars. Lub luag haujlwm tseem ceeb ntawm daim ntawv thov yuav yog khaws cov xa tawm thiab tau txais txoj hauv kev los ntawm cov ntxaij lim dej; tom qab txuas lub ticker, kev tswj hwm yuav raug xa mus rau lub voj tsis kawg uas, yog tias lub tshuab hluav taws xob zaus tau teeb tsa rau tsis yog xoom, yuav rov pib lub tshuab hluav taws xob sim kom thiaj li. nws ua haujlwm tsis nres.

Lub tshuab hluav taws xob yuav xav tau cov kev rov pib dua no vim nws tsim; rau qee qhov nws tsis tuaj yeem tsim lub teeb liab ntev dua 16 vib nas this. Nws yuav tsum raug sau tseg tias nws lub sijhawm tau teev tseg los ntawm tus lej 32-ntsis.

Tag nrho cov kev pab cuam yuav zoo li no:

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

Cia peb muab tso ua ke. Tom qab ntawd qhov kev zov me nyuam tuaj yeem khiav ntawm ob lub khoos phis tawj. Los yog ntawm ib qho, raws li kuv yuav ua tam sim no. Peb tso TShark nrog cov lus sib cav hauv qab no:

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

Yog tias qhov chaw tso tawm hauv lub console tsuas yog qhia cov lus hais txog qhov pib ntawm kev ntes, ces qhov no yog qhov cim zoo - nws txhais tau tias peb qhov chaw nres nkoj feem ntau yuav tsis nyob ntawm lwm cov kev pab cuam. Hauv lwm lub davhlau ya nyob twg, peb tso ib qho kev pab cuam uas yuav simulate "chaw taws teeb" intercom los ntawm kev qhia tus lej chaw nres nkoj no:

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

Raws li tuaj yeem pom los ntawm cov ntawv nyeem, lub neej ntawd IP chaw nyob yog 127.0.0.1 (local loopback).

Hauv lwm lub davhlau ya nyob twg, peb tso ib qho piv txwv thib ob ntawm qhov kev pab cuam, uas simulates ib qho khoom siv hauv zos. Peb siv ib qho kev sib cav ntxiv uas tso cai rau lub tshuab hluav taws xob tsim ua haujlwm ua haujlwm:

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

Lub sijhawm no, cov pob ntawv xa mus rau "chaw taws teeb" ntaus ntawv yuav tsum pib nyem hauv lub console nrog TShark, thiab lub suab nrov txuas ntxiv yuav hnov ​​​​los ntawm lub computer hais lus.

Yog tias txhua yam tshwm sim raws li tau sau tseg, ces peb rov pib dua daim ntawv thib ob ntawm qhov program, tab sis tsis muaj tus yuam sij thiab kev sib cav "-gen 440". Tam sim no koj yuav ua lub luag haujlwm ntawm lub tshuab hluav taws xob. Tom qab ntawd, koj tuaj yeem ua suab nrov rau hauv lub microphone; koj yuav tsum hnov ​​lub suab sib xws hauv tus hais lus lossis lub mloog pob ntseg. Acoustic self-excitation tej zaum yuav tshwm sim; tso tseg lub ntim hais lus thiab cov nyhuv yuav ploj mus.

Yog tias koj khiav nws ntawm ob lub khoos phis tawj thiab tsis tau tsis meej pem txog IP chaw nyob, ces qhov tshwm sim tib yam tos koj - ob txoj kev sib txuas lus digital zoo.

Nyob rau hauv tsab xov xwm tom ntej no peb yuav kawm yuav ua li cas sau peb tus kheej cov ntxaij lim dej - plugins, ua tsaug rau qhov kev txawj no koj yuav siv tau cov xov xwm streamer tsis yog rau lub suab thiab yees duab, tab sis kuj nyob rau hauv ib co lwm yam kev.

Tau qhov twg los: www.hab.com

Ntxiv ib saib