Explorând motorul VoIP Mediastreamer2. Partea 1

Materialul articolului provine de pe canalul meu zen.

Introducere

Acest articol este începutul unei serii de articole despre procesarea în timp real a datelor media folosind motorul Mediastreamer2. În timpul expunerii vor fi necesare abilități minime de utilizare a terminalului Linux și de programare în C.

Mediastreamer2 este un motor VoIP care stă la baza unui proiect popular open-source de telefonie VoIP. Linphone. În Linphone, Mediastreamer2 implementează toate funcțiile legate de audio și video. O listă detaliată a capacităților motorului poate fi găsită pe această pagină Mediastreamer. Codul sursă se află aici: GitLab.

În continuare, pentru comoditate, în text, în loc de cuvântul Mediastreamer2, vom folosi denumirea sa în limba rusă: „медиастример”.

Istoria creării sale nu este foarte clară, dar judecând după codul său sursă, a folosit anterior biblioteca Glib, ceea ce sugerează posibila sa legătură îndepărtată cu GStreamer. Comparativ, mediastreamer pare mai ușor. Prima versiune a Linphone a apărut în 2001, așa că, în prezent, mediastreamer există și se dezvoltă de aproape 20 de ani.

La baza mediastreamer-ului se află o arhitectură numită „Data flow” (flux de date). Un exemplu al acestei arhitecturi este prezentat în imaginea de mai jos.

Explorând motorul VoIP Mediastreamer2. Partea 1

În această arhitectură, algoritmul de procesare a datelor este definit nu prin codul de programare, ci printr-un diagramă (graf) de conectare a funcțiilor, pe care le poți organiza în orice ordine. Aceste funcții se numesc filtre.

Această arhitectură permite realizarea funcționalității de procesare a mediilor sub formă de set de filtre, conectate într-o schemă de procesare și transmitere a traficului RTP de către telefonul VoIP.

Posibilitatea de a conecta filtrele în scheme arbitrari, dezvoltarea ușoară a filtrelor noi și implementarea mediastreamer-ului ca o bibliotecă separată independentă permit utilizarea sa și în alte proiecte. Proiectul poate fi în domeniul VoIP, deoarece există posibilitatea de a adăuga filtre realizate manual.

Biblioteca de filtre livrată implicit este suficient de bogată și, după cum s-a spus, poate fi extinsă cu filtre dezvoltate de utilizatori. Dar mai întâi, vom descrie filtrele gata făcute care sunt furnizate împreună cu mediastreamer-ul. Iată lista lor:

Filtre audio

Captură și redare a sunetului

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Sunet nativ Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Serviciul Audio Queue (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Serviciul Audio Unit (Mac OS X)
  • Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Redare fișiere (raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Redare fișiere (raw/wav) (Windows): MS_WINSND_READ
  • Înregistrare în fișier (wav) (Linux): MS_FILE_REC
  • Înregistrare în fișier (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)

Codificare/decodificare audio

  • G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-law: 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 liniar: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Procesare audio

  • Conversie canal (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Conferință: MS_CONF
  • Generator DTMF: MS_DTMF_GEN
  • Anulare ecou (speex): MS_SPEEX_EC
  • Equalizator: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Compensator pierdere pachete (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Detector tonuri: MS_TONE_DETECTOR
  • Control volum și măsurare nivel semnal: MS_VOLUME

Filtre video

Captură și redare video

  • Captură Android
  • Redare Android
  • Captură AV Foundation (iOS)
  • Redare AV Foundation (iOS)
  • Captură DirectShow (Windows)
  • Redare DrawDib (Windows)
  • Redare externă — Trimitere video la nivel înalt
  • Redare GLX (Linux): MS_GLXVIDEO
  • Mire — Imagine sintetică în mișcare: MS_MIRE
  • Redare OpenGL (Mac OS X)
  • Redare OpenGL ES2 (Android)
  • Captură Quicktime (Mac OS X)
  • Redare SDL: MS_SDL_OUT
  • Iesire imagini statice: MS_STATIC_IMAGE
  • Captură Video For Linux (V4L) (Linux): MS_V4L
  • Captură Video For Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Captură Video4windows (DirectShow) (Windows)
  • Captură Video4windows (DirectShow) (Windows CE)
  • Captură Video For Windows (vfw) (Windows)
  • Redare XV (Linux)

Codare/decodare video

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

Procesare video

  • Instantanee JPEG
  • Converter format pixel: MS_PIX_CONV
  • Redimensionare
  • Alte filtre
  • Schimb de blocuri de date între threaduri: MS_ITC_SOURCE, MS_ITC_SINK
  • Colectare blocuri de date din mai multe intrări într-o ieșire: MS_JOIN
  • RTP primire/trimitere: MS_RTP_SEND, MS_RTP_RECV
  • Copiere date intrare în mai multe ieșiri: MS_TEE
  • Sarcină consistentă: MS_VOID_SINK
  • Sursă de tăcere: MS_VOID_SOURCE

Plugin-uri

Filtre audio

  • Decodor/encoder AMR-NB
  • Decodor/encoder G.729
  • Decodor/encoder iLBC
  • Decodor/encoder SILK

    Filtre video

  • Encoder H.264 software
  • Decodor/encoder H.264 V4L2 cu accelerare hardware

După o scurtă descriere a filtrului apare numele tipului folosit pentru crearea unei noi instanțe a acestui filtr. În continuare, ne vom referi la această listă.

Instalare pe Linux Ubuntu

Acum vom efectua instalarea media streamer-ului pe computer și vom construi prima noastră aplicație cu acesta.

Instalarea Mediastremer2 pe computer sau pe o mașină virtuală care rulează Ubuntu nu necesită abilități speciale. Aici și mai departe, simbolul „$” va reprezenta promptul shell pentru introducerea comenzilor. Asta înseamnă că, dacă în listare vedeți acest simbol la începutul unei linii, este vorba despre linia în care sunt afișate comenzile care trebuie executate în terminal.

Se presupune că, în timpul desfășurării acțiunilor descrise în acest articol, computerul dumneavoastră are acces la rețeaua Internet.

Instalarea pachetului libmediastremer-dev

Deschidem terminalul și tastăm comanda:

$ sudo apt-get update

Va fi solicitată parola pentru a efectua modificări, introduceți-o și managerul de pachete își va actualiza bazele. După aceasta, trebuie să efectuați:

$ sudo apt-get install libmediastreamer-dev

Vor fi descărcate și instalate automat pachetele de dependență necesare și biblioteca media streamer.

Dimensiunea totală a pachetelor deb de dependență descărcate va fi de aproximativ 35 MB. Detalii despre pachetul instalat pot fi obținute cu comanda:

$ dpkg -s libmediastreamer-dev

Exemplul de răspuns:

Pachet: libmediastreamer-dev
Stare: instalat corect
Prioritate: opțional
Secțiune: libdevel
Dimensiune-Instalat: 244
Întreținător: Ubuntu Developers 
Arhitectură: amd64
Sursă: linphone
Versiune: 3.6.1-2.5
Depinde: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Descriere: Biblioteca media a telefonului web Linphone - fișiere pentru dezvoltare
Linphone este un telefon internet audio și video care folosește protocolul SIP. Acesta
are o interfață GTK+ și console, include o varietate mare de codecuri audio și video
și furnizează funcționalități de IM.
.
Acest pachet conține bibliotecile de dezvoltare pentru gestionarea operațiunilor media.
Întreținător-original: Debian VoIP Team 
Homepage: http://www.linphone.org/

Instalarea instrumentelor de dezvoltare

Instalăm compilatorul C și instrumentele sale asociate:

$ sudo apt-get install gcc

Verificăm rezultatul, cerând versiunea compilatorului:

$ gcc --version

Răspunsul ar trebui să fie aproximativ așa:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Acesta este un software liber; vezi sursa pentru condițiile de copiere. Nu există
garanție; nu chiar pentru VÂNZARE sau ADECVARE PENTRU UN SCOP ANUMIT.

Compilarea și rularea aplicației de probă

Creăm în home un folder pentru proiectele noastre de învățare, să-l numim mstutorial:

$ mkdir ~/mstutorial

Folosiți editorul dumneavoastră de text preferat și creați un fișier C-program cu numele mstest.c cu următorul conținut:

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

Acesta efectuează inițializarea media streamer-ului, afișează un mesaj de întâmpinare și finalizează execuția.

Salvăm fișierul și compilăm aplicația de test cu comanda:

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

Vă rugăm să rețineți că linia

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

este în ghilimele, care se află pe tastatură acolo unde se află și litera „Ё”.

Dacă fișierul nu conține erori, atunci după compilare va apărea un fișier în director mstest. Rulăm programul:

$ .\/mstest

Rezultatul va fi astfel:

ALSA lib conf.c:4738:(snd_config_expand) Parametrii necunoscuți 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) CTL invalid default:0
ortp-warning-Imposibil de atașat mixer la card: argument invalid
ALSA lib conf.c:4738:(snd_config_expand) Parametrii necunoscuți 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM necunoscut default:0
ALSA lib conf.c:4738:(snd_config_expand) Parametrii necunoscuți 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM necunoscut default:0
ortp-warning-Straniu, placa de sunet HDA Intel PCH nu pare capabilă de nimic, reîncercând cu plughw...
Mediastreamer este pregătit.

În această listă vedem mesajele de eroare pe care le returnează biblioteca ALSA, utilizată pentru gestionarea plăcii de sunet. Dezvoltatorii mediastreamerului consideră că aceasta este normal. În acest caz, suntem nevoiți să fim de acord cu ei.

Acum suntem pregătiți să lucrăm cu mediastreamerul. Am instalat biblioteca mediastreamer, instrumentul de compilare și am verificat, folosind aplicația de testare, că instrumentele sunt configurate, iar mediastreamerul se inițializează cu succes.

În următoarea pe care l-ați citit vom crea o aplicație care va compila și va lansa procesarea semnalului audio într-un lanț de mai multe filtre.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster