Eksplorimi i motorit VoIP Mediastreamer2. Pjesa 1

Materiali i artikullit është marrë nga ime kanal zen.

Paraqitje

Ky artikull është fillimi i një serie artikujsh rreth përpunimit të mediave në kohë reale duke përdorur motorin Mediastreamer2. Prezantimi do të përfshijë aftësitë minimale të punës në terminalin Linux dhe programimin në gjuhën C.

Mediastreamer2 është motori VoIP që qëndron pas projektit popullor të softuerit me burim të hapur Voip telefonit. Linfon. Në Linphone Mediastreamer2 zbaton të gjitha funksionet që lidhen me zërin dhe videon. Një listë e detajuar e veçorive të motorit mund të shihet në këtë faqe Mediastreamer. Kodi burimor është këtu: GitLab.

Më tej në tekst, për lehtësi, në vend të fjalës Mediastreamer2 do të përdorim shënimin e saj rus: "transmetues media".

Historia e krijimit të saj nuk është plotësisht e qartë, por duke gjykuar nga kodi i saj burimor, ajo përdori më parë bibliotekën glib, e cila, si të thuash, lë të kuptohet për një marrëdhënie të mundshme të largët me GStreamer. Në krahasim me të cilin transmetuesi mediatik duket më i lehtë. Versioni i parë i Linphone u shfaq në 2001, kështu që për momentin transmetuesi i medias ekziston dhe zhvillohet për gati 20 vjet.

Në zemër të transmetuesit të medias është një arkitekturë e quajtur "Rrjedha e të dhënave" (rrjedha e të dhënave). Një shembull i një arkitekture të tillë është paraqitur në figurën më poshtë.

Eksplorimi i motorit VoIP Mediastreamer2. Pjesa 1

Në këtë arkitekturë, algoritmi i përpunimit të të dhënave nuk specifikohet nga një kod programi, por nga një skemë (grafiku) për lidhjen e funksioneve që mund të organizohen në çdo mënyrë. Këto funksione quhen filtra.

Kjo arkitekturë bën të mundur zbatimin e funksionalitetit të përpunimit të mediave në formën e një grupi filtrash të lidhur me skemën e përpunimit dhe transmetimit të trafikut RTP të telefonit VoIP.

Aftësia për të kombinuar filtrat në skema arbitrare, zhvillimi i thjeshtë i filtrave të rinj, zbatimi i transmetuesit të medias si një bibliotekë e pavarur e veçantë, e lejojnë atë të përdoret në projekte të tjera. Për më tepër, projekti mund të jetë në fushën e VoIP, pasi është e mundur të shtohen filtra të bërë nga vetja.

Biblioteka e filtrave e ofruar si parazgjedhje është mjaft e pasur dhe, siç u përmend tashmë, mund të zgjerohet me filtra të dizajnit tuaj. Por së pari, le të përshkruajmë filtrat e gatshëm që vijnë me transmetuesin e medias. Këtu është lista e tyre:

Filtrat e zërit

