Utforska Mediastreamer2 VoIP-motorn. Del 1

Materialet i artikeln är hämtat från min zen kanal.

Inledning

Den här artikeln är början på en serie artiklar om mediabearbetning i realtid med hjälp av Mediastreamer2-motorn. Presentationen kommer att involvera de minsta färdigheterna att arbeta i Linux-terminalen och programmera i C-språket.

Mediastreamer2 är VoIP-motorn bakom det populära voip-telefonprojektet med öppen källkod. telefon. I Linphone implementerar Mediastreamer2 alla funktioner relaterade till ljud och video. En detaljerad lista över motorfunktioner kan ses på denna Mediastreamer-sida. Källkoden finns här: GitLab.

Längre i texten, för enkelhetens skull, istället för ordet Mediastreamer2 kommer vi att använda dess ryska notation: "mediastreamer".

Historien om dess skapelse är inte helt klar, men att döma av dess källkod använde den tidigare biblioteket glib, som liksom antyder ett eventuellt avlägset förhållande till GStreamer. I jämförelse med vilken ser mediastreamern mer lätt ut. Den första versionen av Linphone dök upp 2001, så just nu finns mediastreamern och utvecklas i nästan 20 år.

I hjärtat av mediastreamern finns en arkitektur som kallas "Dataflöde" (dataflöde). Ett exempel på en sådan arkitektur visas i figuren nedan.

Utforska Mediastreamer2 VoIP-motorn. Del 1

I denna arkitektur specificeras databehandlingsalgoritmen inte av en programkod, utan av ett schema (graf) för att ansluta funktioner som kan ordnas i valfri ordning. Dessa funktioner kallas filter.

Denna arkitektur gör det möjligt att implementera mediebehandlingsfunktionen i form av en uppsättning filter kopplade i ett schema för bearbetning och överföring av RTP-trafik från en VoIP-telefon.

Möjligheten att kombinera filter till godtyckliga scheman, den enkla utvecklingen av nya filter, implementeringen av mediastreamern som ett oberoende separat bibliotek, gör att den kan användas i andra projekt. Dessutom kan projektet vara inom området VoIP, eftersom det är möjligt att lägga till filter gjorda av sig själv.

Filterbiblioteket som tillhandahålls som standard är ganska rikt och kan, som redan nämnts, utökas med filter av vår egen design. Men låt oss först beskriva de färdiga filtren som följer med mediastreamern. Här är deras lista:

Ljudfilter

Ljudinspelning och uppspelning

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android-ljud (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)
  • Konst (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Filspelare (raw/wav/pcap-filer) (Linux): MS_FILE_PLAYER
  • Filspelare (raw/wav-filer) (Windows): MS_WINSND_READ
  • Skriv till fil (wav-filer) (Linux): MS_FILE_REC
  • Skriv till fil (wav-filer) (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)

Ljudkodning/avkodning

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

Ljudbearbetning

  • Kanalkonvertering (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konferens: MS_CONF
  • DTMF-generator: MS_DTMF_GEN
  • Eko-avstängning (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Paketförlustkompensator (PLC): MS_GENERIC_PLC
  • Omsamplare: MS_RESAMPLE
  • Tondetektor: MS_TONE_DETECTOR
  • Volymkontroll och signalnivåmätning: MS_VOLUME

Videofilter

Videoinspelning och uppspelning

  • android fånga
  • android uppspelning
  • AV Foundation capture (iOS)
  • AV Foundation-uppspelning (iOS)
  • DirectShow Capture (Windows)
  • DrawDib-uppspelning (Windows)
  • Extern uppspelning - Skickar video till det översta lagret
  • GLX-uppspelning (Linux): MS_GLXVIDEO
  • Mire - Syntetisk rörlig bild: MS_MIRE
  • OpenGL-uppspelning (Mac OS X)
  • OpenGL ES2-uppspelning (Android)
  • Quicktime Capture (Mac OS X)
  • SDL-uppspelning: MS_SDL_OUT
  • Statisk bildutgång: MS_STATIC_IMAGE
  • Videoinspelning för Linux (V4L) (Linux): MS_V4L
  • Videoinspelning för Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) fånga (Windows)
  • Video4windows (DirectShow) fånga (Windows CE)
  • Videoinspelning för Windows (vfw) (Windows)
  • XV-uppspelning (Linux)

Videokodning/avkodning

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

Videobearbetning

  • jpeg ögonblicksbild
  • Pixelformatkonverterare: MS_PIX_CONV
  • Resizer
  • Andra filter
  • Utbyte av datablock mellan trådar: MS_ITC_SOURCE, MS_ITC_SINK
  • Samla in datablock från flera ingångar till en enda utgång: MS_JOIN
  • RTP-mottagning/sändning: MS_RTP_SEND, MS_RTP_RECV
  • Kopierar indata till flera utgångar: MS_TEE
  • Avbruten laddning: MS_VOID_SINK
  • Tystnadskälla: MS_VOID_SOURCE

plugin-program

Ljudfilter

  • AMR-NB kodare/avkodare
  • G.729 kodare/avkodare
  • iLBC-kodare/avkodare
  • SILK kodare/avkodare

    Videofilter

  • H.264 mjukvarukodare
  • H.264 V4L2 hårdvaruaccelererad kodare/avkodare

Efter en kort beskrivning av filtret visas namnet på typen som används när man skapar en ny instans av detta filter. I det följande kommer vi att hänvisa till denna lista.

Installation under Linux Ubuntu

Nu ska vi installera mediastreamern på datorn och bygga vår första applikation med den.

Att installera Mediastremer2 på en dator eller virtuell maskin som kör Ubuntu kräver inga speciella färdigheter. Här och nedan kommer symbolen "$" att beteckna skalprompten för att ange kommandon. De där. om du i listan ser den här symbolen i början av raden, så är det här raden där kommandon visas att utföras i terminalen.

Det antas att din dator har tillgång till Internet under stegen i den här artikeln.

Installerar paketet libmediastremer-dev

Starta terminalen och skriv kommandot:

$ sudo apt-get update

Du kommer att bli ombedd att ange ett lösenord för att göra ändringar, ange det och pakethanteraren kommer att uppdatera sina databaser. Efter det måste du köra:

$ sudo apt-get install libmediastreamer-dev

De nödvändiga beroendepaketen och själva mediastreamerbiblioteket kommer att laddas ner och installeras automatiskt.

Den totala storleken på de nedladdade beroendedeb-paketen kommer att vara cirka 35 MB. Detaljer om det installerade paketet kan hittas med kommandot:

$ dpkg -s libmediastreamer-dev

Svarsexempel:

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/

Installera utvecklingsverktyg

Installera C-kompilatorn och dess medföljande verktyg:

$ sudo apt-get install gcc

Vi kontrollerar resultatet genom att begära kompilatorversionen:

$ gcc --version

Svaret borde vara ungefär så här:

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.

Bygga och köra testapplikationen

Vi skapar i hem mapp för våra tutorialprojekt, låt oss kalla det mtutorial:

$ mkdir ~/mstutorial

Använd din favorittextredigerare och skapa en C-programfil som heter mstest.c med följande innehåll:

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

Den initierar mediastreamern, skriver ut en hälsning och avslutar.

Spara filen och kompilera testapplikationen med kommandot:

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

Observera att linjen

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

omges av citattecken, som finns på tangentbordet på samma plats som bokstaven "Ё".

Om filen inte innehåller fel, kommer en fil att visas i katalogen efter kompileringen mstest. Vi startar programmet:

$ ./mstest

Resultatet blir så här:

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 denna lista ser vi de felmeddelanden som ALSA-biblioteket visar, det används för att styra ljudkortet. Utvecklarna av mediastreamern anser själva att detta är normalt. I det här fallet håller vi motvilligt med dem.

Nu är vi alla redo att arbeta med mediastreamern. Vi har installerat mediastreamerbiblioteket, kompileringsverktyget, och med hjälp av en testapplikation har vi verifierat att verktygen är konfigurerade och att mediastreamern initieras framgångsrikt.

Nästa artikeln vi kommer att skapa en applikation som kommer att montera och köra behandlingen av en ljudsignal i en kedja av flera filter.

Källa: will.com