Raziskovanje mehanizma VoIP Mediastreamer2. 1. del

Gradivo članka je vzeto iz mojega zen kanal.

Predstavitev

Ta članek je začetek serije člankov o obdelavi medijev v realnem času z uporabo mehanizma Mediastreamer2. Predstavitev bo vključevala minimalna znanja dela na terminalu Linux in programiranja v jeziku C.

Mediastreamer2 je motor VoIP, ki stoji za priljubljenim projektom VoIP telefona z odprtokodno programsko opremo. Linfon. V Linphone Mediastreamer2 izvaja vse funkcije, povezane z zvokom in videom. Podroben seznam funkcij motorja si lahko ogledate na tej strani Mediastreamer. Izvorna koda je tukaj: GitLab.

Nadalje v besedilu bomo za udobje namesto besede Mediastreamer2 uporabili njeno rusko oznako: "media streamer".

Zgodovina njegovega nastanka ni povsem jasna, a sodeč po izvorni kodi je prej uporabljal knjižnico drzen, ki tako rekoč namiguje na morebitno daljno razmerje z GStreamer. V primerjavi s tem je medijski streamer videti lažji. Prva različica Linphone se je pojavila leta 2001, tako da trenutno medijski streamer obstaja in se razvija že skoraj 20 let.

V središču medijskega streamerja je arhitektura, imenovana "Data flow" (pretok podatkov). Primer takšne arhitekture je prikazan na spodnji sliki.

Raziskovanje mehanizma VoIP Mediastreamer2. 1. del

V tej arhitekturi algoritem obdelave podatkov ni določen s programsko kodo, temveč s shemo (grafom) za povezovanje funkcij, ki jih je mogoče razporediti v poljubnem vrstnem redu. Te funkcije se imenujejo filtri.

Ta arhitektura omogoča implementacijo funkcionalnosti obdelave medijev v obliki nabora filtrov, povezanih s shemo obdelave in prenosa prometa VoIP telefona RTP.

Zmožnost združevanja filtrov v poljubne sheme, preprost razvoj novih filtrov, implementacija medijskega streamerja kot neodvisne ločene knjižnice omogočajo njegovo uporabo v drugih projektih. Poleg tega je projekt lahko na področju VoIP, saj je možno dodati filtre, ki jih izdela sam.

Knjižnica filtrov, ki je privzeto dobavljena, je precej bogata in jo je, kot že rečeno, mogoče razširiti s filtri lastne zasnove. Najprej pa opišemo že pripravljene filtre, ki so priloženi medijskemu pretakalniku. Tukaj je njihov seznam:

Zvočni filtri

