Istraživanje Mediastreamer2 VoIP mehanizma. dio 1

Materijal članka preuzet je iz mog zen kanal.

Uvod

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

Mediastreamer2 je VoIP mehanizam koji stoji iza popularnog softverskog voip telefonskog projekta otvorenog koda. Linfon. U Linphoneu Mediastreamer2 implementira sve funkcije vezane uz zvuk i video. Detaljan popis značajki motora može se vidjeti na ovoj stranici Mediastreamera. Izvorni kod je ovdje: GitLab.

Dalje u tekstu, radi praktičnosti, umjesto riječi Mediastreamer2 koristit ćemo njenu rusku oznaku: "media streamer".

Povijest njegovog nastanka nije sasvim jasna, ali sudeći po izvornom kodu, prethodno je koristio biblioteku glib, što, takoreći, nagovještava moguću daleku vezu s GStreamer. U usporedbi s kojim media streamer izgleda lakše. Prva verzija Linphonea pojavila se 2001. godine, tako da trenutno medijski streamer postoji i razvija se gotovo 20 godina.

U središtu medijskog streamera je arhitektura nazvana "Data flow" (tok podataka). Primjer takve arhitekture prikazan je na slici ispod.

Istraživanje Mediastreamer2 VoIP mehanizma. dio 1

U ovoj arhitekturi, algoritam obrade podataka nije određen programskim kodom, već shemom (grafom) za povezivanje funkcija koje se mogu rasporediti bilo kojim redoslijedom. Te se funkcije nazivaju filtri.

Ova arhitektura omogućuje implementaciju funkcionalnosti obrade medija u obliku skupa filtara povezanih na shemu obrade i prijenosa VoIP telefonskog RTP prometa.

Mogućnost kombiniranja filtara u proizvoljne sheme, jednostavan razvoj novih filtara, implementacija medija streamera kao neovisne zasebne biblioteke, omogućuju njegovu upotrebu u drugim projektima. Štoviše, projekt može biti iu području VoIP-a, budući da je moguće dodati filtere vlastite izrade.

Knjižnica filtara isporučena prema zadanim postavkama prilično je bogata i, kao što je već spomenuto, može se proširiti filtrima vlastitog dizajna. No, prvo opišite gotove filtre koji dolaze s medijskim streamerom. Evo njihovog popisa:

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
  • Usluga čekanja zvuka (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
  • Player datoteka (raw/wav/pcap datoteke) (Linux): MS_FILE_PLAYER
  • Player datoteka (raw/wav datoteke) (Windows): MS_WINSND_READ
  • Pisanje u datoteku (wav datoteke) (Linux): MS_FILE_REC
  • Pisanje 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
  • Govor: MS_SPEEX_ENC, MS_SPEEX_DEC

Obrada zvuka

  • Pretvorba kanala (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferencija: MS_CONF
  • DTMF generator: MS_DTMF_GEN
  • Otkazivanje odjeka (speex): MS_SPEEX_EC
  • Ekvilajzer: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Kompenzator gubitka paketa (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Detektor tonova: MS_TONE_DETECTOR
  • Kontrola glasnoće i mjerenje razine signala: MS_VOLUME

Video filteri

Video snimanje i reprodukcija

  • android snimanje
  • android reprodukcija
  • AV Foundation snimanje (iOS)
  • AV Foundation reprodukcija (iOS)
  • DirectShow snimanje (Windows)
  • DrawDib reprodukcija (Windows)
  • Vanjska reprodukcija - slanje videa na gornji sloj
  • GLX reprodukcija (Linux): MS_GLXVIDEO
  • Mire - Sintetička pokretna slika: MS_MIRE
  • OpenGL reprodukcija (Mac OS X)
  • Reprodukcija OpenGL ES2 (Android)
  • Quicktime snimanje (Mac OS X)
  • SDL reprodukcija: MS_SDL_OUT
  • Izlaz statične slike: MS_STATIC_IMAGE
  • Video za Linux (V4L) snimanje (Linux): MS_V4L
  • Videozapis 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
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Video obrada

  • jpeg snimka
  • Pretvornik formata piksela: MS_PIX_CONV
  • Promjena veličine
  • Ostali filteri
  • Razmjena blokova podataka između niti: MS_ITC_SOURCE, MS_ITC_SINK
  • Prikupljanje blokova podataka s više ulaza na jedan izlaz: MS_JOIN
  • RTP prijem/prijenos: MS_RTP_SEND, MS_RTP_RECV
  • Kopiranje ulaznih podataka na više izlaza: MS_TEE
  • Prekinuto opterećenje: MS_VOID_SINK
  • Tišina Izvor: MS_VOID_SOURCE

Плагины

Zvučni filteri

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

    Video filteri

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

Nakon kratkog opisa filtra prikazuje se naziv tipa koji se koristi prilikom kreiranja nove instance ovog filtra. U nastavku ćemo se pozivati ​​na ovaj popis.

Instalacija pod Linux Ubuntu

Sada ćemo instalirati medijski streamer na računalo i s njim izraditi našu prvu aplikaciju.

Instalacija Mediastremera2 na računalo ili virtualni stroj koji pokreće Ubuntu ne zahtijeva nikakve posebne vještine. Ovdje i dolje, simbol "$" će označavati upit ljuske za unos naredbi. Oni. ako u popisu vidite ovaj simbol na početku retka, onda je to redak u kojem su prikazane naredbe koje se izvršavaju u terminalu.

Pretpostavlja se da tijekom koraka u ovom članku vaše računalo 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 morate pokrenuti:

$ sudo apt-get install libmediastreamer-dev

Potrebni paketi ovisnosti i sama biblioteka medija streamer automatski će se preuzeti i instalirati.

Ukupna veličina preuzetih deb paketa ovisnosti bit će približno 35 MB. Pojedinosti o instaliranom paketu mogu se pronaći pomoću naredbe:

$ 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

Rezultat provjeravamo upitom o verziji kompilatora:

$ gcc --version

Odgovor bi trebao biti otprilike ovakav:

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

Mi stvaramo u dom mapa za naše projekte podučavanja, nazovimo je mstutorial:

$ mkdir ~/mstutorial

Upotrijebite svoj omiljeni uređivač teksta i stvorite C programsku datoteku 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 medijski streamer, ispisuje pozdrav i izlazi.

Spremite datoteku i kompajlirajte test aplikaciju naredbom:

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

Imajte na umu da linija

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

unutar navodnika, koji se nalaze na tipkovnici na istom mjestu kao i slovo "Ë".

Ako datoteka ne sadrži pogreške, nakon kompilacije datoteka će se pojaviti u direktoriju mstest. Počinjemo s programom:

$ ./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 ovom popisu vidimo poruke o pogreškama koje prikazuje biblioteka ALSA, koristi se za kontrolu zvučne kartice. Sami programeri medijskog streamera vjeruju da je to normalno. U ovom slučaju, nevoljko se slažemo s njima.

Sada smo svi spremni za rad s medijskim streamerom. Instalirali smo biblioteku medijskog streamera, alat za kompilaciju i pomoću probne aplikacije potvrdili da su alati konfigurirani i da se medijski streamer uspješno inicijalizirao.

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

Izvor: www.habr.com