Udforskning af Mediastreamer2 VoIP-motoren. Del 1

Artiklens materiale er hentet fra min zen kanal.

Indledning

Denne artikel er begyndelsen på en serie artikler om mediebehandling i realtid ved hjælp af Mediastreamer2-motoren. Præsentationen vil involvere minimumsfærdighederne ved at arbejde i Linux-terminalen og programmere i C-sproget.

Mediastreamer2 er VoIP-motoren bag det populære open source-software voip-telefonprojekt. Linphone. I Linphone implementerer Mediastreamer2 alle funktioner relateret til lyd og video. En detaljeret liste over motorfunktioner kan ses på denne Mediastreamer-side. Kildekoden er her: GitLab.

Længere i teksten, for nemheds skyld, vil vi i stedet for ordet Mediastreamer2 bruge dets russiske notation: "mediestreamer".

Historien om dens oprettelse er ikke helt klar, men at dømme efter dens kildekode brugte den tidligere biblioteket glib, som sådan set antyder et muligt fjernt forhold til GStreamer. I sammenligning med hvilken mediestreameren ser mere let ud. Den første version af Linphone dukkede op i 2001, så i øjeblikket eksisterer og udvikler mediestreameren i næsten 20 år.

I hjertet af mediestreameren er en arkitektur kaldet "Data flow" (dataflow). Et eksempel på en sådan arkitektur er vist i figuren nedenfor.

Udforskning af Mediastreamer2 VoIP-motoren. Del 1

I denne arkitektur er databehandlingsalgoritmen ikke specificeret af en programkode, men af ​​et skema (graf) til at forbinde funktioner, der kan arrangeres i enhver rækkefølge. Disse funktioner kaldes filtre.

Denne arkitektur gør det muligt at implementere mediebehandlingsfunktionaliteten i form af et sæt filtre forbundet med VoIP-telefonens RTP-trafikbehandlings- og transmissionsskema.

Evnen til at kombinere filtre i vilkårlige skemaer, den enkle udvikling af nye filtre, implementeringen af ​​mediestreameren som et uafhængigt separat bibliotek, gør det muligt at bruge det i andre projekter. Desuden kan projektet være inden for VoIP, da det er muligt at tilføje filtre lavet af sig selv.

Filterbiblioteket, der leveres som standard, er ret rigt og kan, som allerede nævnt, udvides med filtre af dit eget design. Men lad os først beskrive de færdiglavede filtre, der følger med mediestreameren. Her er deres liste:

Lydfiltre

Lydoptagelse og afspilning

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Indbygget Android-lyd (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)
  • Kunst (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Filafspiller (raw/wav/pcap-filer) (Linux): MS_FILE_PLAYER
  • Filafspiller (raw/wav-filer) (Windows): MS_WINSND_READ
  • Skriv til fil (wav-filer) (Linux): MS_FILE_REC
  • Skriv til fil (wav-filer) (Windows): MS_WINSND_WRITE
  • Mac lydenhed (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-lyd (Windows)

Lydkodning/afkodning

  • G.711 a-lov: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-lov: 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
  • Lineær PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Lydbehandling

  • Kanalkonvertering (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konference: MS_CONF
  • DTMF Generator: MS_DTMF_GEN
  • Ekkoannullering (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Pakketabskompensator (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Tonedetektor: MS_TONE_DETECTOR
  • Volumenkontrol og signalniveaumåling: MS_VOLUME

Video filtre

Videooptagelse og afspilning

  • android capture
  • android afspilning
  • AV Foundation capture (iOS)
  • AV Foundation-afspilning (iOS)
  • DirectShow Capture (Windows)
  • DrawDib-afspilning (Windows)
  • Ekstern afspilning - Sender video til det øverste lag
  • GLX-afspilning (Linux): MS_GLXVIDEO
  • Mire - Syntetisk levende billede: MS_MIRE
  • OpenGL-afspilning (Mac OS X)
  • OpenGL ES2-afspilning (Android)
  • Quicktime Capture (Mac OS X)
  • SDL-afspilning: MS_SDL_OUT
  • Statisk billedoutput: MS_STATIC_IMAGE
  • Video til Linux (V4L)-optagelse (Linux): MS_V4L
  • Video til Linux 2 (V4L2)-optagelse (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow)-optagelse (Windows)
  • Video4windows (DirectShow)-optagelse (Windows CE)
  • Video til Windows (vfw)-optagelse (Windows)
  • XV-afspilning (Linux)

Videokodning/afkodning

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

Videobehandling

  • jpeg snapshot
  • Pixelformatkonverter: MS_PIX_CONV
  • Resizer
  • Andre filtre
  • Udveksling af datablokke mellem tråde: MS_ITC_SOURCE, MS_ITC_SINK
  • Indsamling af datablokke fra flere input til et enkelt output: MS_JOIN
  • RTP-modtagelse/transmission: MS_RTP_SEND, MS_RTP_RECV
  • Kopiering af inputdata til flere udgange: MS_TEE
  • Afsluttet belastning: MS_VOID_SINK
  • Silence Kilde: MS_VOID_SOURCE

plugins

Lydfiltre

  • AMR-NB encoder/dekoder
  • G.729 koder/dekoder
  • iLBC encoder/dekoder
  • SILK encoder/dekoder

    Video filtre

  • H.264 software encoder
  • H.264 V4L2 hardwareaccelereret koder/dekoder

Efter en kort beskrivelse af filteret vises navnet på typen, som bruges ved oprettelse af en ny instans af dette filter. I det følgende vil vi henvise til denne liste.

Installation under Linux Ubuntu

Nu vil vi installere mediestreameren på computeren og bygge vores første applikation med den.

Installation af Mediastremer2 på en computer eller virtuel maskine, der kører Ubuntu, kræver ingen særlige færdigheder. Her og nedenfor vil symbolet "$" angive shell-prompten for at indtaste kommandoer. De der. hvis du i listen ser dette symbol i begyndelsen af ​​linjen, så er dette linjen, hvor kommandoer vises til at blive udført i terminalen.

Det antages, at din computer under trinene i denne artikel har adgang til internettet.

Installation af libmediastremer-dev-pakken

Start terminalen og skriv kommandoen:

$ sudo apt-get update

Du bliver bedt om en adgangskode for at foretage ændringer, indtast den, og pakkehåndteringen vil opdatere sine databaser. Derefter skal du køre:

$ sudo apt-get install libmediastreamer-dev

De nødvendige afhængighedspakker og selve mediestreamerbiblioteket vil automatisk blive downloadet og installeret.

Den samlede størrelse af de downloadede afhængighedsdeb-pakker vil være cirka 35 MB. Detaljer om den installerede pakke kan findes med kommandoen:

$ dpkg -s libmediastreamer-dev

Eksempel på svar:

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/

Installation af udviklingsværktøjer

Installer C-kompileren og dens medfølgende værktøjer:

$ sudo apt-get install gcc

Vi tjekker resultatet ved at forespørge compilerversionen:

$ gcc --version

Svaret burde være noget som dette:

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.

Opbygning og drift af prøveapplikationen

Vi skaber i hjem mappe til vores tutorial-projekter, lad os kalde det mtutorial:

$ mkdir ~/mstutorial

Brug din foretrukne teksteditor og opret en C-programfil kaldet mstest.c med følgende indhold:

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

Den initialiserer mediestreameren, udskriver en hilsen og afslutter.

Gem filen og kompiler testapplikationen med kommandoen:

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

Bemærk, at linjen

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

omgivet af anførselstegn, som er placeret på tastaturet på samme sted som bogstavet "Ё".

Hvis filen ikke indeholder fejl, vises en fil i mappen efter kompilering mstest. Vi starter programmet:

$ ./mstest

Resultatet bliver således:

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.

I denne liste ser vi de fejlmeddelelser, som ALSA-biblioteket viser, det bruges til at styre lydkortet. Udviklerne af mediestreameren mener selv, at det er normalt. I dette tilfælde er vi modvilligt enige med dem.

Nu er vi alle klar til at arbejde med mediestreameren. Vi har installeret mediestreamerbiblioteket, kompileringsværktøjet og ved hjælp af en prøveapplikation bekræftet, at værktøjerne er konfigureret, og at mediestreameren initialiseres.

Næste artiklen vi vil skabe en applikation, der samler og kører behandlingen af ​​et lydsignal i en kæde af flere filtre.

Kilde: www.habr.com