Zkoumáme VoIP engine Mediastreamer2. Část 1

Materiál článku je převzat z mého zenového kanálu.

Úvod

Tento článek je začátkem série článků o reálném zpracování mediálních dat pomocí engine Mediastreamer2. Při vyprávění budou zapojeny minimální dovednosti práce v terminálu Linux a programování v jazyce C.

Mediastreamer2 je VoIP engine, který leží v základu populárního open-source projektu softwarového VoIP telefonu Linphone. V Linphone Mediastreamer2 realizuje veškeré funkce spojené se zvukem a videem. Podrobný seznam funkcí engine lze vidět na této stránce Mediastreamer. Zdrojový kód se nachází zde: GitLab.

Dále v textu pro usnadnění místo slova Mediastreamer2 použijeme jeho českou formu: „mediastreamer“.

Historie jeho vzniku není úplně jasná, ale soudě podle jeho zdrojového kódu, dříve používal knihovnu Glib, což naznačuje možné vzdálené příbuzenství s GStreamer. V porovnání s ním mediastreamer vypadá jako lehčí. První verze Linphone se objevila v roce 2001, takže v současnosti existuje a vyvíjí se už téměř 20 let.

Na základě mediastreameru leží architektura nazývaná „Data flow“ (tok dat). Příklad takové architektury je zobrazen na obrázku níže.

Zkoumáme VoIP engine Mediastreamer2. Část 1

V této architektuře je algoritmus zpracování dat zadán nikoli programovým kódem, ale schématem (grafem) propojení funkcí, které lze uspořádat v libovolném pořadí. Tyto funkce se nazývají filtry.

Taková architektura umožňuje realizovat funkcionalitu zpracování médií ve formě souboru filtrů spojených do schématu zpracování a přenosu RTP provozu VoIP telefonu.

Možnost spojovat filtry do libovolných schémat, jednoduchý vývoj nových filtrů, realizace mediastreameru jako samostatné knihovny, umožňují ho použít i v jiných projektech. Přičemž projekt může být v oblasti VoIP, neboť je zde možnost přidávat filtry vytvořené vlastním způsobem.

Dodávaná knihovna filtrů je dostatečně bohatá a jak již bylo řečeno, může být rozšířena o filtry vlastní výroby. Ale nejprve popíšeme hotové filtry, které jsou dodávány spolu s mediastreamerem. Zde je jejich seznam:

Zvukové filtry

Zachycení a přehrávání zvuku

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android native sound (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Audio Queue Service (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Audio Unit Service (Mac OS X)
  • Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Přehrávač souborů (raw/wav/pcap soubory) (Linux): MS_FILE_PLAYER
  • Přehrávač souborů (raw/wav soubory) (Windows): MS_WINSND_READ
  • Záznam do souboru (wav soubory) (Linux): MS_FILE_REC
  • Záznam do souboru (wav soubory) (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)

Kódování/dekódování zvuku

  • G.711 a-zákon: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-zákon: 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
  • Lineární PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Zpracování zvuku

  • Převod kanálu (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konference: MS_CONF
  • Generátor DTMF: MS_DTMF_GEN
  • Potlačení ozvěny (speex): MS_SPEEX_EC
  • Ekvalizér: MS_EQUALIZER
  • Mixér: MS_MIXER
  • Kompenzátor ztráty paketů (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Detektor tónů: MS_TONE_DETECTOR
  • Ovládání hlasitosti a měření úrovně signálu: MS_VOLUME

Filtry videa

Zachytávání a přehrávání videa

  • Android zachytávání
  • Android přehrávání
  • AV Foundation zachytávání (iOS)
  • AV Foundation přehrávání (iOS)
  • DirectShow zachytávání (Windows)
  • DrawDib přehrávání (Windows)
  • Externí přehrávání — Odeslání videa na vyšší úroveň
  • GLX přehrávání (Linux): MS_GLXVIDEO
  • Mire — Umělý pohyblivý obraz: MS_MIRE
  • OpenGL přehrávání (Mac OS X)
  • OpenGL ES2 přehrávání (Android)
  • Quicktime zachytávání (Mac OS X)
  • SDL přehrávání: MS_SDL_OUT
  • Výstup statických obrázků: MS_STATIC_IMAGE
  • Video For Linux (V4L) zachytávání (Linux): MS_V4L
  • Video For Linux 2 (V4L2) zachytávání (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) zachytávání (Windows)
  • Video4windows (DirectShow) zachytávání (Windows CE)
  • Video For Windows (vfw) zachytávání (Windows)
  • XV přehrávání (Linux)

Kódování/dekódování videa

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

Zpracování videa

  • JPEG snapshot
  • Konvertor pixelového formátu: MS_PIX_CONV
  • Resizer
  • Ostatní filtry
  • Výměna bloků dat mezi vlákny: MS_ITC_SOURCE, MS_ITC_SINK
  • Shromažďování bloků dat z více vstupů na jeden výstup: MS_JOIN
  • RTP příjem/přenos: MS_RTP_SEND, MS_RTP_RECV
  • Kopírování vstupních dat na několik výstupů: MS_TEE
  • Souvislá zátěž: MS_VOID_SINK
  • Zdroj ticha: MS_VOID_SOURCE

Pluginy

Zvukové filtry

  • AMR-NB kodér/dekodér
  • G.729 kodér/dekodér
  • iLBC kodér/dekodér
  • SILK kodér/dekodér

    Filtry videa

  • H.264 softwarový kodér
  • H.264 V4L2 kodér/dekodér s hardwarovým zrychlením

Po krátkém popisu filtru je zobrazen název typu, který se používá při vytváření nového případu tohoto filtru. V dalším textu se na tento seznam budeme odvolávat.

Instalace na Linux Ubuntu

Nyní provedeme instalaci mediastreamera na počítač a sestavíme naši první aplikaci s ním.

Instalace Mediastremer2 na počítač nebo virtuální stroj s Ubuntu nevyžaduje zvláštní dovednosti. V textu dále budeme symbol '$' používat jako výzvu shellu pro zadávání příkazů. Tedy pokud v seznamu vidíte tento symbol na začátku řádku, znamená to, že se jedná o řádek, který ukazuje příkazy k provedení v terminálu.

Předpokládá se, že během provádění kroků popsaných v tomto článku má váš počítač přístup k internetu.

Instalace balíčku libmediastremer-dev

Spouštíme terminál a zadáváme příkaz:

$ sudo apt-get update

Bude vyžadováno heslo pro provedení změn, zadejte je a správce balíčků aktualizuje své databáze. Poté je třeba provést:

$ sudo apt-get install libmediastreamer-dev

Nebudou automaticky staženy a nainstalovány potřebné závislé balíčky a sama knihovna mediastreamera.

Celková velikost stažených deb-balíčků závislostí bude přibližně 35 MB. Podrobnosti o nainstalovaném balíčku lze zjistit příkazem:

$ dpkg -s libmediastreamer-dev

Příklad odpovědi:

Balíček: libmediastreamer-dev
Stav: nainstalováno ok
Priorita: volitelná
Oddíl: libdevel
Nainstalováno-velikost: 244
Udržovatel: Ubuntu Developers 
Architektura: amd64
Zdroje: linphone
Verze: 3.6.1-2.5
Závislosti: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Popis: Mediální knihovna webového telefonu Linphone - vývojové soubory
Linphone je audio a video internetový telefon používající protokol SIP. Má GTK+ a konzolové rozhraní, zahrnuje širokou škálu audio a video kodeků a poskytuje funkce IM.
.
Tento balíček obsahuje vývojové knihovny pro zpracování mediálních operací.
Původní udržovatel: Debian VoIP Team 
Domovská stránka: http://www.linphone.org/

Instalace vývojových nástrojů

Nainstalujeme kompilátor C a s ním související nástroje:

$ sudo apt-get install gcc

Zkontrolujeme výsledek dotazem na verzi kompilátoru:

$ gcc --version

Odpověď by měla vypadat přibližně takto:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Toto je svobodný software; viz zdroj pro podmínky kopírování. Neexistuje žádná
záruka; ani za OBCHODOVATELNOST nebo VHODNOST PRO URČITÝ ÚČEL.

Sestavení a spuštění zkušební aplikace

Vytvoříme v home adresář pro naše výukové projekty, pojmenujeme ho mstutorial:

$ mkdir ~/mstutorial

Použijte svůj oblíbený textový editor a vytvořte soubor C programu s názvem mstest.c s následujícím obsahem:

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

Inicializuje mediastreamer, vytiskne pozdrav a ukončí provádění.

Soubor uložíme a zkompilujeme testovací aplikaci příkazem:

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

Všimněte si, že řetězec

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

je uzavřen v uvozovkách, které se nacházejí na klávesnici tam, kde je také písmeno «Ё».

Pokud soubor neobsahuje chyby, po kompilaci se v adresáři objeví soubor mstest. Spustíme program:

$ .\/mstest

Výsledek bude vypadat takto:

ALSA lib conf.c:4738:(snd_config_expand) Neznámé parametry 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Neplatné CTL default:0
ortp-warning-Nepodařilo se připojit mixer k kartě: Neplatný argument
ALSA lib conf.c:4738:(snd_config_expand) Neznámé parametry 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Neznámé PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Neznámé parametry 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Neznámé PCM default:0
ortp-warning-Zvláštní, zvuková karta HDA Intel PCH se zdá být neschopná čehokoliv, opakujeme s plughw...
Mediastreamer je připraven.

V tomto výpisu vidíme chybové zprávy, které generuje knihovna ALSA, ta se používá k řízení zvukové karty. Sami vývojáři mediastreameru považují za normální, že se tyto zprávy objevují. My s nimi v tomto případě svým způsobem souhlasíme.

Teď máme všechno připraveno pro práci s mediastreamerem. Nainstalovali jsme knihovnu mediastreameru, kompilátor a s pomocí testovací aplikace jsme ověřili, že nástroje jsou nastaveny a mediastreamer se úspěšně inicializuje.

V následující článku vytvoříme aplikaci, která shromáždí a spustí zpracování zvukového signálu v řetězci několika filtrů.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster