Explorarea motorului VoIP Mediastreamer2. Partea 1

Materialul articolului este preluat de pe mine canal zen.

Introducere

Acest articol este începutul unei serii de articole despre procesarea media în timp real folosind motorul Mediastreamer2. Prezentarea va implica abilitățile minime de lucru în terminalul Linux și programare în limbajul C.

Mediastreamer2 este motorul VoIP din spatele popularului proiect de telefon VoIP cu software open-source. telefon. În Linphone Mediastreamer2 implementează toate funcțiile legate de sunet și video. O listă detaliată a funcțiilor motorului poate fi văzută pe această pagină Mediastreamer. Codul sursă este aici: GitLab.

Mai departe în text, pentru comoditate, în loc de cuvântul Mediastreamer2 vom folosi notația rusă: „media streamer”.

Istoria creării sale nu este complet clară, dar judecând după codul sursă, a folosit anterior biblioteca glib, care, parcă, sugerează o posibilă relație îndepărtată cu GStreamer. În comparație cu care streamerul media arată mai ușor. Prima versiune de Linphone a apărut în 2001, așa că în acest moment media streamer-ul există și se dezvoltă de aproape 20 de ani.

În centrul streamer-ului media se află o arhitectură numită „Flux de date” (flux de date). Un exemplu de astfel de arhitectură este prezentat în figura de mai jos.

Explorarea motorului VoIP Mediastreamer2. Partea 1

În această arhitectură, algoritmul de procesare a datelor este specificat nu printr-un cod de program, ci printr-o schemă (grafic) de conectare a funcțiilor care pot fi aranjate în orice ordine. Aceste funcții se numesc filtre.

Această arhitectură face posibilă implementarea funcționalității de procesare media sub forma unui set de filtre conectate la schema de procesare și transmisie a traficului RTP al telefonului VoIP.

Capacitatea de a combina filtrele în scheme arbitrare, dezvoltarea simplă de noi filtre, implementarea media streamer-ului ca bibliotecă separată independentă, îi permit să fie utilizat în alte proiecte. Mai mult, proiectul poate fi în domeniul VoIP, deoarece este posibil să adăugați filtre realizate de dvs.

Biblioteca de filtre furnizată implicit este destul de bogată și, după cum am menționat deja, poate fi extinsă cu filtre de design propriu. Dar mai întâi, să descriem filtrele gata făcute care vin cu streamerul media. Iată lista lor:

Filtre de sunet

Captură și redare audio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Sunet nativ Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Serviciu de coadă audio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Serviciu de unitate audio (Mac OS X)
  • Arte (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Player de fișiere (fișiere raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Player de fișiere (fișiere raw/wav) (Windows): MS_WINSND_READ
  • Scrieți în fișier (fișiere wav) (Linux): MS_FILE_REC
  • Scrieți în fișier (fișiere wav) (Windows): MS_WINSND_WRITE
  • Unitate audio 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
  • Sunet Windows (Windows)

Codificare/decodare audio

  • G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-lege: 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

Procesarea sunetului

  • Conversie canal (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Conferință: MS_CONF
  • Generator DTMF: MS_DTMF_GEN
  • Anularea ecoului (speex): MS_SPEEX_EC
  • Egalizator: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Compensator de pierderi de pachete (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Detector de ton: MS_TONE_DETECTOR
  • Controlul volumului și măsurarea nivelului semnalului: MS_VOLUME

Filtre video

Captură și redare video

  • captura Android
  • redare Android
  • Captură AV Foundation (iOS)
  • Redare AV Foundation (iOS)
  • DirectShow Capture (Windows)
  • Redare DrawDib (Windows)
  • Redare externă - Trimiterea videoclipului către stratul superior
  • Redare GLX (Linux): MS_GLXVIDEO
  • Mire - Imagine în mișcare sintetică: MS_MIRE
  • Redare OpenGL (Mac OS X)
  • Redare OpenGL ES2 (Android)
  • Quicktime Capture (Mac OS X)
  • Redare SDL: MS_SDL_OUT
  • Ieșire de imagine statică: MS_STATIC_IMAGE
  • Captură video pentru Linux (V4L) (Linux): MS_V4L
  • Captură video pentru Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Captură Video4windows (DirectShow) (Windows)
  • Captură Video4windows (DirectShow) (Windows CE)
  • Captură video pentru Windows (vfw) (Windows)
  • Redare XV (Linux)

Codificare/decodare video

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Zăpadă: 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

  • instantaneu jpeg
  • Convertor format pixel: MS_PIX_CONV
  • Redimensionare
  • Alte filtre
  • Schimb de blocuri de date între fire: MS_ITC_SOURCE, MS_ITC_SINK
  • Colectarea blocurilor de date de la mai multe intrări la o singură ieșire: MS_JOIN
  • Primire/transmitere RTP: MS_RTP_SEND, MS_RTP_RECV
  • Copierea datelor de intrare pe mai multe ieșiri: MS_TEE
  • Încărcare terminată: MS_VOID_SINK
  • Sursa de tăcere: MS_VOID_SOURCE

Плагины

Filtre de sunet

  • Encoder/decodor AMR-NB
  • codificator/decodor G.729
  • codificator/decodor iLBC
  • Codificator/decodor SILK

    Filtre video

  • Codificator software H.264
  • Codificator/decodor accelerat hardware H.264 V4L2

După o scurtă descriere a filtrului, este afișat numele tipului, care este utilizat la crearea unei noi instanțe a acestui filtru. În cele ce urmează, ne vom referi la această listă.

Instalare sub Linux Ubuntu

Acum vom instala media streamer-ul pe computer și vom construi prima noastră aplicație cu el.

Instalarea Mediastremer2 pe un computer sau pe o mașină virtuală care rulează Ubuntu nu necesită abilități speciale. Aici și mai jos, simbolul „$” va indica promptul shell pentru introducerea comenzilor. Acestea. dacă în listare vedeți acest simbol la începutul liniei, atunci aceasta este linia în care sunt afișate comenzile pentru a fi executate în terminal.

Se presupune că în timpul pașilor din acest articol, computerul dvs. are acces la Internet.

Instalarea pachetului libmediastremer-dev

Lansați terminalul și tastați comanda:

$ sudo apt-get update

Vi se va cere o parolă pentru a face modificări, introduceți-o și managerul de pachete își va actualiza bazele de date. După aceea, trebuie să rulați:

$ sudo apt-get install libmediastreamer-dev

Pachetele de dependență necesare și biblioteca media streamer în sine vor fi descărcate și instalate automat.

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

$ dpkg -s libmediastreamer-dev

Exemplu de răspuns:

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/

Instalarea instrumentelor de dezvoltare

Instalați compilatorul C și instrumentele sale însoțitoare:

$ sudo apt-get install gcc

Verificăm rezultatul interogând versiunea compilatorului:

$ gcc --version

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

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.

Crearea și rularea aplicației de încercare

Noi creăm în Acasă folder pentru proiectele noastre tutoriale, să-l numim mstutorial:

$ mkdir ~/mstutorial

Utilizați editorul de text preferat și creați un fișier de program C numit mstest.c cu urmatorul continut:

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

Inițializează streamerul media, tipărește un salut și iese.

Salvați fișierul și compilați aplicația de testare cu comanda:

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

Rețineți că linia

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

cuprinse între ghilimele, care se află pe tastatură în același loc cu litera „Ё”.

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

$ ./mstest

Rezultatul va fi astfel:

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.

În această listă, vedem mesajele de eroare pe care le afișează biblioteca ALSA, este folosită pentru a controla placa de sunet. Înșiși dezvoltatorii streamerului media cred că acest lucru este normal. În acest caz, suntem de acord cu ei fără tragere de inimă.

Acum suntem gata să lucrăm cu streamerul media. Am instalat biblioteca media streamer, instrumentul de compilare și, folosind o aplicație de probă, am verificat că instrumentele sunt configurate și că media streamer-ul se inițializează cu succes.

Următorul articol vom crea o aplicație care va asambla și rula procesarea unui semnal audio într-un lanț de mai multe filtre.

Sursa: www.habr.com