Materialul articolului provine de pe canalul meu .
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. . Î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: .
Î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 , ceea ce sugerează posibila sa legătură îndepărtată cu . 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.

Î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 updateVa 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-devVor 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-devExemplul 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 gccVerificăm rezultatul, cerând versiunea compilatorului:
$ gcc --versionRă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 ~/mstutorialFolosiț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:
$ .\/mstestRezultatul 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 vom crea o aplicație care va compila și va lansa procesarea semnalului audio într-un lanț de mai multe filtre.
Sursa: habr.com
