Materijal u članku preuzet je sa mog .
Uvod
Ta članek je uvod v serijo člankov o obdelavi medijskih podatkov v realnem času z uporabo motorja Mediastreamer2. V predstavitvi bodo uporabljene minimalne veščine dela v terminalu Linux in programiranja v jeziku C.
Mediastreamer2 je VoIP motor, ki leži v ozadju priljubljenega open-source projekta programske VoIP telefonske naprave. . V Linphone Mediastreamer2 izvaja vse funkcije, povezane z zvokom in videom. Podroben seznam funkcionalnosti motorja lahko vidite na tej strani Mediastreamer. Izvorna koda se nahaja tukaj: .
V nadaljevanju teksta bomo za enostavnost namesto besede Mediastreamer2 uporabljali njegovo slovensko oznako: 'mediastreamer'.
Zgodovina njegovega nastanka ni popolnoma jasna, vendar sklepamo, da je v preteklosti uporabljal knjižnico , kar nam daje namig na možno oddaljeno sorodstvo z . V primerjavi z njim mediastreamer deluje bolj lahkotno. Prva različica Linphone se je pojavila leta 2001, tako da mediastreamer obstaja in se razvija skoraj 20 let.
Osnova mediastreamerja je arhitektura, imenovana 'Data flow' (pretok podatkov). Primer take arhitekture je prikazan na spodnji sliki.

V tej arhitekturi je algoritem obdelave podatkov določen ne s programskim kodom, temveč shemo (grafom) povezovanja funkcij, ki jih je mogoče postaviti v poljubnem vrstnem redu. Te funkcije imenujemo filtri.
Takšna arhitektura omogoča realizacijo funkcionalnosti obdelave medijev v obliki niza filtrov, povezanih v shemo obdelave in prenosa RTP prometa VoIP telefona.
Možnost povezovanja filtrov v poljubne sheme, enostavna razvoj novih filtrov in implementacija mediastreamerja kot samostojne knjižnice omogočajo njegovo uporabo tudi v drugih projektih. Projekt lahko spada na področje VoIP, saj obstaja možnost dodajanja filtrov, ki jih razvijete sami.
Privzeta knjižnica filtrov je precej bogata in, kot smo že omenili, jo je mogoče razširiti z filtri, ki jih razvijete sami. Najprej pa opišimo obstoječe filtre, ki se dobavljajo skupaj z mediastreamerjem. Tukaj je njihov seznam:
Zvočni filtri
Zajem in predvajanje zvoka
- Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
- Android native sound (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
- Predvajalnik datotek (raw/wav/pcap datoteke) (Linux): MS_FILE_PLAYER
- Predvajalnik datotek (raw/wav datoteke) (Windows): MS_WINSND_READ
- Zapisovanje v datoteko (wav datoteke) (Linux): MS_FILE_REC
- Zapisovanje v datoteko (wav datoteke) (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)
Kodiranje/dekodiranje zvoka
- G.711 a-zakon: MS_ALAW_DEC, MS_ALAW_ENC
- G.711 µ-zakon: 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
- Linearna PCM: MS_L16_ENC, MS_L16_DEC
- Speex: MS_SPEEX_ENC, MS_SPEEX_DEC
Obdelava zvoka
- Pretvorba kanala (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
- Konferenca: MS_CONF
- Generator DTMF: MS_DTMF_GEN
- Zmanjšanje odmeva (speex): MS_SPEEX_EC
- Izenačevalnik: MS_EQUALIZER
- Mešalnik: MS_MIXER
- Kompenzator izgube paketov (PLC): MS_GENERIC_PLC
- Ressampler: MS_RESAMPLE
- Detektor tonov: MS_TONE_DETECTOR
- Nadzor glasnosti in merjenje ravni signala: MS_VOLUME
Video filtri
Zajemanje in predvajanje videa
- Android zajemanje
- Android predvajanje
- AV Foundation zajemanje (iOS)
- AV Foundation predvajanje (iOS)
- DirectShow zajemanje (Windows)
- DrawDib predvajanje (Windows)
- Zunanje predvajanje — Pošiljanje videa na višjo raven
- GLX predvajanje (Linux): MS_GLXVIDEO
- Mire — Sintetična gibljiva slika: MS_MIRE
- OpenGL predvajanje (Mac OS X)
- OpenGL ES2 predvajanje (Android)
- Quicktime zajemanje (Mac OS X)
- SDL predvajanje: MS_SDL_OUT
- Izhod statičnih slik: MS_STATIC_IMAGE
- Video For Linux (V4L) zajemanje (Linux): MS_V4L
- Video For Linux 2 (V4L2) zajemanje (Linux): MS_V4L2_CAPTURE
- Video4windows (DirectShow) zajemanje (Windows)
- Video4windows (DirectShow) zajemanje (Windows CE)
- Video For Windows (vfw) zajemanje (Windows)
- XV predvajanje (Linux)
Kodiranje/dekodiranje video
- H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
- H.264 (samo dekoder): MS_H264_DEC
- Theora: MS_THEORA_ENC, MS_THEORA_DEC
- VP8: MS_VP8_ENC, MS_VP8_DEC
Obdelava videa
- JPEG snapshot
- Pretvornik slikovnega formata: MS_PIX_CONV
- Ressizer
- Drugi filtri
- Izmenjava blokov podatkov med nitmi: MS_ITC_SOURCE, MS_ITC_SINK
- Zbiranje blokov podatkov iz več vhodov na en izhod: MS_JOIN
- RTP sprejem/pošiljanje: MS_RTP_SEND, MS_RTP_RECV
- Kopiranje vhodnih podatkov na več izhodov: MS_TEE
- Usklajena obremenitev: MS_VOID_SINK
- Vir tišine: MS_VOID_SOURCE
Vtičniki
Zvočni filtri
- AMR-NB kodirnik/dekodirnik
- G.729 kodirnik/dekodirnik
- iLBC kodirnik/dekodirnik
- SILK kodirnik/dekodirnik
Video filtri
- H.264 programski kodir
- H.264 V4L2 kodirnik/dekodirnik z strojno pospešitvijo
Za kratkim opisom filtra je prikazano ime tipa, ki se uporablja pri ustvarjanju novega primera tega filtra. V nadaljevanju se bomo sklicevali na ta seznam.
Namestitev za Linux Ubuntu
Zdaj bomo namestili mediastreamer na računalnik in sestavili našo prvo aplikacijo z njim.
Namestitev Mediastremer2 na računalnik ali virtualni stroj, ki deluje pod Ubuntu, ne zahteva posebnih veščin. Tukaj in naprej bo simbol «$» označeval poziv lupine za vnos ukazov. T.j. če v izpisu vidite ta simbol na začetku vrstice, pomeni, da je to vrstica, v kateri so prikazani ukazi za izvedbo v terminalu.
Predvideva se, da ima vaš računalnik med izvajanjem dejanj, opisanih v tem članku, dostop do interneta.
Namestitev paketa libmediastremer-dev
Zaženite terminal in vnesite ukaz:
$ sudo apt-get updateZahtevan bo geslo za spremembe, vnesite ga in upravitelj paketov bo posodobil svoje baze. Nato je potrebno izvesti:
$ sudo apt-get install libmediastreamer-devPotrebni paketi odvisnosti in sama knjižnica mediastreamer bodo samodejno preneseni in nameščeni.
Skupna velikost prenesenih deb-paketov odvisnosti bo približno 35 MB. Podrobnosti o nameščenem paketu lahko pridobite z ukazom:
$ dpkg -s libmediastreamer-devPrimer odgovora:
Package: libmediastreamer-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 244
Maintainer: Ubuntu Developers
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
Homepage: http://www.linphone.org/
Namestitev orodij za razvoj
Namestimo C prevajalnik in pripadajoča orodja:
$ sudo apt-get install gccPreverite rezultat, tako da zahtevate različico prevajalnika:
$ gcc --versionOdgovor bi moral biti približno takšen:
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.Zgradnja in zagon preskusne aplikacije
Ustvarimo v home mapo za naše učne projekte, poimenujmo jo mstutorial:
$ mkdir ~/mstutorialUporabite svoj najljubši besedilni urejevalnik in ustvarite datoteko C-programa z imenom mstest.c med følgende indhold:
#include "stdio.h"
#include <mediastreamer2/mscommon.h>
int main()
{
ms_init();
printf ("Mediastreamer is ready.n");
}Izvaja inicializacijo mediastreamerja, izpiše pozdrav in zaključi izvajanje.
Shranjujte datoteko in sestavite testno aplikacijo z ukazom:
$ gcc mstest.c -o mstest `pkg-config mediastreamer --libs --cflags`Обратите внимание, что строка
`pkg-config mediastreamer --libs --cflags`заключена в кавычки, которые находятся на клавиатуре там же где и буква «Ё».
Если файл не содержит ошибок, то после компиляции в каталоге появится файл mstest. Запускаем программу:
$ .\/mstestРезультат будет таким:
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.В данном листинге мы видим сообщения об ошибках, которые выводит библиотека ALSA, она используется для управления звуковой картой. Сами разработчики медиастримера считают, что это нормально. Мы в данном случае по неволе согласимся с ними.
Теперь у нас все готово для работы с медиастримером. Мы установили библиотеку медиастримера, инструмент компиляции и с помощью пробного приложения проверили, что инструменты настроены, а медиастример успешно инициализируется.
V nasledujúcej мы создадим приложение, которое соберет и запустит обработку звукового сигнала в цепочке из нескольких фильтров.
Izvor: habr.com
