Ուսումնասիրելով Mediastreamer2 VoIP շարժիչը: Մաս 1

Հոդվածի նյութը վերցված է իմ զեն ալիք.

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

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

Mediastreamer2-ը VoIP շարժիչն է հանրահայտ բաց կոդով ծրագրային ապահովման Voip հեռախոսի նախագծի հետևում: Լինֆոն. Linphone-ում Mediastreamer2-ն իրականացնում է ձայնի և տեսանյութի հետ կապված բոլոր գործառույթները: Շարժիչի առանձնահատկությունների մանրամասն ցանկը կարելի է տեսնել Mediastreamer-ի այս էջում: Աղբյուրի կոդը այստեղ է՝ Գիտլաբը.

Հետագայում տեքստում, հարմարության համար, Mediastreamer2 բառի փոխարեն կօգտագործենք նրա ռուսերեն նշումը՝ «media streamer»:

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

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

Ուսումնասիրելով Mediastreamer2 VoIP շարժիչը: Մաս 1

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

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

Զտիչները կամայական սխեմաների մեջ միավորելու ունակությունը, նոր ֆիլտրերի պարզ մշակումը, մեդիա հոսքի ներդրումը որպես անկախ առանձին գրադարան, թույլ են տալիս այն օգտագործել այլ նախագծերում: Ավելին, նախագիծը կարող է լինել VoIP-ի դաշտում, քանի որ հնարավոր է ավելացնել սեփական ձեռքերով պատրաստված զտիչներ։

Լռելյայն տրամադրված ֆիլտրի գրադարանը բավականին հարուստ է և, ինչպես արդեն նշվեց, կարող է ընդլայնվել մեր սեփական դիզայնի ֆիլտրերով: Բայց նախ, եկեք նկարագրենք պատրաստի ֆիլտրերը, որոնք գալիս են մեդիա հոսքի հետ: Ահա նրանց ցանկը.

Ձայնային զտիչներ

Ձայնագրում և նվագարկում

  • Alsa (Linux)՝ MS_ALSA_WRITE, MS_ALSA_READ
  • Android-ի բնօրինակ ձայն (libmedia)՝ MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Աուդիո հերթի ծառայություն (Mac OS X)՝ MS_AQ_WRITE, MS_AQ_READ
  • Աուդիո միավորի սպասարկում (Mac OS X)
  • Արվեստ (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 աուդիո միավոր (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
  • Գծային PCM՝ MS_L16_ENC, MS_L16_DEC
  • Արագություն՝ 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 Capture (Windows)
  • DrawDib նվագարկումը (Windows)
  • Արտաքին նվագարկում - տեսանյութի ուղարկում վերին շերտ
  • GLX նվագարկումը (Linux)՝ MS_GLXVIDEO
  • Mire - Սինթետիկ շարժվող նկար՝ MS_MIRE
  • OpenGL նվագարկումը (Mac OS X)
  • OpenGL ES2 նվագարկումը (Android)
  • Quicktime Capture (Mac OS X)
  • SDL նվագարկումը՝ MS_SDL_OUT
  • Ստատիկ պատկերի ելք՝ MS_STATIC_IMAGE
  • Տեսանյութ Linux-ի համար (V4L) գրավում (Linux)՝ MS_V4L
  • Տեսանյութ Linux 2 (V4L2) նկարահանման համար (Linux)՝ MS_V4L2_CAPTURE
  • Video4windows (DirectShow) նկարահանում (Windows)
  • Video4windows (DirectShow) նկարահանում (Windows CE)
  • Տեսանյութ Windows-ի համար (vfw) նկարահանում (Windows)
  • XV նվագարկում (Linux)

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

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Ձյուն՝ MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (միայն ապակոդավորիչ)՝ MS_H264_DEC
  • Թեորա՝ MS_THEORA_ENC, MS_THEORA_DEC
  • VP8՝ MS_VP8_ENC, MS_VP8_DEC

Տեսանյութերի մշակում

  • jpeg ակնթարթ
  • Pixel ձևաչափի փոխարկիչ՝ 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

Plug-ins

Ձայնային զտիչներ

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

    Տեսանյութերի զտիչներ

  • H.264 ծրագրային կոդավորիչ
  • H.264 V4L2 ապարատային արագացված կոդավորիչ/ապակոդավորիչ

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

Տեղադրում Linux Ubuntu-ում

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

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

Ենթադրվում է, որ այս հոդվածի քայլերի ընթացքում ձեր համակարգիչը մուտք ունի ինտերնետ:

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

Գործարկեք տերմինալը և մուտքագրեք հրամանը.

$ sudo apt-get update

Ձեզանից կպահանջվի գաղտնաբառ՝ փոփոխություններ կատարելու համար, մուտքագրեք այն և փաթեթի կառավարիչը կթարմացնի իր տվյալների բազաները: Դրանից հետո դուք պետք է վազեք.

$ sudo apt-get install libmediastreamer-dev

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

Ներբեռնված կախվածության դեբ փաթեթների ընդհանուր չափը կկազմի մոտավորապես 35 ՄԲ: Տեղադրված փաթեթի մասին մանրամասները կարելի է գտնել հրամանով.

$ dpkg -s libmediastreamer-dev

Պատասխանի օրինակ.

Package: libmediastreamer-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 244
Maintainer: Ubuntu Developers <[email protected]>
Architecture: amd64
Source: linphone
Version: 3.6.1-2.5
Depends: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Description: Linphone web phone's media library - development files
Linphone is an audio and video internet phone using the SIP protocol. It
has a GTK+ and console interface, includes a large variety of audio and video
codecs, and provides IM features.
.
This package contains the development libraries for handling media operations.
Original-Maintainer: Debian VoIP Team <[email protected]>
Homepage: 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.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Փորձնական հավելվածի ստեղծում և գործարկում

Մենք ստեղծում ենք տուն թղթապանակ մեր ուսումնական նախագծերի համար, եկեք այն անվանենք 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) Unknown parameters 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Invalid CTL default:0
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ortp-warning-Strange, sound card HDA Intel PCH does not seems to be capable of anything, retrying with plughw...
Mediastreamer is ready.

Այս ցուցակում մենք տեսնում ենք սխալի հաղորդագրությունները, որոնք ցուցադրում է ALSA գրադարանը, այն օգտագործվում է ձայնային քարտը կառավարելու համար: Մեդիա հոսքի մշակողները իրենք են կարծում, որ դա նորմալ է։ Այս դեպքում մենք ակամա համաձայնում ենք նրանց հետ։

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

Հաջորդը Հոդված մենք կստեղծենք հավելված, որը կհավաքի և կգործարկի աուդիո ազդանշանի մշակումը մի քանի զտիչների շղթայում:

Source: www.habr.com