Uurime VoIP-mootorit Mediastreamer2. Osa 1

Artikli sisu on pärit minu zen-kanalist.

Sissejuhatus

See artikkel on algusartiklite seeriast, mis käsitleb reaalajas meediateabe töötlemist Mediastreamer2 mootoriga. Teema käsitlemisel on vajalikud põhioskused Linuxi terminali kasutamisel ja C keeles programmeerimisel.

Mediastreamer2 on VoIP-mootor, mis on aluseks populaarsele avatud lähtekoodiga VoIP-telefoniprojektile Linphone. Linphone's Mediastreamer2 rakendab kõiki heliga ja videoga seotud funktsioone. Mootori võimaluste üksikasjaliku loendi leiate Mediastreameri lehelt. Allika kood on siin: GitLab.

Edasiulatuvalt tekstis kasutame mugavuse tõttu sõna Mediastreamer2 asemel selle vene nimetust: «midiStreaming».

Selle loomise ajalugu ei ole täiesti selge, kuid arvestades selle lähtekoodi, on varasemalt kasutatud raamatukogu Glib, mis viitab meile võimaliku kauge suguluse olemasolule GStreamer. Võrreldes temaga näeb mediast streamer välja kergem. Esimene versioon Linphone’ist ilmus 2001. aastal, seega on mediastreamer olemas ja areneb käesoleval hetkel vähem kui 20 aastat.

Mediastreameri aluseks on arhitektuur, mida nimetatakse «Data flow» (andmete voog). Sellise arhitektuuri näide on alloleval joonisel.

Uurime VoIP-mootorit Mediastreamer2. Osa 1

Selles arhitektuuris määratakse andmete töötlemise algoritm mitte programmikoodiga, vaid funktsioonide ühendamise skeemiga (graaf), mida saab üles ehitada igas järjestuses. Nende funktsioonide nimetatakse filtriteks.

Selline arhitektuur võimaldab rakendada meedia töötlemise funktsionaalsust filtrite kogumina, mis on ühendatud VoIP-telefonide RTP-liiklust töötleva ja edastava skeemiga.

Filtreid on võimalik ühendada vabalt skeemidesse, uute filtrite lihtne väljatöötamine ning mediastreamer'i elluviimine iseseisva eraldi teegina, võimaldab selle kasutamist ka teistes projektides. Lisaks võib projekt olla VoIP valdkonnas, kuna on võimalik lisada käsitsi valmistatud filtreid.

Vaikimisi tarnitav filtrite teek on piisavalt rikas ja nagu juba öeldud, võib seda laiendada oma arendatud filtritega. Kuid kõigepealt kirjeldame valmis filtreid, mis tarnitakse koos mediastreamer'iga. Siin on nende nimekiri:

Helifiltrid

Heli salvestamine ja esitamine

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Androidi kohalik heli (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)
  • Helid (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Failide mängija (raw/wav/pcap failid) (Linux): MS_FILE_PLAYER
  • Failide mängija (raw/wav failid) (Windows): MS_WINSND_READ
  • Faili salvestamine (wav failid) (Linux): MS_FILE_REC
  • Faili salvestamine (wav failid) (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)

Heli kodeerimine/dekodeerimine

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

Heli töötlemine

  • Kanali muundamine (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konverents: MS_CONF
  • DTMF generaator: MS_DTMF_GEN
  • Kaja summutamine (speex): MS_SPEEX_EC
  • Ekvalaiser: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Pakettide kaotsimineku kompensaator (PLC): MS_GENERIC_PLC
  • Uuesti näidik: MS_RESAMPLE
  • Heli detektor: MS_TONE_DETECTOR
  • Heli kõvemuse juhtimine ja signaali taseme mõõtmine: MS_VOLUME

Videofilterid

Video haaramine ja esitamine

  • Androidi haaramine
  • Androidi esitamine
  • AV Foundation haaramine (iOS)
  • AV Foundation esitamine (iOS)
  • DirectShow haaramine (Windows)
  • DrawDib esitamine (Windows)
  • Väline esitamine — Video saatmine ülemisele tasemele
  • GLX esitamine (Linux): MS_GLXVIDEO
  • Mire — sünteetiline liikuva pildi esitamine: MS_MIRE
  • OpenGL esitamine (Mac OS X)
  • OpenGL ES2 esitamine (Android)
  • Quicktime salvestamine (Mac OS X)
  • SDL esitamine: MS_SDL_OUT
  • Staaticute piltide väljund: MS_STATIC_IMAGE
  • Video Linuxi jaoks (V4L) salvestamine (Linux): MS_V4L
  • Video Linuxi jaoks 2 (V4L2) salvestamine (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) salvestamine (Windows)
  • Video4windows (DirectShow) salvestamine (Windows CE)
  • Windowsi video (vfw) salvestamine (Windows)
  • XV esitamine (Linux)

Video kodeerimine/dekodeerimine

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

Video töötlemine

  • JPEG hetkefoto
  • Piksli vormingu konverter: MS_PIX_CONV
  • Resize
  • Muud filtrid
  • Andmeplokkide vahetamine lõimede vahel: MS_ITC_SOURCE, MS_ITC_SINK
  • Andmeplokkide kogumine mitmest sisendist ühte väljundisse: MS_JOIN
  • RTP vastuvõtt/edastamine: MS_RTP_SEND, MS_RTP_RECV
  • Sisendi koopiate edastamine mitmele väljundile: MS_TEE
  • Sünkroniseeritud koormus: MS_VOID_SINK
  • Vaikuse allikas: MS_VOID_SOURCE

Pluginad

Helifiltrid

  • AMR-NB kodeerija/dekoodeerija
  • G.729 kodeerija/dekoodeerija
  • iLBC kodeerija/dekoodeerija
  • SILK kodeerija/dekoodeerija

    Videofilterid

  • H.264 tarkvaraline kodeerija
  • H.264 V4L2 kodeerija/dekoodeerija riistvaralise kiirendusega

Filtri lühikokkuvõtte järel kuvatakse tüübi nimi, mida kasutatakse selle filtrielemendi loomisel. Edasi viidates nimetame seda nimekirja.

Paigaldamine Linux Ubuntu süsteemi

Nüüd paigaldame meedia striimimise tarkvara arvutisse ja loome sellega oma esimese rakenduse.

Mediastremer2 paigaldamine arvutisse või virtuaalmasinasse, mis töötab Ubuntu peal, ei nõua erilisi oskusi. Edaspidi tähistame sümboliga „$” shellikäivitussoovi, kus käske sisestada. Kui loendis näete seda sümbolit rea alguses, tähendab see, et seal on näidatud käsud, mida tuleb terminalis käivitada.

Eeldatakse, et nende käskude käitamise ajal on teie arvutil juurdepääs Internetile.

Paketi libmediastremer-dev paigaldamine

Avame terminali ja sisestame käsu:

$ sudo apt-get update

Küsinud parooli muudatuste tegemiseks, sisestage see ja pakihaldur uuendab oma andmebaase. Seejärel tuleb täita:

$ sudo apt-get install libmediastreamer-dev

Nõutavad sõltuvuspaketid ja meedia striimimise teek installitakse automaatselt.

Allalaaditud deb-sõltuvuste kogumaht on umbes 35 MB. Teavet installitud paketi kohta saab vaadata käsuga:

$ dpkg -s libmediastreamer-dev

Näidis vastus:

Pakett: libmediastreamer-dev
Oleku: install OK installed
Prioriteet: valikuline
Jaotis: libdevel
Installitud suurus: 244
Hooldaja: Ubuntu Developers 
Arhitektuur: amd64
Allikas: linphone
Versioon: 3.6.1-2.5
Sõltuvused: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Kirjeldus: Linphone veebitelefoni meediakogu - arendusfailid
Linphone on SIP-protokolli kasutav audio- ja videotelefon. Sellel
on GTK+ ja konsooli liides, see sisaldab suurt valikut audio- ja videokoodekeid
ning pakub IM-funktsioone.
.
See pakett sisaldab arendusteegi, mis käsitleb meediaoperatsioone.
Algne hooldaja: Debian VoIP Team 
Avaleht: http://www.linphone.org/

Arendustööriistade installimine

Installime C keele kompilaatori ja sellega seotud tööriistad:

$ sudo apt-get install gcc

Kontrollime tulemust, küsi kompilaatori versiooni:

$ gcc --version

Vastus peaks olema umbes selline:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Kopeerimisõigusi (C) 2015 Free Software Foundation, Inc.
See on tasuta tarkvara; vt allikat koopiate tingimuste jaoks. GARANTEERITUD EI OLE;
mitte ükski äritsemise või konkreetse eesmärgi sobivuse garantii.

Prooviprogrammi koostamine ja käivitamine

Loome kausta home meie õppeprojektide jaoks, nimetame selle mstutorial:

$ mkdir ~/mstutorial

Kasutage oma lemmik tekstiredaktorit ja looge C-programmi fail nimega mstest.c järgnevate sisuga:

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

See initsialiseerib mediastreameri, kuvab tervituse ja lõpetab töö.

Salvestame faili ja kompileerime testrakenduse käsuga:

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

Pange tähele, et rida

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

on jutumärkides, mis asuvad klaviatuuril seal, kus on täht «Ё».

Kui fail ei sisalda vigu, siis pärast kompileerimist ilmub katalooge fail mstest. Käivitame programmi:

$ ./mstest

Tulemus on järgmine:

ALSA lib conf.c:4738:(snd_config_expand) Tundmatud parameetrid 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Kehtetu CTL default:0
ortp-warning - Ei saanud mikserit kaardile kinnitada: Kehtetu argument
ALSA lib conf.c:4738:(snd_config_expand) Tundmatud parameetrid 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Tundmatu PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Tundmatud parameetrid 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Tundmatu PCM default:0
ortp-warning - Veider, et helikaart HDA Intel PCH ei tundu olevat millegiks võimeline, proovime uuesti plughw...
Mediastreamer on valmis.

Selles loendis näeme ALSA teekide genereeritavaid veateateid, mis on mõeldud helikaardi haldamiseks. Meedia voogesituse arendajad usuvad, et see on normaalne. Sel juhul peame kahjuks nendega nõustuma.

Nüüd on meil kõik valmis meedia voogesitajaga töötamiseks. Oleme installinud voogesituse teegi, kompileerimise tööriista ja prooviklassi rakenduse, et kontrollida, et tööriistad on seadistatud ja voogesitaja on edukalt algatatud.

Järgmisel artiklis loome rakenduse, mis kogub ja käivitab helisignaali töötlemise mitmest filtrist koosnevas ahelas.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster