Skúmanie enginu Mediastreamer2 VoIP. Časť 1

Materiál článku je prevzatý z môjho zenový kanál.

Úvod

Tento článok je začiatkom série článkov o spracovaní médií v reálnom čase pomocou enginu Mediastreamer2. Počas prezentácie budú zahrnuté minimálne zručnosti v práci v linuxovom termináli a programovaní v jazyku C.

Mediastreamer2 je modul VoIP, ktorý stojí za populárnym projektom voip telefónov s otvoreným zdrojovým kódom. telefón. V Linphone Mediastreamer2 implementuje všetky funkcie týkajúce sa zvuku a videa. Podrobný zoznam funkcií motora si môžete pozrieť na tejto stránke Mediastreamer. Zdrojový kód je tu: GitLab.

Ďalej v texte pre pohodlie namiesto slova Mediastreamer2 použijeme jeho ruský zápis: „media streamer“.

História jeho vzniku nie je úplne jasná, ale súdiac podľa zdrojového kódu, predtým využíval knižnicu glib, ktorý akoby naznačuje možný vzdialený vzťah s GStreamer. V porovnaní s ktorým mediálny streamer vyzerá ľahšie. Prvá verzia Linphone sa objavila v roku 2001, takže v súčasnosti mediálny streamer existuje a vyvíja sa takmer 20 rokov.

Srdcom streamera médií je architektúra nazývaná „Data flow“ (tok údajov). Príklad takejto architektúry je znázornený na obrázku nižšie.

Skúmanie enginu Mediastreamer2 VoIP. Časť 1

V tejto architektúre nie je algoritmus spracovania dát špecifikovaný programovým kódom, ale schémou (grafom) na prepojenie funkcií, ktoré môžu byť usporiadané v ľubovoľnom poradí. Tieto funkcie sa nazývajú filtre.

Táto architektúra umožňuje implementovať funkcionalitu spracovania médií vo forme sady filtrov zapojených do schémy na spracovanie a prenos RTP prevádzky telefónu VoIP.

Schopnosť kombinovať filtre do ľubovoľných schém, jednoduchý vývoj nových filtrov, implementácia media streamera ako samostatnej samostatnej knižnice, umožňujú jeho využitie aj v iných projektoch. Okrem toho môže byť projekt v oblasti VoIP, pretože je možné pridať filtre vyrobené sami.

Štandardne dodávaná knižnica filtrov je pomerne bohatá a ako už bolo spomenuté, je možné ju rozšíriť o filtre vlastnej konštrukcie. Najprv si však popíšeme hotové filtre, ktoré sa dodávajú so streamerom médií. Tu je ich zoznam:

Zvukové filtre

Snímanie a prehrávanie zvuku

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Natívny zvuk Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Služba zvukového frontu (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Služba zvukovej jednotky (Mac OS X)
  • Umenie (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Prehrávač súborov (súbory raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Prehrávač súborov (súbory raw/wav) (Windows): MS_WINSND_READ
  • Zápis do súboru (súbory wav) (Linux): MS_FILE_REC
  • Zápis do súboru (súbory 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ódovanie/dekódovanie 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árne PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Spracovanie zvuku

  • Konverzia kanálov (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferencia: MS_CONF
  • Generátor DTMF: MS_DTMF_GEN
  • Potlačenie ozveny (speex): MS_SPEEX_EC
  • Ekvalizér: MS_EQUALIZER
  • Mixér: MS_MIXER
  • Kompenzátor straty paketov (PLC): MS_GENERIC_PLC
  • Prevzorkovač: MS_RESAMPLE
  • Tónový detektor: MS_TONE_DETECTOR
  • Ovládanie hlasitosti a meranie úrovne signálu: MS_VOLUME

Video filtre

Snímanie a prehrávanie videa

  • android snímanie
  • prehrávanie v systéme Android
  • AV Foundation capture (iOS)
  • Prehrávanie AV Foundation (iOS)
  • DirectShow Capture (Windows)
  • Prehrávanie DrawDib (Windows)
  • Externé prehrávanie – odosielanie videa do hornej vrstvy
  • Prehrávanie GLX (Linux): MS_GLXVIDEO
  • Mire - Syntetický pohyblivý obraz: MS_MIRE
  • Prehrávanie OpenGL (Mac OS X)
  • Prehrávanie OpenGL ES2 (Android)
  • Quicktime Capture (Mac OS X)
  • Prehrávanie SDL: MS_SDL_OUT
  • Výstup statického obrazu: MS_STATIC_IMAGE
  • Zachytenie videa pre Linux (V4L) (Linux): MS_V4L
  • Zachytenie videa pre Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Snímanie Video4windows (DirectShow) (Windows)
  • Snímanie Video4windows (DirectShow) (Windows CE)
  • Zachytenie videa pre Windows (vfw) (Windows)
  • Prehrávanie XV (Linux)

Kódovanie/dekódovanie videa

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, sneh: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (len dekodér): MS_H264_DEC
  • Teória: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Spracovanie videa

  • snímka jpeg
  • Konvertor formátu pixelov: MS_PIX_CONV
  • Resizer
  • Iné filtre
  • Výmena dátových blokov medzi vláknami: MS_ITC_SOURCE, MS_ITC_SINK
  • Zhromažďovanie blokov údajov z viacerých vstupov do jedného výstupu: MS_JOIN
  • RTP príjem/prenos: MS_RTP_SEND, MS_RTP_RECV
  • Kopírovanie vstupných údajov do viacerých výstupov: MS_TEE
  • Ukončené zaťaženie: MS_VOID_SINK
  • Ticho Zdroj: MS_VOID_SOURCE

Pluginy

Zvukové filtre

  • AMR-NB kodér/dekodér
  • kódovač/dekodér G.729
  • iLBC kodér/dekodér
  • SILK kodér/dekodér

    Video filtre

  • Softvérový kódovač H.264
  • H.264 V4L2 hardvérovo akcelerovaný kodér/dekodér

Po krátkom popise filtra sa zobrazí názov typu, ktorý sa použije pri vytváraní novej inštancie tohto filtra. V nasledujúcom texte sa budeme odvolávať na tento zoznam.

Inštalácia pod Linuxom Ubuntu

Teraz nainštalujeme streamer médií do počítača a vytvoríme s ním našu prvú aplikáciu.

Inštalácia Mediastremer2 na počítač alebo virtuálny stroj so systémom Ubuntu nevyžaduje žiadne špeciálne zručnosti. Tu a nižšie bude symbol "$" označovať výzvu shellu na zadávanie príkazov. Tie. ak vo výpise vidíte tento symbol na začiatku riadku, potom je to riadok, v ktorom sú zobrazené príkazy, ktoré sa majú vykonať v termináli.

Predpokladá sa, že počas krokov v tomto článku má váš počítač prístup na internet.

Inštalácia balíka libmediastremer-dev

Spustite terminál a zadajte príkaz:

$ sudo apt-get update

Na vykonanie zmien budete požiadaní o heslo, zadajte ho a správca balíkov aktualizuje svoje databázy. Potom musíte spustiť:

$ sudo apt-get install libmediastreamer-dev

Automaticky sa stiahnu a nainštalujú potrebné balíčky závislostí a samotná knižnica streamovania médií.

Celková veľkosť stiahnutých deb balíčkov závislostí bude približne 35 MB. Podrobnosti o nainštalovanom balíku nájdete pomocou príkazu:

$ dpkg -s libmediastreamer-dev

Príklad odpovede:

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/

Inštalácia vývojových nástrojov

Nainštalujte kompilátor C a jeho sprievodné nástroje:

$ sudo apt-get install gcc

Výsledok skontrolujeme dotazom na verziu kompilátora:

$ gcc --version

Odpoveď by mala byť asi takáto:

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.

Vytvorenie a spustenie skúšobnej aplikácie

Tvoríme v domov priečinok pre naše výukové projekty, nazvime to mstutorial:

$ mkdir ~/mstutorial

Použite svoj obľúbený textový editor a vytvorte súbor programu C s názvom mstest.c s nasledujúcim obsahom:

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

Inicializuje streamer médií, vytlačí pozdrav a ukončí sa.

Uložte súbor a zostavte testovaciu aplikáciu pomocou príkazu:

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

Všimnite si, že riadok

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

v úvodzovkách, ktoré sú umiestnené na klávesnici na rovnakom mieste ako písmeno „Ё“.

Ak súbor neobsahuje chyby, po kompilácii sa v adresári objaví súbor mstest. Spustíme program:

$ ./mstest

Výsledok bude takýto:

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ýpise vidíme chybové hlásenia, ktoré zobrazuje knižnica ALSA, slúži na ovládanie zvukovej karty. Samotní vývojári mediálneho streamera veria, že je to normálne. V tomto prípade s nimi len neochotne súhlasíme.

Teraz sme všetci pripravení pracovať s mediálnym streamerom. Nainštalovali sme knižnicu streamovania médií, nástroj na kompiláciu a pomocou skúšobnej aplikácie sme overili, či sú nástroje nakonfigurované a či sa streamer médií úspešne inicializuje.

Ďalšie článok vytvoríme aplikáciu, ktorá zostaví a spustí spracovanie zvukového signálu v reťazci niekoľkých filtrov.

Zdroj: hab.com