Kapja dhe riprodhimi i audios

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Tingulli origjinal i Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Shërbimi i radhës së audios (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Shërbimi i njësisë audio (Mac OS X)
  • Artet (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Luajtësi i skedarëve (skedarë raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Luajtësi i skedarëve (skedarët raw/wav) (Windows): MS_WINSND_READ
  • Shkruani në skedar (skedarët wav) (Linux): MS_FILE_REC
  • Shkruaj në skedar (skedarët wav) (Windows): MS_WINSND_WRITE
  • Njësia e audios 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
  • Tingulli i Windows (Windows)

Kodimi/dekodimi i audios

  • G.711 a-ligj: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 μ-ligji: 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
  • PCM lineare: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Përpunimi i zërit

  • Konvertimi i kanalit (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferenca: MS_CONF
  • Gjeneratori DTMF: MS_DTMF_GEN
  • Anulimi i jehonës (speex): MS_SPEEX_EC
  • Barazuesi: MS_EQUALIZER
  • Përzierës: MS_MIXER
  • Kompensuesi i humbjes së paketave (PLC): MS_GENERIC_PLC
  • Remostruesi: MS_RESAMPLE
  • Detektori i tonit: MS_TONE_DETECTOR
  • Kontrolli i volumit dhe matja e nivelit të sinjalit: MS_VOLUME

Filtrat e videove

Kapja dhe riprodhimi i videos

  • kapja android
  • riprodhimi android
  • Regjistrimi i fondacionit AV (iOS)
  • Riprodhimi i fondacionit AV (iOS)
  • DirectShow Capture (Windows)
  • Riprodhimi i DrawDib (Windows)
  • Riprodhimi i jashtëm - Dërgimi i videos në shtresën e sipërme
  • Riprodhimi GLX (Linux): MS_GLXVIDEO
  • Mire - Fotografi lëvizëse sintetike: MS_MIRE
  • Riprodhimi i OpenGL (Mac OS X)
  • Riprodhimi i OpenGL ES2 (Android)
  • Quicktime Capture (Mac OS X)
  • Riprodhimi SDL: MS_SDL_OUT
  • Dalja statike e imazhit: MS_STATIC_IMAGE
  • Regjistrimi i videos për Linux (V4L) (Linux): MS_V4L
  • Regjistrimi i videos për Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Regjistrimi i Video4windows (DirectShow) (Windows)
  • Regjistrimi i Video4windows (DirectShow) (Windows CE)
  • Regjistrimi i videos për Windows (vfw) (Windows)
  • Riprodhimi XV (Linux)

Kodimi/dekodimi i videos

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Bora: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (vetëm dekoder): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Përpunimi i videos

  • fotografi jpeg
  • Konvertuesi i formatit pixel: MS_PIX_CONV
  • Ndryshues i madhësisë
  • Filtra të tjerë
  • Shkëmbimi i blloqeve të të dhënave ndërmjet temave: MS_ITC_SOURCE, MS_ITC_SINK
  • Mbledhja e blloqeve të të dhënave nga hyrje të shumta në një dalje të vetme: MS_JOIN
  • Marrja/transmetimi i RTP: MS_RTP_SEND, MS_RTP_RECV
  • Kopjimi i të dhënave hyrëse në dalje të shumta: MS_TEE
  • Ngarkesa e përfunduar: MS_VOID_SINK
  • Burimi i heshtjes: MS_VOID_SOURCE

plugins

Filtrat e zërit

  • Enkoder/dekoder AMR-NB
  • G.729 kodues/dekoder
  • Enkoder/dekoder iLBC
  • Enkoder/dekoder SILK

    Filtrat e videove

  • kodues i softuerit H.264
  • H.264 V4L2 kodues/dekoder i përshpejtuar i harduerit

Pas një përshkrimi të shkurtër të filtrit, shfaqet emri i llojit, i cili përdoret kur krijohet një shembull i ri i këtij filtri. Në vijim do t'i referohemi kësaj liste.

Instalimi nën Linux Ubuntu

Tani do të instalojmë transmetuesin e medias në kompjuter dhe do të ndërtojmë aplikacionin tonë të parë me të.

Instalimi i Mediastremer2 në një kompjuter ose makinë virtuale që funksionon Ubuntu nuk kërkon ndonjë aftësi të veçantë. Këtu dhe më poshtë, simboli "$" do të tregojë kërkesën e guaskës për futjen e komandave. Ato. nëse në listë e shihni këtë simbol në fillim të rreshtit, atëherë kjo është linja në të cilën komandat tregohen të ekzekutohen në terminal.

Supozohet se gjatë hapave në këtë artikull, kompjuteri juaj ka qasje në internet.

Instalimi i paketës libmediastremer-dev

Hapni terminalin dhe shkruani komandën:

$ sudo apt-get update

Do t'ju kërkohet një fjalëkalim për të bërë ndryshime, futeni atë dhe menaxheri i paketave do të përditësojë bazat e të dhënave të tij. Pas kësaj, ju duhet të vraponi:

$ sudo apt-get install libmediastreamer-dev

Paketat e nevojshme të varësisë dhe vetë biblioteka e transmetuesit të medias do të shkarkohen dhe instalohen automatikisht.

Madhësia totale e paketave të shkarkimit të deb varësisë do të jetë afërsisht 35 MB. Detajet rreth paketës së instaluar mund të gjenden me komandën:

$ dpkg -s libmediastreamer-dev

Shembulli i përgjigjes:

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/

Instalimi i mjeteve të zhvillimit

Instaloni përpiluesin C dhe mjetet e tij shoqëruese:

$ sudo apt-get install gcc

Ne kontrollojmë rezultatin duke kërkuar versionin e përpiluesit:

$ gcc --version

Përgjigja duhet të jetë diçka si kjo:

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.

Ndërtimi dhe ekzekutimi i aplikacionit provë

Ne krijojmë në shtëpi dosje për projektet tona tutoriale, le ta quajmë atë mstutoriale:

$ mkdir ~/mstutorial

Përdorni redaktuesin tuaj të preferuar të tekstit dhe krijoni një skedar programi C të quajtur mstest.c me përmbajtjen e mëposhtme:

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

Ai inicializon transmetuesin e medias, printon një përshëndetje dhe del.

Ruani skedarin dhe përpiloni aplikacionin e testimit me komandën:

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

Vini re se linja

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

të mbyllura në thonjëza, të cilat ndodhen në tastierë në të njëjtin vend me shkronjën "Ё".

Nëse skedari nuk përmban gabime, atëherë pas përpilimit një skedar do të shfaqet në drejtori mstest. Ne fillojmë programin:

$ ./mstest

Rezultati do të jetë si ky:

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.

Në këtë listë, ne shohim mesazhet e gabimit që shfaq biblioteka ALSA, përdoret për të kontrolluar kartën e zërit. Vetë zhvilluesit e transmetuesit të medias besojnë se kjo është normale. Në këtë rast, ne pajtohemi me ta.

Tani jemi gati të punojmë me transmetuesin e medias. Ne kemi instaluar bibliotekën e transmetuesit të medias, mjetin e përpilimit dhe duke përdorur një aplikacion provë, kemi verifikuar që mjetet janë konfiguruar dhe transmetuesi i medias inicializohet me sukses.

Tjetra artikull ne do të krijojmë një aplikacion që do të mbledhë dhe do të ekzekutojë përpunimin e një sinjali audio në një zinxhir prej disa filtrash.

Burimi: www.habr.com