Istraživanje Mediastreamer2 VoIP motora. Dio 1

Materijal članka je preuzet sa mog zen kanal.

Uvod

Ovaj članak je početak serije članaka o obradi medija u realnom vremenu pomoću mehanizma Mediastreamer2. Prezentacija će uključivati ​​minimalne vještine rada u Linux terminalu i programiranja u C jeziku.

Mediastreamer2 je VoIP motor iza popularnog open-source softverskog projekta VoIP telefona. telefon. U Linphone Mediastreamer2 implementira sve funkcije vezane za zvuk i video. Detaljnu listu karakteristika motora možete vidjeti na ovoj stranici Mediastreamer. Izvorni kod je ovdje: GitLab.

Dalje u tekstu, radi pogodnosti, umjesto riječi Mediastreamer2 koristit ćemo njegovu rusku notaciju: „media streamer“.

Istorija njegovog nastanka nije sasvim jasna, ali sudeći po izvornom kodu, prethodno je koristio biblioteku glib, što, takoreći, nagoveštava moguću daleku vezu sa GStreamer. U poređenju sa kojim medijski streamer izgleda lakše. Prva verzija Linphonea pojavila se 2001. godine, tako da trenutno medijski streamer postoji i razvija se skoro 20 godina.

U srcu medijskog streamera je arhitektura nazvana "Protok podataka" (protok podataka). Primjer takve arhitekture prikazan je na donjoj slici.

Istraživanje Mediastreamer2 VoIP motora. Dio 1

U ovoj arhitekturi algoritam obrade podataka nije specificiran programskim kodom, već shemom (grafom) za povezivanje funkcija koje se mogu rasporediti bilo kojim redoslijedom. Ove funkcije se nazivaju filteri.

Ova arhitektura omogućava implementaciju funkcionalnosti obrade medija u obliku skupa filtera povezanih na šemu obrade i prijenosa RTP saobraćaja VoIP telefona.

Mogućnost kombinovanja filtera u proizvoljne šeme, jednostavan razvoj novih filtera, implementacija medijskog streamera kao nezavisne zasebne biblioteke, omogućavaju da se koristi u drugim projektima. Štaviše, projekat može biti u oblasti VoIP-a, jer je moguće dodati filtere koje ste sami izradili.

Biblioteka filtera koja se podrazumevano isporučuje je prilično bogata i, kao što je već pomenuto, može se proširiti filterima našeg sopstvenog dizajna. Ali prvo, hajde da opišemo gotove filtere koji dolaze s medijskim streamerom. Evo njihove liste:

Zvučni filteri

Snimanje i reprodukcija zvuka

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android izvorni zvuk (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Audio Queue Service (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Usluga audio jedinice (Mac OS X)
  • Umjetnost (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Plejer datoteka (raw/wav/pcap fajlovi) (Linux): MS_FILE_PLAYER
  • Plejer datoteka (raw/wav fajlovi) (Windows): MS_WINSND_READ
  • Zapisivanje u datoteku (wav datoteke) (Linux): MS_FILE_REC
  • Zapisivanje u datoteku (wav datoteke) (Windows): MS_WINSND_WRITE
  • Mac audio jedinica (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 zvuk (Windows)

Audio 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
  • Brzina: MS_SPEEX_ENC, MS_SPEEX_DEC

Obrada zvuka

  • Konverzija kanala (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferencija: MS_CONF
  • DTMF generator: MS_DTMF_GEN
  • Poništavanje eha (speex): MS_SPEEX_EC
  • Ekvilajzer: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Kompenzator gubitka paketa (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Detektor tona: MS_TONE_DETECTOR
  • Kontrola jačine zvuka i mjerenje nivoa signala: MS_VOLUME

Video filteri

Video snimanje i reprodukcija

  • android capture
  • android playback
  • AV Foundation snimanje (iOS)
  • AV Foundation reprodukcija (iOS)
  • DirectShow Capture (Windows)
  • DrawDib reprodukcija (Windows)
  • Eksterna reprodukcija - Slanje videa na gornji sloj
  • GLX reprodukcija (Linux): MS_GLXVIDEO
  • Mire - Sintetička pokretna slika: MS_MIRE
  • OpenGL reprodukcija (Mac OS X)
  • OpenGL ES2 reprodukcija (Android)
  • Quicktime Capture (Mac OS X)
  • SDL reprodukcija: MS_SDL_OUT
  • Izlaz statične slike: MS_STATIC_IMAGE
  • Video za Linux (V4L) snimanje (Linux): MS_V4L
  • Video za Linux 2 (V4L2) snimanje (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) snimanje (Windows)
  • Video4windows (DirectShow) snimanje (Windows CE)
  • Video za Windows (vfw) snimanje (Windows)
  • XV reprodukcija (Linux)

Video kodiranje/dekodiranje

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

Obrada videa

  • jpeg snimak
  • Konverter formata piksela: MS_PIX_CONV
  • Resizer
  • Ostali filteri
  • Razmjena blokova podataka između niti: MS_ITC_SOURCE, MS_ITC_SINK
  • Prikupljanje blokova podataka sa više ulaza na jedan izlaz: MS_JOIN
  • RTP prijem/prenos: MS_RTP_SEND, MS_RTP_RECV
  • Kopiranje ulaznih podataka na više izlaza: MS_TEE
  • Prekinuto opterećenje: MS_VOID_SINK
  • Izvor tišine: MS_VOID_SOURCE

Dodaci

Zvučni filteri

  • AMR-NB koder/dekoder
  • G.729 koder/dekoder
  • iLBC koder/dekoder
  • SILK enkoder/dekoder

    Video filteri

  • H.264 softverski enkoder
  • H.264 V4L2 hardverski ubrzani enkoder/dekoder

Nakon kratkog opisa filtera, prikazuje se naziv tipa koji se koristi prilikom kreiranja nove instance ovog filtera. U nastavku ćemo se osvrnuti na ovu listu.

Instalacija pod Linux Ubuntu

Sada ćemo instalirati media streamer na računar i sa njim napraviti našu prvu aplikaciju.

Instaliranje Mediastremer2 na računar ili virtuelnu mašinu koja koristi Ubuntu ne zahteva nikakve posebne veštine. Ovdje i ispod, simbol "$" će označavati shell prompt za unos komandi. One. ako u listingu vidite ovaj simbol na početku reda, onda je to red u kojem je prikazano da se komande izvršavaju u terminalu.

Pretpostavlja se da tokom koraka u ovom članku vaš računar ima pristup Internetu.

Instaliranje paketa libmediastremer-dev

Pokrenite terminal i upišite naredbu:

$ sudo apt-get update

Od vas će se tražiti lozinka za izmjene, unesite je i upravitelj paketa će ažurirati svoje baze podataka. Nakon toga, potrebno je pokrenuti:

$ sudo apt-get install libmediastreamer-dev

Neophodni paketi zavisnosti i sama biblioteka streamera medija bit će automatski preuzeti i instalirani.

Ukupna veličina preuzetih deb paketa ovisnosti bit će približno 35 MB. Detalje o instaliranom paketu možete pronaći naredbom:

$ dpkg -s libmediastreamer-dev

Primjer 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/

Instaliranje razvojnih alata

Instalirajte C kompajler i njegove prateće alate:

$ sudo apt-get install gcc

Provjeravamo rezultat upitom za verziju kompajlera:

$ gcc --version

Odgovor bi trebao biti otprilike ovako:

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.

Izrada i pokretanje probne aplikacije

Stvaramo u kući folder za naše tutorial projekte, nazovimo ga mstutorial:

$ mkdir ~/mstutorial

Koristite svoj omiljeni uređivač teksta i kreirajte C programski fajl pod nazivom mstest.c sa sljedećim sadržajem:

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

Inicijalizira media streamer, ispisuje pozdrav i izlazi.

Sačuvajte datoteku i kompajlirajte test aplikaciju naredbom:

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

Imajte na umu da je linija

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

u navodnicima, koji se nalaze na tastaturi na istom mestu kao i slovo "Ë".

Ako datoteka ne sadrži greške, tada će se nakon kompilacije datoteka pojaviti u direktoriju mstest. Pokrećemo program:

$ ./mstest

Rezultat će biti ovakav:

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.

U ovoj listi vidimo poruke o grešci koje prikazuje ALSA biblioteka, koristi se za kontrolu zvučne kartice. Sami programeri medijskog streamera vjeruju da je to normalno. U ovom slučaju, nerado se slažemo s njima.

Sada smo spremni za rad sa medijskim streamerom. Instalirali smo biblioteku media streamera, alat za kompilaciju i pomoću probne aplikacije potvrdili da su alati konfigurirani i da se media streamer uspješno inicijalizira.

Sljedeći članak napravićemo aplikaciju koja će sastaviti i pokrenuti obradu audio signala u lancu od nekoliko filtera.

izvor: www.habr.com