Prozkoumání enginu Mediastreamer2 VoIP. Část 1

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

úvod

Tento článek je začátkem série článků o zpracování médií v reálném čase pomocí enginu Mediastreamer2. Prezentace bude zahrnovat minimální dovednosti práce v linuxovém terminálu a programování v jazyce C.

Mediastreamer2 je VoIP engine stojící za populárním open source softwarovým projektem voip telefonu. telefon. V Linphone Mediastreamer2 implementuje všechny funkce související se zvukem a videem. Podrobný seznam funkcí motoru lze vidět na této stránce Mediastreamer. Zdrojový kód je zde: GitLab.

Dále v textu budeme pro usnadnění místo slova Mediastreamer2 používat jeho ruský zápis: „media streamer“.

Historie jejího vzniku není zcela jasná, ale soudě podle zdrojového kódu dříve knihovnu využívala glib, který jakoby naznačuje možnou vzdálenou příbuznost s GStreamer. Ve srovnání s nimi vypadá streamer médií lehčí. První verze Linphone se objevila v roce 2001, takže v současné době mediální streamer existuje a vyvíjí se téměř 20 let.

Srdcem streameru médií je architektura zvaná "Data flow" (datový tok). Příklad takové architektury je znázorněn na obrázku níže.

Prozkoumání enginu Mediastreamer2 VoIP. Část 1

V této architektuře není algoritmus zpracování dat specifikován programovým kódem, ale schématem (grafem) pro spojování funkcí, které mohou být uspořádány v libovolném pořadí. Tyto funkce se nazývají filtry.

Tato architektura umožňuje implementovat funkcionalitu zpracování médií ve formě sady filtrů připojených k schématu zpracování a přenosu RTP provozu VoIP telefonu.

Schopnost kombinovat filtry do libovolných schémat, jednoduchý vývoj nových filtrů, implementace media streameru jako samostatné samostatné knihovny, umožňují jeho použití v dalších projektech. Kromě toho může být projekt v oblasti VoIP, protože je možné přidat filtry vyrobené vlastními silami.

Standardně dodávaná knihovna filtrů je poměrně bohatá a jak již bylo řečeno, lze ji rozšířit o filtry vlastní konstrukce. Nejprve si ale popišme hotové filtry, které jsou součástí media streameru. Zde je jejich seznam:

Zvukové filtry

Snímání a přehrávání zvuku

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Nativní zvuk Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Služba zvukové fronty (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Služba zvukové jednotky (Mac OS X)
  • Umění (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Přehrávač souborů (soubory raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Přehrávač souborů (soubory raw/wav) (Windows): MS_WINSND_READ
  • Zápis do souboru (soubory wav) (Linux): MS_FILE_REC
  • Zápis do souboru (soubory wav) (Windows): MS_WINSND_WRITE
  • Zvuková jednotka Mac (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
  • Zvuk systému Windows (Windows)

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

  • G.711 a-law: 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álů (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
  • Převzorkovač: MS_RESAMPLE
  • Tónový detektor: MS_TONE_DETECTOR
  • Ovládání hlasitosti a měření úrovně signálu: MS_VOLUME

Video filtry

Snímání a přehrávání videa

  • zachycení androidu
  • přehrávání android
  • AV Foundation capture (iOS)
  • Přehrávání AV Foundation (iOS)
  • DirectShow Capture (Windows)
  • Přehrávání DrawDib (Windows)
  • Externí přehrávání – Odeslání videa do horní vrstvy
  • Přehrávání GLX (Linux): MS_GLXVIDEO
  • Mire - Syntetický pohyblivý obraz: MS_MIRE
  • Přehrávání OpenGL (Mac OS X)
  • Přehrávání OpenGL ES2 (Android)
  • Quicktime Capture (Mac OS X)
  • Přehrávání SDL: MS_SDL_OUT
  • Výstup statického obrazu: MS_STATIC_IMAGE
  • Video pro Linux (V4L) zachycení (Linux): MS_V4L
  • Video pro Linux 2 (V4L2) zachycení (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) zachycení (Windows)
  • Video4windows (DirectShow) zachycení (Windows CE)
  • Video pro Windows (vfw) zachycení (Windows)
  • Přehrávání XV (Linux)

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

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

Zpracování videa

  • snímek jpeg
  • Převodník formátu pixelů: MS_PIX_CONV
  • Resizer
  • Jiné filtry
  • Výměna datových bloků mezi vlákny: MS_ITC_SOURCE, MS_ITC_SINK
  • Shromažďování bloků dat z více vstupů do jednoho výstupu: MS_JOIN
  • RTP příjem/vysílání: MS_RTP_SEND, MS_RTP_RECV
  • Kopírování vstupních dat na více výstupů: MS_TEE
  • Ukončené zatížení: MS_VOID_SINK
  • Ticho Zdroj: MS_VOID_SOURCE

Плагины

Zvukové filtry

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

    Video filtry

  • Softwarový kodér H.264
  • H.264 V4L2 hardwarově akcelerovaný kodér/dekodér

Po krátkém popisu filtru se zobrazí název typu, který je použit při vytváření nové instance tohoto filtru. V následujícím se budeme odvolávat na tento seznam.

Instalace pod Linuxem Ubuntu

Nyní nainstalujeme streamer médií do počítače a vytvoříme s ním naši první aplikaci.

Instalace Mediastremer2 na počítač nebo virtuální stroj se systémem Ubuntu nevyžaduje žádné speciální dovednosti. Zde a níže bude symbol "$" označovat výzvu shellu pro zadávání příkazů. Tito. pokud ve výpisu vidíte tento symbol na začátku řádku, pak je to řádek, ve kterém jsou zobrazeny příkazy, které mají být provedeny v terminálu.

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

Instalace balíčku libmediastremer-dev

Spusťte terminál a zadejte příkaz:

$ sudo apt-get update

Budete požádáni o heslo pro provedení změn, zadejte je a správce balíčků aktualizuje své databáze. Poté musíte spustit:

$ sudo apt-get install libmediastreamer-dev

Potřebné balíčky závislostí a samotná knihovna pro streamování médií budou automaticky staženy a nainstalovány.

Celková velikost stažených závislých deb balíčků bude přibližně 35 MB. Podrobnosti o nainstalovaném balíčku lze nalézt pomocí příkazu:

$ dpkg -s libmediastreamer-dev

Příklad odpovědi:

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/

Instalace vývojových nástrojů

Nainstalujte kompilátor C a jeho doprovodné nástroje:

$ sudo apt-get install gcc

Výsledek zkontrolujeme dotazem na verzi kompilátoru:

$ gcc --version

Odpověď by měla znít nějak takto:

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.

Vytvoření a spuštění zkušební aplikace

Tvoříme v domov složka pro naše výukové projekty, říkejme tomu mstutorial:

$ mkdir ~/mstutorial

Použijte svůj oblíbený textový editor a vytvořte soubor programu C 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 streamer médií, vytiskne pozdrav a ukončí se.

Uložte soubor a zkompilujte testovací aplikaci pomocí příkazu:

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

Všimněte si, že řádek

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

uzavřeny v uvozovkách, které jsou umístěny na klávesnici na stejném místě jako písmeno "Ё".

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

$ ./mstest

Výsledek bude takový:

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.

V tomto výpisu vidíme chybové zprávy, které zobrazuje knihovna ALSA, slouží k ovládání zvukové karty. Sami vývojáři media streameru věří, že je to normální. V tomto případě s nimi chtě nechtě souhlasíme.

Nyní jsme všichni připraveni pracovat s mediálním streamerem. Nainstalovali jsme knihovnu pro streamování médií, nástroj pro kompilaci a pomocí zkušební aplikace jsme ověřili, že jsou nástroje nakonfigurovány a že se streamer médií úspěšně inicializuje.

další článek vytvoříme aplikaci, která sestaví a spustí zpracování audio signálu v řetězci několika filtrů.

Zdroj: www.habr.com