Ուսումնասիրում ենք VoIP-շարժիչ Mediastreamer2: 1-ին մասը

Աստղի նյութերը վերցված են իմ Dzен-ալիք.

Ներածություն

Այս հոդվածը սկսում է հոդվածների շարք, որը վերաբերում է իրական ժամանակի մեդիա տվյալների մշակմանը Mediastreamer2 շարժիչի միջոցով: Ներկայացման ընթացքում անհրաժեշտ կլինի նվազագույն գիտելիքներ Linux տերմինալում աշխատելու և C լեզվում ծրագրավորման առումով:

Mediastreamer2-ը VoIP շարժիչ է, որը հիմք է ծառայում հայտնի բաց աղբյուրի VoIP հեռախոս ծրագրին: Linphone. Linphone-ում Mediastreamer2-ն իրականացնում է ձայնի և տեսանյութի հետ կապված բոլոր գործառույթները: Շարժիչի հնարավորությունների մանրամասն ցանկը կարելի է տեսնել այս Mediastreamer էջում: Որպեսզի ավելի հեշտ լինի, ծածկագիրն այստեղ է: GitLab.

Այնուհետև փաստաթղթում Mediastreamer2-ի փոխարեն օգտագործելու ենք նրա ռուսական անվանումը՝ «մեդիաստիմեր»:

Հիմնավորումը նրա ստեղծման մասին միանշանակ չէ, սակայն, նրա ծածկագրից դատելով, այն նախկինում օգտագործում էր Glib, ինչը մի քանի հավատում է նրա հնարավոր երկար ծագմանը GStreamer-ի նկատմամբ: Համեմատաբար, մեդիաստիմերը ավելի թեթև է նայում: Linphone-ի առաջին տարբերակը հրապարակվել է 2001 թվականին, այնպես որ այս պահին մեդիաստիմերը գրեթե 20 տարի գոյություն ունի և զարգանում է:

Մեդիաստիմերի հիմքում նկարված է «Data flow» (արդյունքների հոսք) ճարտարապետությունը: Նաև ներքո նկարում ներկայացված է նման ճարտարապետության օրինակը:

Ուսումնասիրում ենք VoIP-շարժիչ Mediastreamer2: 1-ին մասը

Այս ճարտարապետությունում տվյալների մշակման ալգորիթմը սահմանափակվում է ոչ թե ծրագրային կոդով, այլ գործառույթների կցումների սխեմայով (կաչ ժամանակավոր ժամանակին). Այս գործառույթները կոչվում են ֆիլտրեր:

Ահավասիկ, նման ճարտարապետությունը հնարավորություն է տալիս մեդիա մշակման ֆունկցիոնալը իրականացնել ֆիլտրերի հավաքածուով, որոնք կապվում են մշակման և VoIP հեռախոսի RTP-ճանապարհի փոխանցման սխեմայի մեջ:

Ֆիլտրերը մասնավոր սխեմաներում միացնելու հնարավորությունը, նոր ֆիլտրերի հեշտ մշակումը, մեդիաստիմերի իրականացման հնարավորությունը որպես ինքնուրույն, առանձին գրադարան, թույլ է տալիս նրան օգտագործել նաև այլ նախագծերում: Խնդիրն այն է, որ նախագիծը կարող է լինել VoIP ոլորտում, որովհետև կա հնարավորությունը ձեռք բերել ինքնագործված ֆիլտրեր:

Առձեռն մատակարարվող ֆիլտրերի գրադարանն բավականին հարուստ է, ինչպես արդեն ասվեց, վերաձեռնված ֆիլտրերով կարող է ընդլայնվել: Սակայն սկզբում նկարագրենք այն պատրաստած ֆիլտրերը, որոնք մատակարարվում են մեդիաստիմերի հետ: Ահա դրանց ցանկը:

Ձայնային ֆիլտրեր

Ձայնի բռնում և վերարտադրում

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android native sound (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Audio Queue Service (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Audio Unit Service (Mac OS X)
  • Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Պահոց երկրի բոլոր ֆայլերի (raw/wav/pcap ֆայլեր) վերարտադրիչ (Linux): MS_FILE_PLAYER
  • Պահոց երկրի բոլոր ֆայլերի (raw/wav ֆայլեր) վերարտադրիչ (Windows): MS_WINSND_READ
  • Ռեգիստրված ֆայլը (wav ֆայլեր) (Linux): MS_FILE_REC
  • Ռեգիստրված ֆայլը (wav ֆայլեր) (Windows): MS_WINSND_WRITE
  • Mac Audio Unit (Mac OS X)
  • MME (Windows)
  • OSS (Linux): MS_OSS_WRITE, MS_OSS_READ
  • PortAudio (Mac OS X)
  • PulseAudio (Linux): MS_PULSE_WRITE, MS_PULSE_READ
  • Windows Sound (Windows)

Ձայնի սեղմում/անտեսում

  • G.711 a-закон: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-закон: MS_ULAW_DEC, MS_ULAW_ENC
  • G.722: MS_G722_DEC, MS_G722_ENC
  • G.726: MS_G726_32_ENC, MS_G726_24_ENC, MS_G726_16_ENC
  • GSM: MS_GSM_DEC, MS_GSM_ENC
  • Նրանցիկ ԻՔՄ: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Ակուստիկայի մշակում

  • Նշանափոխության վերափոխում (մոնո->ստերեո, ստերեո->մոնո): MS_CHANNEL_ADAPTER
  • Հաստատություն: MS_CONF
  • DTMF զարմանալի ապարատ: MS_DTMF_GEN
  • Էխոյի ճնշում (speex): MS_SPEEX_EC
  • Էքվալայզեր: MS_EQUALIZER
  • Միքսեր: MS_MIXER
  • Փաթեթների կորուստի փոխարինիչ (PLC): MS_GENERIC_PLC
  • Վերադասիչ: MS_RESAMPLE
  • Տոների դետեկտոր: MS_TONE_DETECTOR
  • Ակոստիկայի կարգավորում և ազդանշանի մակարդակի չափում: MS_VOLUME

Տեսանի միջերեսներ

Տեսանի գրառում և վերընթերցում

  • Android գրառում
  • Android վերընթերցում
  • AV Foundation գրառում (iOS)
  • AV Foundation վերընթերցում (iOS)
  • DirectShow գրառում (Windows)
  • DrawDib վերընթերցում (Windows)
  • External վերընթերցում — Տեսանի գցելը վերևի մակարդակին
  • GLX վերընթերցում (Linux): MS_GLXVIDEO
  • Mire — Սինթետիկ շարժական պատկեր: MS_MIRE
  • OpenGL վերընթերցում (Mac OS X)
  • OpenGL ES2 վերընթերցում (Android)
  • Quicktime գրառում (Mac OS X)
  • SDL վերընթերցում: MS_SDL_OUT
  • Ստատիկ պատկերների դուրսբերում: MS_STATIC_IMAGE
  • Video For Linux (V4L) գրառում (Linux): MS_V4L
  • Video For Linux 2 (V4L2) գրառում (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) գրառում (Windows)
  • Video4windows (DirectShow) գրառում (Windows CE)
  • Video For Windows (vfw) գրառում (Windows)
  • XV վերընթերցում (Linux)

Տեսանյութի կոդավորում/դեկոդավորում

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (միայն դեկոդեր): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Տեսանի մշակում

  • JPEG նկար
  • Բիրտ պատկերների ձևափոխիչ: MS_PIX_CONV
  • Նկարագծող
  • Այլ միջերեսներ
  • Տվյալների բլոկների փոխանակում թարեդների միջև: MS_ITC_SOURCE, MS_ITC_SINK
  • Բազմաթիվ մուտքերից բլոկներ միացնել մեկ ելքի վրա: MS_JOIN
  • RTP ընդունում/կատարում: MS_RTP_SEND, MS_RTP_RECV
  • Մուտքային տվյալների պատճենում բազմաթիվ ելքների: MS_TEE
  • Համաձայնեցված բեռ: MS_VOID_SINK
  • Խաղաղության աղբյուր: MS_VOID_SOURCE

Պլագիններ

Ձայնային ֆիլտրեր

  • AMR-NB կոդավորիչ/դեկոդավորիչ
  • G.729 կոդավորիչ/դեկոդավորիչ
  • iLBC կոդավորիչ/դեկոդավորիչ
  • SILK կոդավորիչ/դեկոդավորիչ

    Տեսանի միջերեսներ

  • H.264 ծրագրային կոդավորիչ
  • H.264 V4L2 կոդավորիչ/դեկոդավորիչ սարքային արագացումով

Ֆիլտրի կարճ նկարագրությունից հետո ցույց է տրվում այդ ֆիլտրի պատճենը, որը օգտագործվում է նոր օրինակ ստեղծելու համար։ Հաջորդ շարունակությունում մենք կվկայենք այս ցուցակը։

Linux Ubuntu-ի տեղադրում

Հիմա մենք կատարելու ենք մեդիասթրիմերի տեղադրումը համակարգիչը և կհավաքենք մեր առաջին հայտումը դրա հետ։

Mediastremer2 տեղադրումը համակարգիչ կամ Ubuntu-ի կառավարման տակ գտնվող վիրտուալ մեքենա չի պահանջում հատուկ հմտություններ: Այստեղից և հետո «$» խորհրդանշը ցույց է տալիս shell-բոլորը հրամանների սահմանում։ Հիմա, եթե դուք տեսնում եք այս խորհրդանիշը տողում, սա այն տողն է, որտեղ ցույց է տրված կատարելու հրամանները տերմինալում:

Կ ողջունեցվում է, որ այս հոդվածում նկարագրված գործողություններ կատարվում են, ձեր համակարգիչը պետք է լինի ինտերնետի հասանելիություն։

libmediastremer-dev փաթեթի տեղադրում

Բացեք տերմինալը և մուտքագրեք հրամանը:

$ sudo apt-get update

Հարցվելու է փոփոխություններ կատարելու համար գաղտնաբառը, մուտքագրեք այն, և փաթեթների կառավարիչը կթարմացնի իր տվյալները։ Հետո պետք է կատարել:

$ sudo apt-get install libmediastreamer-dev

Պետք է ավտոմատ կերպով ներբեռնվեն և տեղադրվեն անհրաժեշտ կախվածության փաթեթները և ինքը մեդիասթրիմերի բաժանորդագրությունը։

Ընդհանուր չափը բեռնված deb-պակեթների կախվածությունների կազմելու համար կլինի մոտ 35 ՄԲայթ։ Ներդրված փաթեթի մանրամասները կարելի է ստանալ հետևյալ հրամանով:

$ dpkg -s libmediastreamer-dev

Որպես պատասխան:

Պակեթի անունը: libmediastreamer-dev
Կարգավիճակը: հաստատված է
优先ությունը: ցանկային
Հատված: libdevel
Հաստատված չափը: 244
Իրիրողը: Ubuntu Developers 
Արհեստ markup: amd64
Աղբյուր: linphone
Վարկած: 3.6.1-2.5
Կախվածություններ: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Նկարագրություն: Linphone-ի վեբ հեռախոսի միջավայրի գրադարան - զարգացման ֆայլեր
Linphone-ը աուդիոյի և վիդեոյի ինտերնետ հեռախոս է, որը օգտագործում է SIP արձանագիրը։
Այն ունի GTK+ և կոնսոլի միջերես, ներառում է տարբեր աուդիո և վիդեո
կոդիկներ, և ապահովում է IM հատկություններ։
.
Այս պակեթը պարունակում է մեդիա գործողություններ իրականացնելու զարգացման գրադարանը։
Առաջին փորձառուի ընտրվող նվիրատուն: Debian VoIP Team 
Տեղեկատվական էջ: http://www.linphone.org/

Անհրաժեշտ ծրագրային գործիքների տեղադրում

Տեղադրում ենք C կոմպիլյատորը և նրան համընթաց գործիքները:

$ sudo apt-get install gcc

Ստուգում ենք արդյունքը, հարցնելով կոմպիլյատորի վարկածը:

$ gcc --version

Պատասխանը պետք է լինի մոտավորապես այսպես՝

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Այս ծրագիրը ազատ է; տես աղբյուրը՝ պատճենահանման պայմանների համար։ Առկա չէ
արտոնություն; նույնիսկ ոչ առևտրային նպատակների համար:

Մոդելի կառուցում և փորձնական ծրագիրը գործարկել

Ստեղծում ենք տանը մեր ուսումների նախագծերի համար папка, անվանենք այն mstutorial:

$ mkdir ~/mstutorial

Օգտվեք ձեր սիրելի տեքստային խմբագրից և ստեղծեք C ծրագրի ֆայլը, որի անունը mstest.c հաջորդ բովանդակությամբ:

#include "stdio.h"
#include <mediastreamer2/mscommon.h>
int main()
{
  ms_init();
  printf ("Mediastreamer is ready.n");
}

Դա կատարում է մեդիա փոխանցվող միջոցի սկզբնավորման, տպում է ողջույներեն և ավարտում է իր աշխատանքը։

Պահպանեք ֆայլը և կոմպիլյացրեք փորձնական ծրագիրը հետևյալ հրամանով:

$ gcc mstest.c -o mstest `pkg-config mediastreamer --libs --cflags`

Ուշադրություն դարձրեք, որ տողը

`pkg-config mediastreamer --libs --cflags`

գտնվում է մեջ մագաղաթի մեջ, որոնք գտնվում են ձեր ստեղնաշարով նույն տեղում, որտեղ և «Ё» տառն է։

Եթե ֆայլն չունի սխալներ, ապա կոմպիլյացիայից հետո կատալոգում կհայտնվի ֆայլ mstest։ Վերագործարկենք ծրագիրը:

$ ./mstest

Արդյունքը կլինի այսպիսին՝

ALSA lib conf.c:4738:(snd_config_expand) Անհայտ պարամետրեր 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Անվավեր CTL default:0
ortp-warning-Չնայած հնարավոր չէր միացնել խառնիչը քարտին: Անվավեր փաստարկ
ALSA lib conf.c:4738:(snd_config_expand) Անհայտ պարամետրեր 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Անհայտ PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Անհայտ պարամետրեր 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Անվավեր PCM default:0
ortp-warning-Վատ, HDA Intel PCH ձայնային քարտը միանալուն անհայտ է թվում, կրկնապատկվում է plughw-ով...
Mediastreamer-ը պատրաստ է:

Այս ցուցակում մենք տեսնում ենք ALSA գրադարանի կողմից դուրս բերված սխալների հաղորդագրությունները, որը օգտագործվում է ձայնային քարտի կառավարման համար։ Մեդիաստրակառաների разработчики считают, что это нормально. Мы в данном случае по неволе согласимся с ними.

Այժմ մենք լիարժեք պատրաստ ենք աշխատելու медиastreamer-ի հետ։ Մենք տեղադրել ենք медиastreamer գրադարանը, կոմպիլյացիայի գործիքը, և փորձնական ծրագրի միջոցով ստուգել ենք, որ գործիքները կարգավորված են, և медиastreamer-ը հաջողությամբ սկզբնավորված է։

Երեկո խոսքերը. հոդվածում Մենք կստեղծենք ծրագիր, որը կկառուցի և գործարկի ձայների ազդանշանը մի քանի ֆիլտրերի շղթայում։

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster