„Mediastreamer2 VoIP“ variklio tyrinėjimas. 1 dalis

Straipsnio medžiaga paimta iš mano zen kanalas.

įvedimas

Šis straipsnis yra straipsnių serijos apie medijos apdorojimą realiuoju laiku naudojant Mediastreamer2 variklį pradžia. Pristatymas apims minimalius darbo Linux terminalu ir programavimo C kalba įgūdžius.

Mediastreamer2 yra VoIP variklis už populiarų atvirojo kodo programinės įrangos VoIP telefono projektą. Linfonas. Linphone Mediastreamer2 įgyvendina visas su garsu ir vaizdu susijusias funkcijas. Išsamų variklio funkcijų sąrašą galite pamatyti šiame Mediastreamer puslapyje. Šaltinio kodas yra čia: GitLab.

Toliau tekste, kad būtų patogiau, vietoj žodžio Mediastreamer2 naudosime jo rusišką užrašą: „media streamer“.

Jo sukūrimo istorija nėra visiškai aiški, tačiau, sprendžiant iš šaltinio kodo, ji anksčiau naudojo biblioteką šlykštus, kuri tarsi sufleruoja apie galimus tolimus santykius su GStreamer. Palyginti su tuo, medijos transliuotojas atrodo lengvesnis. Pirmoji „Linphone“ versija pasirodė 2001 m., todėl šiuo metu medijos transliuotojas egzistuoja ir vystosi beveik 20 metų.

Žiniasklaidos transliuotojo esmė yra architektūra, vadinama „duomenų srautu“ (duomenų srautu). Tokios architektūros pavyzdys parodytas paveikslėlyje žemiau.

„Mediastreamer2 VoIP“ variklio tyrinėjimas. 1 dalis

Šioje architektūroje duomenų apdorojimo algoritmas nurodomas ne programos kodu, o funkcijų sujungimo schema (grafu), kurios gali būti išdėstytos bet kokia tvarka. Šios funkcijos vadinamos filtrais.

Ši architektūra leidžia įgyvendinti medijos apdorojimo funkcionalumą filtrų, prijungtų prie VoIP telefono RTP srauto apdorojimo ir perdavimo schemos, pavidalu.

Galimybė sujungti filtrus į savavališkas schemas, paprastas naujų filtrų kūrimas, daugialypės terpės transliuotojo kaip nepriklausomos atskiros bibliotekos įgyvendinimas leidžia jį naudoti kituose projektuose. Be to, projektas gali būti VoIP srityje, nes galima pridėti pačių sukurtų filtrų.

Pagal numatytuosius nustatymus pateikiama filtrų biblioteka yra gana turtinga ir, kaip jau minėta, gali būti papildyta mūsų pačių sukurtais filtrais. Tačiau pirmiausia apibūdinkime paruoštus filtrus, kurie pateikiami kartu su medijos srautu. Štai jų sąrašas:

Garso filtrai

Garso įrašymas ir atkūrimas

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • „Android“ vietinis garsas (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Garso eilės paslauga („Mac OS X“): MS_AQ_WRITE, MS_AQ_READ
  • Garso įrenginio paslauga („Mac OS X“)
  • Menai (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • „DirectSound“ („Windows“): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Failų grotuvas (raw/wav/pcap failai) (Linux): MS_FILE_PLAYER
  • Failų grotuvas (raw/wav failai) („Windows“): MS_WINSND_READ
  • Rašykite į failą (wav failus) (Linux): MS_FILE_REC
  • Rašykite į failą (wav failus) („Windows“): MS_WINSND_WRITE
  • „Mac“ garso įrenginys („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“ garsas („Windows“)

Garso kodavimas/dekodavimas

  • G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-dėsnis: 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
  • Linijinis PCM: MS_L16_ENC, MS_L16_DEC
  • Greitis: MS_SPEEX_ENC, MS_SPEEX_DEC

Garso apdorojimas

  • Kanalo konvertavimas (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferencija: MS_CONF
  • DTMF generatorius: MS_DTMF_GEN
  • Aido panaikinimas (speex): MS_SPEEX_EC
  • Ekvalaizeris: MS_EQUALIZER
  • Maišytuvas: MS_MIXER
  • Paketų praradimo kompensatorius (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Tonų detektorius: MS_TONE_DETECTOR
  • Garso valdymas ir signalo lygio matavimas: MS_VOLUME

Vaizdo filtrai

Vaizdo įrašų fiksavimas ir atkūrimas

  • Android fiksavimas
  • Android atkūrimas
  • AV fondo fiksavimas (iOS)
  • „AV Foundation“ atkūrimas („iOS“)
  • „DirectShow Capture“ („Windows“)
  • „DrawDib“ atkūrimas („Windows“)
  • Išorinis atkūrimas – vaizdo įrašo siuntimas į viršutinį sluoksnį
  • GLX atkūrimas (Linux): MS_GLXVIDEO
  • Mire – Sintetinis judantis paveikslėlis: MS_MIRE
  • OpenGL atkūrimas („Mac OS X“)
  • OpenGL ES2 atkūrimas („Android“)
  • „Quicktime Capture“ („Mac OS X“)
  • SDL atkūrimas: MS_SDL_OUT
  • Statinio vaizdo išvestis: MS_STATIC_IMAGE
  • Vaizdo įrašas, skirtas Linux (V4L) fiksavimui (Linux): MS_V4L
  • Vaizdo įrašas, skirtas Linux 2 (V4L2) fiksavimui (Linux): MS_V4L2_CAPTURE
  • „Video4windows“ („DirectShow“) fiksavimas („Windows“)
  • „Video4windows“ („DirectShow“) fiksavimas („Windows CE“)
  • Vaizdo įrašas, skirtas „Windows“ (vfw) fiksavimas („Windows“)
  • XV atkūrimas („Linux“)

Vaizdo įrašų kodavimas/dekodavimas

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, sniegas: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (tik dekoderis): MS_H264_DEC
  • Teora: ms_theora_enc, ms_theora_dec
  • VP8: ms_vp8_enc, ms_vp8_dec

Vaizdo įrašų apdorojimas

  • jpeg momentinė nuotrauka
  • Pikselių formato keitiklis: MS_PIX_CONV
  • Dydžio keitiklis
  • Kiti filtrai
  • Keitimasis duomenų blokais tarp gijų: MS_ITC_SOURCE, MS_ITC_SINK
  • Duomenų blokų rinkimas iš kelių įėjimų į vieną išvestį: MS_JOIN
  • RTP priėmimas / siuntimas: MS_RTP_SEND, MS_RTP_RECV
  • Įvesties duomenų kopijavimas į kelis išėjimus: MS_TEE
  • Nutrauktas įkėlimas: MS_VOID_SINK
  • Tylos šaltinis: MS_VOID_SOURCE

Papildiniai

Garso filtrai

  • AMR-NB koduotuvas/dekoderis
  • G.729 koduotuvas/dekoderis
  • iLBC koduotuvas / dekoderis
  • SILK kodavimo/dekodavimo aparatas

    Vaizdo filtrai

  • H.264 programinė įranga
  • H.264 V4L2 aparatinės įrangos pagreitintas koduotuvas / dekoderis

Po trumpo filtro aprašymo rodomas tipo pavadinimas, kuris naudojamas kuriant naują šio filtro egzempliorių. Toliau mes remsimės šiuo sąrašu.

Diegimas naudojant Linux Ubuntu

Dabar kompiuteryje įdiegsime medijos transliuotoją ir su juo sukursime pirmąją programą.

„Mediastremer2“ įdiegimas kompiuteryje ar virtualioje mašinoje, kurioje veikia „Ubuntu“, nereikalauja jokių specialių įgūdžių. Čia ir žemiau simbolis „$“ žymės apvalkalo eilutę komandoms įvesti. Tie. jei sąraše matote šį simbolį eilutės pradžioje, tai yra eilutė, kurioje rodomos komandos vykdomos terminale.

Daroma prielaida, kad atliekant šiame straipsnyje nurodytus veiksmus jūsų kompiuteris turi prieigą prie interneto.

Paketo libmediastremer-dev diegimas

Paleiskite terminalą ir įveskite komandą:

$ sudo apt-get update

Norėdami atlikti pakeitimus, būsite paprašyti slaptažodžio, įveskite jį ir paketų tvarkyklė atnaujins savo duomenų bazes. Po to turite paleisti:

$ sudo apt-get install libmediastreamer-dev

Būtini priklausomybės paketai ir pati medijos srauto biblioteka bus automatiškai atsisiunčiama ir įdiegta.

Bendras atsisiųstų priklausomybės deb paketų dydis bus maždaug 35 MB. Išsamią informaciją apie įdiegtą paketą galite rasti komanda:

$ dpkg -s libmediastreamer-dev

Atsakymo pavyzdys:

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/

Kūrimo įrankių diegimas

Įdiekite C kompiliatorių ir su juo susijusius įrankius:

$ sudo apt-get install gcc

Mes patikriname rezultatą, paprašydami kompiliatoriaus versijos:

$ gcc --version

Atsakymas turėtų būti maždaug toks:

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.

Bandomosios programos kūrimas ir vykdymas

Mes kuriame home mūsų mokymo projektų aplankas, pavadinkime jį MSTURAL:

$ mkdir ~/mstutorial

Naudokite savo mėgstamą teksto rengyklę ir sukurkite C programos failą mstest.c su tokiu turiniu:

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

Jis inicijuoja medijos transliuotoją, išspausdina sveikinimą ir išeina.

Išsaugokite failą ir sukomponuokite bandomąją programą naudodami komandą:

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

Atkreipkite dėmesį, kad linija

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

kabutėse, kurios yra klaviatūroje toje pačioje vietoje kaip raidė "Ё".

Jei faile nėra klaidų, po kompiliavimo failas pasirodys kataloge Mstest. Pradedame programą:

$ ./mstest

Rezultatas bus toks:

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.

Šiame sąraše matome klaidų pranešimus, kuriuos rodo ALSA biblioteka, ji naudojama garso plokštei valdyti. Patys žiniasklaidos transliuotojo kūrėjai mano, kad tai yra normalu. Šiuo atveju nenoriai su jais sutinkame.

Dabar mes visi pasiruošę dirbti su medijos srautu. Įdiegėme medijos transliuotojo biblioteką, kompiliavimo įrankį ir naudodami bandomąją programą patikrinome, ar įrankiai sukonfigūruoti ir medijos transliuotojas sėkmingai inicijuojamas.

Kitas straipsnis sukursime programą, kuri surinks ir vykdys garso signalo apdorojimą kelių filtrų grandinėje.

Šaltinis: www.habr.com