A VoIP-motor Mediastreamer2 tanulmányozása. 1. rész

A cikk anyaga az én Dzen csatornámból származik.

Bevezetés

Ez a cikk a Mediastreamer2 motor segítségével történő valós idejű médiafeldolgozásról szóló cikkek sorozatának kezdete. A későbbiekben minimális Linux terminál használati és C nyelv programozási ismeretekre lesz szükség.

A Mediastreamer2 egy VoIP-motor, amely a népszerű nyílt forráskódú voip-telefon projekt alapját képezi. Linphone. A Linphone-ban a Mediastreamer2 valósítja meg az összes hanggal és videóval kapcsolatos funkciót. A motor lehetőségeinek részletes listáját ezen az oldalon találhatja: Mediastreamer. A forráskód itt található: GitLab.

A további szövegben az egyszerűsítés kedvéért a Mediastreamer2 szót orosz megnevezésével, azaz „médiastrímelő”-ként használjuk.

A létrehozásának története nem teljesen világos, de a forráskódja alapján korábban a Glibkönyvtárat használta, ami arra utal, hogy lehet valamilyen távoli rokonságban áll a GStreamer-rel. A médiastrímelő a GStreamer-hez képest könnyebbnek tűnik. A Linphone első verziója 2001-ben jelent meg, így a médiastrímelő már közel 20 éve létezik és fejlődik.

A médiastrímelő alapja a „Data flow” (adatfolyam) nevű architektúra. Az alábbi ábrán egy ilyen architektúra látható.

A VoIP-motor Mediastreamer2 tanulmányozása. 1. rész

Ebben az architektúrában az adatfeldolgozás algoritmusát nem programkód határozza meg, hanem a funkciók kapcsolódási sémája (gráfja), amelyet bármilyen sorrendben fel lehet építeni. Ezeket a funkciókat szűrőknek nevezik.

Ez az architektúra lehetővé teszi a médiafeldolgozás funkciójának egy szűrőkészlet formájában való megvalósítását, amelyeket egy RTP-trafik VoIP-telefon feldolgozási és továbbítási sémájában kötnek össze.

A szűrők tetszőleges sémákba való összekapcsolásának lehetősége, az új szűrők egyszerű fejlesztése, és a médiastrímelő önálló könyvtárként való megvalósítása lehetővé teszi, hogy más projektekben is használhassuk. A projekt lehet a VoIP területén, mivel lehetőség van saját készítésű szűrők hozzáadására.

Az alapértelmezett könyvtár a szűrőkből eléggé gazdag, és ahogy már említettük, saját fejlesztésű szűrőkkel is bővíthető. De először is ismertetjük azokat a kész szűrőket, amelyeket a médiastrímelőhöz szállítanak. Íme a lista:

Hangsűrítők

Hang rögzítése és lejátszása

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android natív hang (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
  • Fájllejátszó (raw/wav/pcap fájlok) (Linux): MS_FILE_PLAYER
  • Fájllejátszó (raw/wav fájlok) (Windows): MS_WINSND_READ
  • Fájlba történő felvétel (wav fájlok) (Linux): MS_FILE_REC
  • Fájlba történő felvétel (wav fájlok) (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)

Hangkódolás/dekódolás

  • G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-law: 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áris PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Hangelőadás

  • Csatornákkonvertálás (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferencia: MS_CONF
  • DTMF generátor: MS_DTMF_GEN
  • Visszhanggal szembeni elnyomás (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Csomagvesztési kompenzátor (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Hangfrekvencia-detektor: MS_TONE_DETECTOR
  • Hangerő- és jelszintmérés: MS_VOLUME

Videofilterek

Videó rögzítése és lejátszása

  • Android rögzítés
  • Android lejátszás
  • AV Foundation rögzítés (iOS)
  • AV Foundation lejátszás (iOS)
  • DirectShow rögzítés (Windows)
  • DrawDib lejátszás (Windows)
  • Külső lejátszás – Videó küldése a legfelső szintre
  • GLX lejátszás (Linux): MS_GLXVIDEO
  • Mire – Szintetikus mozgóképek: MS_MIRE
  • OpenGL lejátszás (Mac OS X)
  • OpenGL ES2 lejátszás (Android)
  • Quicktime rögzítés (Mac OS X)
  • SDL lejátszás: MS_SDL_OUT
  • Statikus képek kiadása: MS_STATIC_IMAGE
  • Video For Linux (V4L) rögzítés (Linux): MS_V4L
  • Video For Linux 2 (V4L2) rögzítés (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) rögzítés (Windows)
  • Video4windows (DirectShow) rögzítés (Windows CE)
  • Video For Windows (vfw) rögzítés (Windows)
  • XV lejátszás (Linux)

Videokódolás/dekódolás

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (csak dekóder): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Videófeldolgozás

  • JPEG pillanatfelvétel
  • Pixelformátum konverter: MS_PIX_CONV
  • Átméretező
  • Egyéb szűrők
  • Adatblokkok cseréje szálak között: MS_ITC_SOURCE, MS_ITC_SINK
  • Több bemenet összegyűjtése egy kimenetre: MS_JOIN
  • RTP vétel/küldés: MS_RTP_SEND, MS_RTP_RECV
  • Bemenetek másolása több kimenetre: MS_TEE
  • Konzisztens teher: MS_VOID_SINK
  • Csendforrás: MS_VOID_SOURCE

Bővítmények

Hangsűrítők

  • AMR-NB kódoló/dekódoló
  • G.729 kódoló/dekódoló
  • iLBC kódoló/dekódoló
  • SILK kódoló/dekódoló

    Videofilterek

  • H.264 programozott kódoló
  • H.264 V4L2 kódoló/dekódoló hardvergyorsítással

A rövid szűrési leírás után látható a típusa, amelyet az adott szűrő új példányának létrehozásakor használnak. A továbbiakban erre a listára fogunk hivatkozni.

Telepítés Linux Ubuntu alatt

Most telepítjük a médiastreamert a számítógépre, és összegyűjtjük első alkotásunkat vele.

A Mediastremer2 számítógépre vagy Virtuális gépre történő telepítése Ubuntu alatt különösebb készségeket nem igényel. A továbbiakban a '$' jellel jelöljük a parancssor promptját, ahol parancsokat kell beírni. Ez azt jelenti, hogy ha a listában ezt a jelet látja a sor elején, akkor az a sor a terminálban végrehajtandó parancsokat mutatja.

Feltételezzük, hogy a cikk végrehajtása során számítógépe csatlakozik az internethez.

A libmediastremer-dev csomag telepítése

Megnyitjuk a terminált és beírjuk a parancsot:

$ sudo apt-get update

A módosításokhoz jelszót kér, írja be, és a csomagkezelő frissíti az adatbázisait. Ezt követően el kell végeznünk:

$ sudo apt-get install libmediastreamer-dev

A szükséges függőségi csomagok és a médiastreamer könyvtár automatikusan letöltődik és telepítésre kerül.

A letöltött deb-csomagok összmérete körülbelül 35 MB lesz. Az telepített csomagra vonatkozó részleteket a következő paranccsal lehet megismerni:

$ dpkg -s libmediastreamer-dev

Példa válasz:

Csomag: libmediastreamer-dev
Állapot: megfelelő telepített
Prioritás: opcionális
Szakasz: libdevel
Telepített méret: 244
Fenntartó: Ubuntu Fejlesztők <ubuntu-devel-discuss@lists.ubuntu.com>
Architektúra: amd64
Forrás: linphone
Verzió: 3.6.1-2.5
Függőségek: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Leírás: Linphone web telefon médiakönyvtára - fejlesztési fájlok
A Linphone egy audio- és videointernet telefon, amely a SIP protokollt használja.
GTK+ és konzol felülettel rendelkezik, számos audio- és videó kodek található benne, valamint IM funkciókat biztosít.
.
Ez a csomag tartalmazza a médiaműveletek kezelésére szolgáló fejlesztési könyvtárakat.
Eredeti fenntartó: Debian VoIP Csapat <pkg-voip-maintainers@lists.alioth.debian.org>
Weboldal: http://www.linphone.org/

Fejlesztői eszközök telepítése

Telepítjük a C fordítót és a hozzá kapcsolódó eszközöket:

$ sudo apt-get install gcc

Ellenőrizzük az eredményt a fordító verziójának lekérdezésével:

$ gcc --version

A válasz körülbelül a következőképpen kell kinézzen:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Ez egy szabad szoftver; lásd a forrást a másolási feltételekért. Nincs
garancia; még a KERESKEDELMI minőségre vagy A HELYES CÉLRA sem.

Kísérleti alkalmazás építése és futtatása

Létrehozunk egy home mappát tanulmányi projektjeink céljára, nevezzük el mstutorial:

$ mkdir ~/mstutorial

Használja kedvenc szövegszerkesztőjét, és hozzon létre egy C-programot a következő néven: mstest.c az alábbi tartalommal:

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

Ez inicializálja a médiastreamert, üdvözletet nyomtat, majd befejezi a végrehajtást.

Mentse el a fájlt, és fordítsa le a tesztalkalmazást a következő paranccsal:

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

Vegye észre, hogy a sor

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

idézőjelek között van, amelyek a billentyűzeten a 'Ё' betű mellett találhatók.

Ha a fájlban nincsenek hibák, a fordítás után megjelenik egy mstestfájl a könyvtárban. Futtassa a programot:

$ . /mstest

Az eredmény a következő lesz:

ALSA lib conf.c:4738:(snd_config_expand) Ismeretlen paraméterek 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Érvénytelen CTL default:0
ortp-warning-Nem sikerült csatlakoztatni a keverőt a kártyához: Érvénytelen érv
ALSA lib conf.c:4738:(snd_config_expand) Ismeretlen paraméterek 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Ismeretlen PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Ismeretlen paraméterek 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Ismeretlen PCM default:0
ortp-warning-Furcsa, a HDA Intel PCH hangkártya nem tűnik képesnek semmire, újrapróbálkozás a plughw használatával...
Mediastreamer készen áll.

Ebben a listában látjuk az ALSA könyvtár által kiírt hibajelzéseket, amely a hangkártya irányítására szolgál. A médiastreamer fejlesztői ezt normálisnak tartják. Mi ebben az esetben kénytelenek vagyunk egyetérteni velük.

Most minden készen áll a médiastreamer használatához. Telepítettük a médiastreamer könyvtárat, a fordítóeszközt, és egy tesztalkalmazással ellenőriztük, hogy az eszközök be vannak állítva, valamint a médiastreamer sikeresen inicializálódik.

A következő a Spotify döntéshozatali módszertanáról. Egyre több felhasználó preferálja a zenehallgatást mobilon a streaming szolgáltatásban, de a cégnél túlnyomórészt webprogramozók dolgoznak. A Spotify elemezte ezt a helyzetet, és úgy döntött, hogy több mobilfejlesztőt vesz fel, valamint átnevezi a webes szakembereket új irányba: cikkben létrehozunk egy alkalmazást, amely összegyűjti és elindítja a hangjelet több szűrőből álló láncban.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster