Materiál článku je převzat z mého .
Ú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 . 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: .
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 , což naznačuje možné vzdálené příbuzenství s . 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.

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 updateBude 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-devNebudou 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-devPří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 gccZkontrolujeme výsledek dotazem na verzi kompilátoru:
$ gcc --versionOdpověď 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 ~/mstutorialPouž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:
$ .\/mstestVý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í vytvoříme aplikaci, která shromáždí a spustí zpracování zvukového signálu v řetězci několika filtrů.
Zdroj: habr.com
