Lære VoIP-motoren Mediastreamer2. Del 1

Materialet i artiklen er taget fra min zen-kanal.

Introduktion

Denne artikel er begyndelsen på en serie om realtidsbehandling af mediedata ved hjælp af Mediastreamer2-motoren. I løbet af teksten vil der blive brugt minimale færdigheder til arbejde i Linux-terminalen og programmering i C.

Mediastreamer2 er en VoIP-motor, der er kernen i det populære open-source projekt til software VoIP-telefoner. Linphone. I Linphone implementerer Mediastreamer2 alle funktioner relateret til lyd og video. En detaljeret liste over motorens funktioner kan ses på denne side om Mediastreamer. Kildekoden findes her: GitLab.

I den følgende tekst vil vi for nemheds skyld bruge den russiske notation for Mediastreamer2: «медиастример».

Historien om dets oprettelse er ikke helt klar, men ifølge dens kildekode brugte den tidligere biblioteket Glib, hvilket antyder, at der kunne være et muligt fjernt slægtskabsforhold til GStreamer. I sammenligning med dette ser mediastreamer mere letvægtsagtig ud. Den første version af Linphone blev lanceret i 2001, så i øjeblikket har mediastreamer eksisteret og udviklet sig i næsten 20 år.

Mediastreamer er baseret på en arkitektur kaldet «Data flow» (dataflow). Et eksempel på en sådan arkitektur er vist på billedet nedenfor.

Lære VoIP-motoren Mediastreamer2. Del 1

I denne arkitektur angives dataforarbejdningsalgoritmen ikke af programkoden, men af en skitse (graf) af forbindelsen mellem funktionerne, som kan arrangeres i vilkårlig rækkefølge. Disse funktioner kaldes filtre.

Denne arkitektur gør det muligt at implementere mediebehandlingens funktionalitet som et sæt af filtre, der er forbundet i et behandlings- og RTP-trafikoverførselsdiagram for VoIP-telefonen.

Muligheden for at forbinde filtre i vilkårlige skemaer, let udvikling af nye filtre og implementeringen af mediastreamer som et selvstændigt bibliotek, gør det muligt at bruge det også i andre projekter. Desuden kan projektet være inden for VoIP, da der er mulighed for at tilføje håndlavede filtre.

Det default leverede filterbibliotek er temmelig rigt og som allerede nævnt kan det udvides med selvudviklede filtre. Men først skal vi beskrive de færdige filtre, der leveres sammen med mediastreameren. Her er deres liste:

Lydfiltre

Optagelse og afspilning af lyd

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Android native 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)
  • Arts (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
  • Optagelse i fil (wav filer) (Linux): MS_FILE_REC
  • Optagelse i 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)

Kodning/dekodning af lyd

  • 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
  • Lineær PCM: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Lydbehandling

  • Kanalomdannelse (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Konference: MS_CONF
  • DTMF-generator: MS_DTMF_GEN
  • Ekkoundertrykkelse (speex): MS_SPEEX_EC
  • Equalizer: MS_EQUALIZER
  • Mixer: MS_MIXER
  • Pakke tab kompensator (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Tone detektor: MS_TONE_DETECTOR
  • Lydstyring og niveau måling: MS_VOLUME

Videofiltre

Optagelse og afspilning af video

  • Android optagelse
  • Android afspilning
  • AV Foundation optagelse (iOS)
  • AV Foundation afspilning (iOS)
  • DirectShow optagelse (Windows)
  • DrawDib afspilning (Windows)
  • External afspilning — Send video til øverste niveau
  • GLX afspilning (Linux): MS_GLXVIDEO
  • Mire — Syntetisk bevægende billede: MS_MIRE
  • OpenGL afspilning (Mac OS X)
  • OpenGL ES2 afspilning (Android)
  • Quicktime optagelse (Mac OS X)
  • SDL afspilning: MS_SDL_OUT
  • Output af statiske billeder: MS_STATIC_IMAGE
  • Video For Linux (V4L) optagelse (Linux): MS_V4L
  • Video For Linux 2 (V4L2) optagelse (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) optagelse (Windows)
  • Video4windows (DirectShow) optagelse (Windows CE)
  • Video For Windows (vfw) optagelse (Windows)
  • XV afspilning (Linux)

Video encoding/decoding

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: 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
  • Pixel format konverter: MS_PIX_CONV
  • Resizer
  • Andre filtre
  • Data blok overførsel mellem tråde: MS_ITC_SOURCE, MS_ITC_SINK
  • Samling af datablokke fra flere indgange til én udgang: MS_JOIN
  • RTP modtagelse/afsendelse: MS_RTP_SEND, MS_RTP_RECV
  • Kopiering af inddata til flere udgange: MS_TEE
  • Konsistent belastning: MS_VOID_SINK
  • Stille kilde: MS_VOID_SOURCE

Plugins

Lydfiltre

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

    Videofiltre

  • H.264 software encoder
  • H.264 V4L2 encoder/decoder med hardware acceleration

Efter den korte beskrivelse af filteret vises typenavn, der bruges ved oprettelse af en ny instans af dette filter. I det følgende vil vi referere til denne liste.

Installation under Linux Ubuntu

Now we will perform the installation of the media streamer on the computer and assemble our first application with it.

Installing Mediastremer2 on a computer or virtual machine running Ubuntu doesn't require special skills. From now on, the symbol "$" will denote the shell prompt for entering commands. That means if you see this symbol at the beginning of a line in the listing, it indicates that this line shows the commands to be executed in the terminal.

It is assumed that during the actions described in this article, your computer has access to the Internet.

Installing the package libmediastremer-dev

We open the terminal and type the command:

$ sudo apt-get update

You will be prompted for a password to make changes, enter it and the package manager will update its databases. After this, you need to execute:

$ sudo apt-get install libmediastreamer-dev

The necessary dependency packages and the media streamer library itself will be automatically downloaded and installed.

The total size of the downloaded deb packages of dependencies will be about 35 MB. You can find out details about the installed package with the command:

$ dpkg -s libmediastreamer-dev

Eksempel på svar:

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/

Installing development tools

We install the C compiler and its accompanying tools:

$ sudo apt-get install gcc

We check the result by querying the compiler version:

$ gcc --version

The response should be something like this:

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.

Building and running the sample application

We create in home a folder for our learning projects, let's call it mstutorial:

$ mkdir ~/mstutorial

Use your favorite text editor to create a C program file named mstest.c med følgende indhold:

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

It initializes the media streamer, prints a greeting, and then terminates execution.

Save the file and compile the test application with the command:

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

Bemærk, at linjen

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

er indkapslet i anførselstegn, som findes på tastaturet, hvor også bogstavet «Ё» er.

Hvis filen ikke indeholder fejl, vil der efter kompileringen blive oprettet en fil i kataloget mstest. Vi starter programmet:

$ ./mstest

Resultatet vil være sådan:

ALSA lib conf.c:4738:(snd_config_expand) Ukendte parametre 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Ugyldig CTL default:0
ortp-warning-Kunne ikke vedhæfte mixer til kort: Ugyldigt argument
ALSA lib conf.c:4738:(snd_config_expand) Ukendte parametre 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Ukendt PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Ukendte parametre 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Ukendt PCM default:0
ortp-warning-Mærkeligt, lydkort HDA Intel PCH ser ikke ud til at være i stand til noget, prøver med plughw...
Mediastreamer er klar.

I denne liste ser vi fejlmeddelelser, som ALSA-biblioteket genererer, det bruges til at styre lydkortet. Selve udviklerne af mediastreameren mener, at dette er normalt. I dette tilfælde vil vi ufrivilligt være enige med dem.

Nu er vi klar til at arbejde med mediastreameren. Vi har installeret mediastreamer-biblioteket, kompilationsværktøjet og har med et prøveprogram tjekket, at værktøjerne er konfigureret, og mediastreameren initialiseres med succes.

I næste artikel vi vil skabe en applikation, der vil samle og udføre behandling af lydsignalet i en kæde af flere filtre.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster