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