Explorant el motor de VoIP Mediastreamer2. Part 1

El material de l'article està extret del meu canal zen.

Introducció

Aquest article és l'inici d'una sèrie d'articles sobre el processament de mitjans en temps real mitjançant el motor Mediastreamer2. La presentació implicarà les habilitats mínimes de treballar en el terminal Linux i programar en llenguatge C.

Mediastreamer2 és el motor VoIP darrere del popular projecte de telèfon VoIP de programari de codi obert. Linphone. A Linphone Mediastreamer2 implementa totes les funcions relacionades amb el so i el vídeo. Es pot veure una llista detallada de les funcions del motor en aquesta pàgina de Mediastreamer. El codi font és aquí: GitLab.

Més endavant en el text, per comoditat, en lloc de la paraula Mediastreamer2 utilitzarem la seva notació russa: "media streamer".

La història de la seva creació no està del tot clara, però a jutjar pel seu codi font, abans utilitzava la biblioteca Glib, que, per dir-ho, deixa entreveure una possible relació llunyana amb GStreamer. En comparació amb la qual la transmissió multimèdia sembla més lleugera. La primera versió de Linphone va aparèixer l'any 2001, per la qual cosa actualment la transmissió de mitjans existeix i es desenvolupa durant gairebé 20 anys.

Al cor de la transmissió multimèdia hi ha una arquitectura anomenada "Flux de dades" (flux de dades). Un exemple d'aquesta arquitectura es mostra a la figura següent.

Explorant el motor de VoIP Mediastreamer2. Part 1

En aquesta arquitectura, l'algorisme de processament de dades no està especificat per un codi de programa, sinó per un esquema (gràfic) per connectar funcions que es poden ordenar en qualsevol ordre. Aquestes funcions s'anomenen filtres.

Aquesta arquitectura permet implementar la funcionalitat de processament de mitjans en forma d'un conjunt de filtres connectats en un esquema per processar i transmetre el trànsit RTP d'un telèfon VoIP.

La capacitat de combinar filtres en esquemes arbitraris, el simple desenvolupament de nous filtres, la implementació del reproductor de mitjans com a biblioteca independent independent, permeten utilitzar-lo en altres projectes. A més, el projecte pot ser en l'àmbit de la VoIP, ja que és possible afegir filtres fets per un mateix.

La biblioteca de filtres subministrada per defecte és força rica i, com ja s'ha esmentat, es pot ampliar amb filtres de disseny propi. Però primer, anem a descriure els filtres ja fets que vénen amb el reproductor de mitjans. Aquí teniu la seva llista:

Filtres de so

Captura i reproducció d'àudio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • So natiu d'Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Servei de cua d'àudio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Servei d'unitats d'àudio (Mac OS X)
  • Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Reproductor de fitxers (fitxers en brut/wav/pcap) (Linux): MS_FILE_PLAYER
  • Reproductor de fitxers (fitxers en brut/wav) (Windows): MS_WINSND_READ
  • Escriure al fitxer (fitxers wav) (Linux): MS_FILE_REC
  • Escriure al fitxer (fitxers wav) (Windows): MS_WINSND_WRITE
  • Unitat d'àudio Mac (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
  • So de Windows (Windows)

Codificació/descodificació d'àudio

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

Tractament del so

  • Conversió de canal (mono->estèreo, estèreo->mono): MS_CHANNEL_ADAPTER
  • Conferència: MS_CONF
  • Generador DTMF: MS_DTMF_GEN
  • Cancel·lació d'eco (speex): MS_SPEEX_EC
  • Equalitzador: MS_EQUALIZER
  • Mesclador: MS_MIXER
  • Compensador de pèrdua de paquets (PLC): MS_GENERIC_PLC
  • Remuestreador: MS_RESAMPLE
  • Detector de to: MS_TONE_DETECTOR
  • Control de volum i mesura de nivell de senyal: MS_VOLUME

Filtres de vídeo

Captura i reproducció de vídeo

  • captura d'Android
  • reproducció d'Android
  • Captura de la Fundació AV (iOS)
  • Reproducció AV Foundation (iOS)
  • DirectShow Capture (Windows)
  • Reproducció de DrawDib (Windows)
  • Reproducció externa: enviament de vídeo a la capa superior
  • Reproducció GLX (Linux): MS_GLXVIDEO
  • Mire - Imatge en moviment sintètica: MS_MIRE
  • Reproducció OpenGL (Mac OS X)
  • Reproducció d'OpenGL ES2 (Android)
  • Quicktime Capture (Mac OS X)
  • Reproducció SDL: MS_SDL_OUT
  • Sortida d'imatge estàtica: MS_STATIC_IMAGE
  • Vídeo per a captura de Linux (V4L) (Linux): MS_V4L
  • Vídeo per a la captura de Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Captura de Video4windows (DirectShow) (Windows)
  • Captura de Video4windows (DirectShow) (Windows CE)
  • Captura de vídeo per a Windows (vfw) (Windows)
  • Reproducció XV (Linux)

Codificació/descodificació de vídeo

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Neu: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (només descodificador): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Processament de vídeo

  • instantània jpeg
  • Convertidor de format de píxels: MS_PIX_CONV
  • Redimensionador
  • Altres filtres
  • Intercanvi de blocs de dades entre fils: MS_ITC_SOURCE, MS_ITC_SINK
  • Recollida de blocs de dades de diverses entrades a una única sortida: MS_JOIN
  • Recepció/transmissió RTP: MS_RTP_SEND, MS_RTP_RECV
  • Còpia de dades d'entrada a múltiples sortides: MS_TEE
  • Càrrega finalitzada: MS_VOID_SINK
  • Font del silenci: MS_VOID_SOURCE

Connectors

Filtres de so

  • Codificador/descodificador AMR-NB
  • Codificador/descodificador G.729
  • Codificador/descodificador iLBC
  • Codificador/descodificador SILK

    Filtres de vídeo

  • Codificador de programari H.264
  • Codificador/descodificador accelerat per maquinari H.264 V4L2

Després d'una breu descripció del filtre, es mostra el nom del tipus, que s'utilitza quan es crea una nova instància d'aquest filtre. A continuació, farem referència a aquesta llista.

Instal·lació sota Linux Ubuntu

Ara instal·larem el reproductor multimèdia a l'ordinador i construirem la nostra primera aplicació amb ell.

La instal·lació de Mediastremer2 en un ordinador o màquina virtual amb Ubuntu no requereix cap habilitat especial. Aquí i a continuació, el símbol "$" indicarà l'indicador de l'intèrpret d'ordres per introduir ordres. Aquells. si al llistat veieu aquest símbol al principi de la línia, aquesta és la línia en què es mostren les ordres que s'executen al terminal.

Se suposa que durant els passos d'aquest article, el vostre ordinador té accés a Internet.

Instal·lant el paquet libmediastremer-dev

Inicieu el terminal i escriviu l'ordre:

$ sudo apt-get update

Se us demanarà una contrasenya per fer canvis, introduïu-la i el gestor de paquets actualitzarà les seves bases de dades. Després d'això, heu d'executar:

$ sudo apt-get install libmediastreamer-dev

Els paquets de dependències necessaris i la pròpia biblioteca de reproducció multimèdia es baixaran i s'instal·laran automàticament.

La mida total dels paquets de dependència descarregats serà d'aproximadament 35 MB. Els detalls sobre el paquet instal·lat es poden trobar amb l'ordre:

$ dpkg -s libmediastreamer-dev

Exemple de resposta:

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/

Instal·lació d'eines de desenvolupament

Instal·leu el compilador C i les eines que l'acompanyen:

$ sudo apt-get install gcc

Comprovem el resultat consultant la versió del compilador:

$ gcc --version

La resposta hauria de ser una cosa com aquesta:

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.

Creació i execució de l'aplicació de prova

Creem en casa carpeta per als nostres projectes tutorials, anomenem-la mtutorial:

$ mkdir ~/mstutorial

Utilitzeu el vostre editor de text preferit i creeu un fitxer de programa C anomenat mstest.c amb el següent contingut:

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

Inicialitza l'emissió multimèdia, imprimeix una salutació i surt.

Deseu el fitxer i compileu l'aplicació de prova amb l'ordre:

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

Tingueu en compte que la línia

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

entre cometes, que es troben al teclat al mateix lloc que la lletra "Ё".

Si el fitxer no conté errors, després de la compilació apareixerà un fitxer al directori mstest. Comencem el programa:

$ ./mstest

El resultat serà així:

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.

En aquest llistat, veiem els missatges d'error que mostra la biblioteca ALSA, s'utilitza per controlar la targeta de so. Els mateixos desenvolupadors de la transmissió de mitjans creuen que això és normal. En aquest cas, estem d'acord amb ells de mala gana.

Ara ja estem preparats per treballar amb el reproductor de mitjans. Hem instal·lat la biblioteca de reproducció de mitjans, l'eina de compilació i, mitjançant una aplicació de prova, hem verificat que les eines estan configurades i que l'emissió de mitjans s'inicia correctament.

Pròxim article crearem una aplicació que muntarà i executarà el processament d'un senyal d'àudio en una cadena de diversos filtres.

Font: www.habr.com