Zajem in predvajanje zvoka

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Izvorni zvok za Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Storitev avdio čakalne vrste (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Storitev zvočne enote (Mac OS X)
  • Umetnost (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Predvajalnik datotek (datoteke raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Predvajalnik datotek (raw/wav datoteke) (Windows): MS_WINSND_READ
  • Pisanje v datoteko (datoteke wav) (Linux): MS_FILE_REC
  • Pisanje v datoteko (datoteke wav) (Windows): MS_WINSND_WRITE
  • Zvočna enota 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)

Avdio kodiranje/dekodiranje

  • G.711 a-zakon: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-zakon: 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
  • Linearni PCM: MS_L16_ENC, MS_L16_DEC
  • Govor: MS_SPEEX_ENC, MS_SPEEX_DEC

Obdelava zvoka

  • Pretvorba kanala (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferenca: MS_CONF
  • Generator DTMF: MS_DTMF_GEN
  • Preklic odmeva (speex): MS_SPEEX_EC
  • Izenačevalnik: MS_EQUALIZER
  • Mešalnik: MS_MIXER
  • Kompenzator izgube paketov (PLC): MS_GENERIC_PLC
  • Ponovno vzorčevalnik: MS_RESAMPLE
  • Detektor tonov: MS_TONE_DETECTOR
  • Nadzor glasnosti in merjenje ravni signala: MS_VOLUME

Video filtri

Zajem in predvajanje videa

  • android capture
  • android predvajanje
  • Zajem AV Foundation (iOS)
  • Predvajanje AV Foundation (iOS)
  • DirectShow Capture (Windows)
  • Predvajanje DrawDib (Windows)
  • Zunanje predvajanje - pošiljanje videa na zgornjo plast
  • Predvajanje GLX (Linux): MS_GLXVIDEO
  • Mire - Sintetična gibljiva slika: MS_MIRE
  • Predvajanje OpenGL (Mac OS X)
  • Predvajanje OpenGL ES2 (Android)
  • Quicktime Capture (Mac OS X)
  • Predvajanje SDL: MS_SDL_OUT
  • Izhod statične slike: MS_STATIC_IMAGE
  • Zajem videa za Linux (V4L) (Linux): MS_V4L
  • Zajem videa za Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) zajem (Windows)
  • Video4windows (DirectShow) zajem (Windows CE)
  • Zajem videa za Windows (vfw) (Windows)
  • Predvajanje XV (Linux)

Video kodiranje/dekodiranje

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, sneg: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (samo dekoder): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Video obdelava

  • jpeg posnetek
  • Pretvornik formata slikovnih pik: MS_PIX_CONV
  • Resizer
  • Drugi filtri
  • Izmenjava podatkovnih blokov med nitmi: MS_ITC_SOURCE, MS_ITC_SINK
  • Zbiranje blokov podatkov iz več vhodov v en izhod: MS_JOIN
  • RTP sprejem/prenos: MS_RTP_SEND, MS_RTP_RECV
  • Kopiranje vhodnih podatkov na več izhodov: MS_TEE
  • Končana obremenitev: MS_VOID_SINK
  • Vir tišine: MS_VOID_SOURCE

Plugins

Zvočni filtri

  • AMR-NB kodirnik/dekoder
  • G.729 kodirnik/dekoder
  • iLBC kodirnik/dekoder
  • Kodirnik/dekoder SILK

    Video filtri

  • Programski kodirnik H.264
  • H.264 V4L2 strojno pospešeni kodirnik/dekodirnik

Po kratkem opisu filtra se prikaže ime tipa, ki se uporabi pri ustvarjanju novega primerka tega filtra. V nadaljevanju se bomo sklicevali na ta seznam.

Namestitev pod Linux Ubuntu

Sedaj bomo namestili medijski streamer v računalnik in z njim zgradili našo prvo aplikacijo.

Namestitev Mediastremer2 na računalnik ali virtualni stroj z Ubuntujem ne zahteva posebnih veščin. Tukaj in spodaj bo simbol "$" označeval ukazno lupino za vnos ukazov. Tisti. če v seznamu vidite ta simbol na začetku vrstice, potem je to vrstica, v kateri so prikazani ukazi, ki se izvajajo v terminalu.

Predpostavlja se, da ima vaš računalnik med koraki v tem članku dostop do interneta.

Namestitev paketa libmediastremer-dev

Zaženite terminal in vnesite ukaz:

$ sudo apt-get update

Za spremembe boste morali vnesti geslo, vnesite ga in upravitelj paketov bo posodobil svoje zbirke podatkov. Po tem morate zagnati:

$ sudo apt-get install libmediastreamer-dev

Potrebni paketi odvisnosti in sama knjižnica pretakanja medijev bodo samodejno preneseni in nameščeni.

Skupna velikost prenesenih paketov deb dependency bo približno 35 MB. Podrobnosti o nameščenem paketu najdete z ukazom:

$ dpkg -s libmediastreamer-dev

Vzorec odgovora:

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/

Namestitev razvojnih orodij

Namestite prevajalnik C in njegova spremljajoča orodja:

$ sudo apt-get install gcc

Rezultat preverimo s poizvedbo po različici prevajalnika:

$ gcc --version

Odgovor bi moral biti nekaj takega:

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.

Gradnja in izvajanje preizkusne aplikacije

Ustvarjamo v domov mapa za naše projekte vadnic, recimo temu mstutorial:

$ mkdir ~/mstutorial

Uporabite svoj najljubši urejevalnik besedil in ustvarite programsko datoteko C, imenovano mstest.c z naslednjo vsebino:

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

Inicializira medijski streamer, natisne pozdrav in zapusti.

Shranite datoteko in prevedite testno aplikacijo z ukazom:

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

Upoštevajte, da je vrstica

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

v narekovajih, ki se nahajajo na tipkovnici na istem mestu kot črka "Ё".

Če datoteka ne vsebuje napak, se bo po prevajanju v imeniku pojavila datoteka mstest. Začnemo program:

$ ./mstest

Rezultat bo tak:

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.

V tem seznamu vidimo sporočila o napakah, ki jih prikaže knjižnica ALSA, ki se uporablja za nadzor zvočne kartice. Razvijalci medijskega streamerja sami verjamejo, da je to normalno. V tem primeru se z njimi neradi strinjamo.

Zdaj smo vsi pripravljeni na delo z medijskim pretakalnikom. Namestili smo knjižnico medijskega pretakalnika, orodje za kompilacijo in s preskusno aplikacijo preverili, ali so orodja konfigurirana in se medijsko pretočno orodje uspešno inicializira.

Naslednji članek izdelali bomo aplikacijo, ki bo sestavila in pognala obdelavo zvočnega signala v verigi več filtrov.

Vir: www.habr.com