Leren over de VoIP-engine Mediastreamer2. Deel 1

Het materiaal van dit artikel is afkomstig van mijn zen-kanaal.

Inleiding

Dit artikel is het begin van een serie artikelen over realtime verwerking van mediagegevens met de Mediastreamer2-engine. Tijdens de uitleg zullen minimale vaardigheden in het gebruik van de Linux-terminal en programmeren in de C-taal vereist zijn.

Mediastreamer2 is een VoIP-engine die de basis vormt van het populaire open-source project van de software VoIP-telefoon. Linphone. In Linphone implementeert Mediastreamer2 alle functies met betrekking tot audio en video. Een uitgebreide lijst van mogelijkheden van de engine is te vinden op deze pagina van Mediastreamer. De broncode is hier te vinden: GitLab.

In de tekst zullen we, voor de gemakszucht, in plaats van het woord Mediastreamer2 zijn Nederlandse benaming gebruiken: 'mediastreamer'.

De geschiedenis van de ontwikkeling is niet helemaal duidelijk, maar gezien de broncode eerder gebruik maakte van de bibliotheek Glib, suggereert dit een mogelijke verre verwantschap met GStreamer. In vergelijking hiermee lijkt mediastreamer veel lichter. De eerste versie van Linphone verscheen in 2001, dus op dit moment bestaat en ontwikkelt mediastreamer zich al bijna 20 jaar.

De basis van de mediastreamer is een architectuur die 'Data flow' (gegevensstroom) wordt genoemd. Een voorbeeld van deze architectuur is afgebeeld in de afbeelding hieronder.

Leren over de VoIP-engine Mediastreamer2. Deel 1

In deze architectuur wordt het algoritme voor gegevensverwerking niet bepaald door de programmeercode, maar door een diagram (grafiek) van hoe functies met elkaar zijn verbonden, die in om het even welke volgorde kunnen worden opgesteld. Deze functies worden filters genoemd.

Deze architectuur maakt het mogelijk om media-verwerkingsfunctionaliteit te implementeren in de vorm van een set filters, die zijn verbonden in een schema voor de verwerking en overdracht van RTP-verkeer van de VoIP-telefoon.

De mogelijkheid om filters in willekeurige schema's te verbinden, de eenvoudige ontwikkeling van nieuwe filters en de implementatie van de mediastreamer als een aparte bibliotheek, maken het mogelijk om het ook in andere projecten te gebruiken. Bovendien kan het project zich op het gebied van VoIP bevinden, omdat het mogelijk is om zelfgemaakte filters toe te voegen.

De standaardgeleverde filterbibliotheek is behoorlijk uitgebreid en zoals eerder vermeld, kan deze worden uitgebreid met filters die zelf zijn ontwikkeld. Maar laten we eerst de bestaande filters beschrijven die samen met de mediastreamer worden geleverd. Hier is hun lijst:

Audiobronnen

Geluid vastleggen en afspelen

  • 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
  • Bestandspeler (raw/wav/pcap bestanden) (Linux): MS_FILE_PLAYER
  • Bestandspeler (raw/wav bestanden) (Windows): MS_WINSND_READ
  • Opname in bestand (wav bestanden) (Linux): MS_FILE_REC
  • Opname in bestand (wav bestanden) (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)

Coderen/decoderen van geluid

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

Geluidverwerking

  • Kanaalverandering (mono-> stereo, stereo-> mono): MS_CHANNEL_ADAPTER
  • Conferentie: MS_CONF
  • DTMF-generator: MS_DTMF_GEN
  • Echo-onderdrukking (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Verlies van pakkettencompensator (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Toondetector: MS_TONE_DETECTOR
  • Volume controle en signaalniveau meting: MS_VOLUME

Videofilters

Videovangst en -weergave

  • Android opname
  • Android weergave
  • AV Foundation opname (iOS)
  • AV Foundation weergave (iOS)
  • DirectShow opname (Windows)
  • DrawDib weergave (Windows)
  • Externe weergave — Video naar bovenste laag verzenden
  • GLX weergave (Linux): MS_GLXVIDEO
  • Mire — Synthesebeeld: MS_MIRE
  • OpenGL weergave (Mac OS X)
  • OpenGL ES2 weergave (Android)
  • Quicktime opname (Mac OS X)
  • SDL weergave: MS_SDL_OUT
  • Weergave van statische afbeeldingen: MS_STATIC_IMAGE
  • Video Voor Linux (V4L) opname (Linux): MS_V4L
  • Video Voor Linux 2 (V4L2) opname (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) opname (Windows)
  • Video4windows (DirectShow) opname (Windows CE)
  • Video Voor Windows (vfw) opname (Windows)
  • XV weergave (Linux)

Codering / decodering van video

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

Videoprocessing

  • JPEG snapshot
  • Pixel formaat converter: MS_PIX_CONV
  • Resizer
  • Overige filters
  • Gegevensblokuitwisseling tussen threads: MS_ITC_SOURCE, MS_ITC_SINK
  • Gegevensblokverzameling van meerdere ingangen naar één uitgang: MS_JOIN
  • RTP ontvangst/verzending: MS_RTP_SEND, MS_RTP_RECV
  • Kopiëren van invoergegevens naar meerdere uitgangen: MS_TEE
  • Consistente belasting: MS_VOID_SINK
  • Stiltebron: MS_VOID_SOURCE

Plug-ins

Audiobronnen

  • AMR-NB encoder/decoder
  • G.729 encoder/decoder
  • iLBC encoder/decoder
  • SILK encoder/decoder

    Videofilters

  • H.264 software encoder
  • H.264 V4L2 encoder/decoder met hardwareversnelling

Na de korte beschrijving van de filter verschijnt de naam van het type dat wordt gebruikt bij het maken van een nieuwe instantie van dit filter. In latere verwijzingen zullen we naar deze lijst verwijzen.

Installatie onder Linux Ubuntu

Nu gaan we de mediastramer op de computer installeren en onze eerste applicatie ermee bouwen.

De installatie van Mediastremer2 op een computer of virtuele machine met Ubuntu vereist geen bijzondere vaardigheden. Hier en verder zal het symbool '$' de shell-prompt aanduiden voor het invoeren van commando's. Dus, als u dit symbool aan het begin van een regel in de opmaak ziet, betekent dit dat het de regel is waarin de uit te voeren commando's in de terminal worden getoond.

We gaan ervan uit dat uw computer tijdens de uitvoering van de stappen die in dit artikel worden beschreven toegang heeft tot het internet.

Installatie van het pakket libmediastremer-dev

We starten de terminal en typen het commando in:

$ sudo apt-get update

Er zal om een wachtwoord gevraagd worden voor het aanbrengen van wijzigingen, voer het in en de pakketbeheerder zal zijn databases bijwerken. Voer daarna het volgende uit:

$ sudo apt-get install libmediastreamer-dev

De benodigde afhankelijkheidspakketten en de mediastramerbibliotheek zullen automatisch worden gedownload en geïnstalleerd.

De totale grootte van de gedownloade deb-pakketten van afhankelijkheden zal ongeveer 35 MB bedragen. U kunt gedetailleerde informatie over het geïnstalleerde pakket opvragen met het commando:

$ dpkg -s libmediastreamer-dev

Voorbeeld van een antwoord:

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 een audio- en video-internettelefoon die het SIP-protocol gebruikt. Het heeft een GTK+ en console-interface, omvat een grote verscheidenheid aan audio- en video-codecs, en biedt IM-functies.
.
Dit pakket bevat de ontwikkelingsbibliotheken voor het afhandelen van media-operaties.
Original-Maintainer: Debian VoIP Team 
Homepage: http://www.linphone.org/

Installatie van ontwikkeltools

We installeren de C-compiler en de bijbehorende tools:

$ sudo apt-get install gcc

We controleren het resultaat door de versie van de compiler op te vragen:

$ gcc --version

Het antwoord zou ongeveer als volgt moeten zijn:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Dit is gratis software; zie de bron voor kopieervoorwaarden. Er is GEEN
waarborg; zelfs niet voor VERHANDELBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL.

Bouwen en uitvoeren van de proefapplicatie

We maken een map voor onze leerprojecten aan in home en noemen deze mstutorial:

$ mkdir ~/mstutorial

Gebruik uw favoriete teksteditor en maak een C-programmabestand aan met de naam mstest.c met de volgende inhoud:

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

Het voert de initialisatie van de mediastramer uit, drukt een begroeting af en beëindigt de uitvoering.

Sla het bestand op en compileer de testapplicatie met het commando:

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

Let op dat de regel

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

is omgeven door aanhalingstekens, die op het toetsenbord staan waar ook de letter «Ё» staat.

Als het bestand geen fouten bevat, verschijnt er na de compilatie een bestand in de map mstest. We starten het programma:

$ .\/mstest

Het resultaat zal als volgt zijn:

ALSA lib conf.c:4738:(snd_config_expand) Onbekende parameters 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Ongeldige CTL default:0
ortp-warning-Kon mixer niet aan kaart koppelen: Ongeldig argument
ALSA lib conf.c:4738:(snd_config_expand) Onbekende parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Onbekende PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Onbekende parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Onbekende PCM default:0
ortp-warning-Vreemd, geluidskaart HDA Intel PCH lijkt niet in staat te zijn om iets te doen, opnieuw proberen met plughw...
Mediastreamer is klaar.

In deze lijst zien we de foutmeldingen die door de ALSA-bibliotheek worden weergegeven, die gebruikt wordt voor het beheren van de geluidskaart. De ontwikkelaars van de mediastreamer beschouwen dit als normaal. We zullen hen in dit geval gedwongen gelijk geven.

Nu zijn we volledig voorbereid om met de mediastreamer te werken. We hebben de mediastreamer-bibliotheek geïnstalleerd, de compilatietool, en met behulp van een testapplicatie hebben we gecontroleerd dat de tools zijn ingesteld en dat de mediastreamer succesvol is geïnitialiseerd.

In de volgende artikel gaan we een applicatie creëren die de verwerking van het audiosignaal in een keten van meerdere filters zal samenstellen en uitvoeren.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster