Mediastreamer2 VoIP-mootori uurimine. 1. osa

Artikli materjal on võetud minu zen kanal.

Sissejuhatus

See artikkel on artiklite seeria algus, mis käsitleb Mediastreamer2 mootorit kasutades reaalajas meediumitöötlust. Esitlus hõlmab minimaalseid Linuxi terminalis töötamise ja C-keeles programmeerimise oskusi.

Mediastreamer2 on VoIP-mootor populaarse avatud lähtekoodiga tarkvara VoIP-telefoniprojekti taga. telefon. Linphone'is rakendab Mediastreamer2 kõiki heli ja videoga seotud funktsioone. Mootori funktsioonide üksikasjalikku loendit näete sellel Mediastreameri lehel. Lähtekood on siin: GitLab.

Edaspidi kasutame tekstis mugavuse huvides sõna Mediastreamer2 asemel selle venekeelset tähistust: “media streamer”.

Selle loomise ajalugu pole täiesti selge, kuid lähtekoodi järgi otsustades kasutas see raamatukogu varem libe, mis justkui vihjab võimalikule kaugsuhtele GStreamer. Millega võrreldes näeb meediavooder kergem välja. Linphone'i esimene versioon ilmus 2001. aastal, nii et hetkel on meediastriimer olemas ja areneb peaaegu 20 aastat.

Meediastriimi keskmes on arhitektuur nimega "Andmevoog" (andmevoog). Sellise arhitektuuri näide on näidatud alloleval joonisel.

Mediastreamer2 VoIP-mootori uurimine. 1. osa

Selles arhitektuuris ei määra andmetöötlusalgoritmi mitte programmikood, vaid skeem (graafik) funktsioonide ühendamiseks, mida saab järjestada suvalises järjekorras. Neid funktsioone nimetatakse filtriteks.

See arhitektuur võimaldab rakendada meediumitöötluse funktsionaalsust filtrite komplekti kujul, mis on ühendatud VoIP-telefoni RTP liikluse töötlemise ja edastamise skeemiga.

Võimalus kombineerida filtreid suvalisteks skeemideks, uute filtrite lihtne väljatöötamine, meediumistriimi rakendamine iseseisva eraldi raamatukoguna võimaldavad seda kasutada ka teistes projektides. Lisaks võib projekt olla VoIP-i valdkonnas, kuna sinna on võimalik lisada enda tehtud filtreid.

Vaikimisi tarnitav filtriteek on üsna rikkalik ja nagu juba mainitud, saab seda täiendada meie enda disainitud filtritega. Kuid kõigepealt kirjeldame meediumistriimiga kaasasolevaid valmisfiltreid. Siin on nende nimekiri:

Helifiltrid

Heli jäädvustamine ja taasesitus

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Androidi loomulik heli (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Helijärjekorra teenus (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Heliüksuse teenus (Mac OS X)
  • Kunst (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Failipleier (raw/wav/pcap failid) (Linux): MS_FILE_PLAYER
  • Failipleier (raw/wav-failid) (Windows): MS_WINSND_READ
  • Kirjutage faili (wav-failid) (Linux): MS_FILE_REC
  • Kirjutage faili (wav-failid) (Windows): MS_WINSND_WRITE
  • Maci heliüksus (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
  • Windowsi heli (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
  • Kiir: MS_SPEEX_ENC, MS_SPEEX_DEC

Helitöötlus

  • Kanalite teisendus (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konverents: MS_CONF
  • DTMF-generaator: MS_DTMF_GEN
  • Kaja tühistamine (speex): MS_SPEEX_EC
  • Ekvalaiser: MS_EQUALIZER
  • Mikser: MS_MIXER
  • Paketikao kompensaator (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Toonidetektor: MS_TONE_DETECTOR
  • Helitugevuse juhtimine ja signaali taseme mõõtmine: MS_VOLUME

Videofiltrid

Video jäädvustamine ja taasesitus

  • androidi jäädvustamine
  • androidi taasesitus
  • AV Foundationi jäädvustamine (iOS)
  • AV Foundationi taasesitus (iOS)
  • DirectShow Capture (Windows)
  • DrawDibi taasesitus (Windows)
  • Väline taasesitus – video saatmine ülemisse kihti
  • GLX taasesitus (Linux): MS_GLXVIDEO
  • Mire – sünteetiline liikuv pilt: MS_MIRE
  • OpenGL-i taasesitus (Mac OS X)
  • OpenGL ES2 taasesitus (Android)
  • Quicktime Capture (Mac OS X)
  • SDL taasesitus: MS_SDL_OUT
  • Staatilise pildi väljund: MS_STATIC_IMAGE
  • Video Linuxi (V4L) jäädvustamise jaoks (Linux): MS_V4L
  • Video Linux 2 (V4L2) jäädvustamise jaoks (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) jäädvustamine (Windows)
  • Video4windows (DirectShow) jäädvustamine (Windows CE)
  • Video for Windows (vfw) jäädvustamine (Windows)
  • XV taasesitus (Linux)

Video kodeerimine/dekodeerimine

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

Video töötlemine

  • jpeg hetktõmmis
  • Pikslivormingu konverter: MS_PIX_CONV
  • Suuruse muutja
  • 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/edastus: MS_RTP_SEND, MS_RTP_RECV
  • Sisendandmete kopeerimine mitmesse väljundisse: MS_TEE
  • Lõpetatud laadimine: MS_VOID_SINK
  • Vaigistamise allikas: MS_VOID_SOURCE

Плагины

Helifiltrid

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

    Videofiltrid

  • H.264 tarkvara kodeerija
  • H.264 V4L2 riistvarakiirendusega kodeerija/dekooder

Pärast filtri lühikirjeldust näidatakse tüübi nime, mida kasutatakse selle filtri uue eksemplari loomisel. Järgnevalt viitame sellele loendile.

Installimine Linux Ubuntu alla

Nüüd installime meediumistriimi arvutisse ja ehitame sellega oma esimese rakenduse.

Mediastremer2 installimine arvutisse või virtuaalmasinasse, kus töötab Ubuntu, ei nõua erilisi oskusi. Siin ja allpool tähistab sümbol "$" käskude sisestamise kestaviipa. Need. kui loendis näete seda sümbolit rea alguses, siis see on rida, millel näidatakse terminalis käskude täitmist.

Eeldatakse, et selles artiklis kirjeldatud toimingute ajal on teie arvutil juurdepääs Internetile.

Paki libmediastremer-dev installimine

Käivitage terminal ja tippige käsk:

$ sudo apt-get update

Teilt küsitakse muudatuste tegemiseks parooli, sisestage see ja paketihaldur värskendab oma andmebaase. Pärast seda peate jooksma:

$ sudo apt-get install libmediastreamer-dev

Vajalikud sõltuvuspaketid ja meediumistriimi teek laaditakse automaatselt alla ja installitakse.

Allalaaditud sõltuvuse deb-pakettide kogumaht on ligikaudu 35 MB. Installitud paketi üksikasjad leiate käsuga:

$ dpkg -s libmediastreamer-dev

Vastuse näide:

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/

Arendustööriistade paigaldamine

Installige C-kompilaator ja sellega kaasnevad tööriistad:

$ sudo apt-get install gcc

Kontrollime tulemust, küsides kompilaatori versiooni:

$ gcc --version

Vastus peaks olema umbes selline:

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.

Proovirakenduse loomine ja käitamine

Loome sisse kodus kaust meie õppeprojektide jaoks, nimetagem seda mstutorial:

$ mkdir ~/mstutorial

Kasutage oma lemmiktekstiredaktorit ja looge C-programmi fail nimega mstest.c järgmise sisuga:

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

See lähtestab meediumistriimi, prindib tervituse ja väljub.

Salvestage fail ja kompileerige testrakendus käsuga:

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

Pange tähele, et rida

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

ümbritsetud jutumärkidega, mis asuvad klaviatuuril samas kohas kui täht "Ё".

Kui fail ei sisalda vigu, ilmub pärast kompileerimist kataloogi fail mstest. Alustame programmiga:

$ ./mstest

Tulemus saab olema selline:

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.

Selles loendis näeme veateateid, mida ALSA teek kuvab, seda kasutatakse helikaardi juhtimiseks. Meediastriimi arendajad ise usuvad, et see on normaalne. Sel juhul nõustume nendega vastumeelselt.

Nüüd oleme kõik valmis töötama meediumistriimiga. Oleme installinud meediumistriimi teegi, kompileerimistööriista ja kontrollinud proovirakenduse abil, et tööriistad on konfigureeritud ja meediumistriimi lähtestamine õnnestus.

Edasi siit loome rakenduse, mis koondab ja käivitab helisignaali töötlemise mitme filtri ahelas.

Allikas: www.habr.com