Esplorare il motore VoIP di Mediastreamer2. Parte 1

Il materiale dell'articolo è tratto dal mio canale zen.

Introduzione

Questo articolo è l'inizio di una serie di articoli sull'elaborazione dei media in tempo reale utilizzando il motore Mediastreamer2. La presentazione riguarderà le competenze minime di lavoro nel terminale Linux e di programmazione in linguaggio C.

Mediastreamer2 è il motore VoIP alla base del popolare progetto di telefonia VoIP con software open source. telefono cellulare. In Linphone Mediastreamer2 implementa tutte le funzioni relative al suono e al video. Un elenco dettagliato delle caratteristiche del motore può essere visto su questa pagina Mediastreamer. Il codice sorgente è qui: GitLab.

Più avanti nel testo, per comodità, invece della parola Mediastreamer2 useremo la sua notazione russa: "media streamer".

La storia della sua creazione non è del tutto chiara, ma a giudicare dal suo codice sorgente, in precedenza utilizzava la libreria glib, che, per così dire, accenna a una possibile lontananza con GStreamer. Rispetto al quale lo streamer multimediale sembra più leggero. La prima versione di Linphone è apparsa nel 2001, quindi al momento lo streamer multimediale esiste e si sviluppa da quasi 20 anni.

Al centro dello streamer multimediale c'è un'architettura chiamata "flusso di dati" (flusso di dati). Un esempio di tale architettura è mostrato nella figura seguente.

Esplorare il motore VoIP di Mediastreamer2. Parte 1

In questa architettura, l'algoritmo di elaborazione dei dati non è specificato da un codice di programma, ma da uno schema (grafico) per collegare le funzioni che possono essere disposte in qualsiasi ordine. Queste funzioni sono chiamate filtri.

Questa architettura consente di implementare la funzionalità di elaborazione dei media sotto forma di un insieme di filtri collegati allo schema di elaborazione e trasmissione del traffico RTP del telefono VoIP.

La capacità di combinare i filtri in schemi arbitrari, il semplice sviluppo di nuovi filtri, l'implementazione dello streamer multimediale come libreria separata indipendente, ne consentono l'utilizzo in altri progetti. Inoltre, il progetto può essere nel campo del VoIP, poiché è possibile aggiungere filtri realizzati da soli.

La libreria di filtri fornita di default è piuttosto ricca e, come già accennato, può essere estesa con filtri di nostra progettazione. Ma prima, descriviamo i filtri già pronti forniti con lo streamer multimediale. Ecco la loro lista:

Filtri sonori

Acquisizione e riproduzione audio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Suono nativo Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Servizio coda audio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Servizio unità audio (Mac OS X)
  • Arti (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Lettore di file (file raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Lettore di file (file raw/wav) (Windows): MS_WINSND_READ
  • Scrivi su file (file wav) (Linux): MS_FILE_REC
  • Scrivi su file (file wav) (Windows): MS_WINSND_WRITE
  • Unità audio Mac (Mac OS X)
  • MME (finestre)
  • Sistema operativo OSS (Linux): MS_OSS_WRITE, MS_OSS_READ
  • Porta Audio (Mac OS X)
  • PulseAudio (Linux): MS_PULSE_WRITE, MS_PULSE_READ
  • Audio di Windows (Windows)

Codifica/decodifica audio

  • G.711 a-legge: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-legge: 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 lineare: MS_L16_ENC, MS_L16_DEC
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Elaborazione del suono

  • Conversione canale (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Conferenza: MS_CONF
  • Generatore DTMF: MS_DTMF_GEN
  • Cancellazione dell'eco (speex): MS_SPEEX_EC
  • Equalizzatore: MS_EQUALIZER
  • Miscelatore: MS_MIXER
  • Compensatore perdita pacchetti (PLC): MS_GENERIC_PLC
  • Ricampionatore: MS_RESAMPLE
  • Rilevatore di toni: MS_TONE_DETECTOR
  • Controllo del volume e misurazione del livello del segnale: MS_VOLUME

Filtri video

Acquisizione e riproduzione video

  • cattura Android
  • riproduzione Android
  • Acquisizione AV Foundation (iOS)
  • Riproduzione AV Foundation (iOS)
  • Acquisizione DirectShow (Windows)
  • Riproduzione DrawDib (Windows)
  • Riproduzione esterna: invio di video al livello superiore
  • Riproduzione GLX (Linux): MS_GLXVIDEO
  • Mire - Immagine in movimento sintetica: MS_MIRE
  • Riproduzione OpenGL (Mac OS X)
  • Riproduzione OpenGL ES2 (Android)
  • Acquisizione Quicktime (Mac OS X)
  • Riproduzione SDL: MS_SDL_OUT
  • Output immagine statica: MS_STATIC_IMAGE
  • Acquisizione video per Linux (V4L) (Linux): MS_V4L
  • Acquisizione video per Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Acquisizione Video4windows (DirectShow) (Windows)
  • Acquisizione Video4windows (DirectShow) (Windows CE)
  • Acquisizione video per Windows (vfw) (Windows)
  • Riproduzione XV (Linux)

Codifica/decodifica video

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

Elaborazione video

  • istantanea jpeg
  • Convertitore di formato pixel: MS_PIX_CONV
  • Ridimensionatore
  • Altri filtri
  • Scambio di blocchi di dati tra thread: MS_ITC_SOURCE, MS_ITC_SINK
  • Raccolta di blocchi di dati da più input a un singolo output: MS_JOIN
  • Ricezione/trasmissione RTP: MS_RTP_SEND, MS_RTP_RECV
  • Copia dei dati di input su più output: MS_TEE
  • Carico terminato: MS_VOID_SINK
  • Origine silenzio: MS_VOID_SOURCE

plugins

Filtri sonori

  • Encoder/decodificatore AMR-NB
  • Encoder/decodificatore G.729
  • Codificatore/decodificatore iLBC
  • Codificatore/decodificatore SILK

    Filtri video

  • Codificatore software H.264
  • Codificatore/decodificatore H.264 V4L2 con accelerazione hardware

Dopo una breve descrizione del filtro, viene mostrato il nome del tipo, che viene utilizzato durante la creazione di una nuova istanza di questo filtro. In quanto segue, faremo riferimento a questo elenco.

Installazione sotto Linux Ubuntu

Ora installeremo lo streamer multimediale sul computer e creeremo la nostra prima applicazione con esso.

L'installazione di Mediastremer2 su un computer o una macchina virtuale che esegue Ubuntu non richiede competenze particolari. Qui e sotto, il simbolo "$" indicherà il prompt della shell per l'inserimento dei comandi. Quelli. se nell'elenco vedi questo simbolo all'inizio della riga, allora questa è la riga in cui sono mostrati i comandi da eseguire nel terminale.

Si presuppone che durante i passaggi descritti in questo articolo il computer abbia accesso a Internet.

Installazione del pacchetto libmediastremer-dev

Avvia il terminale e digita il comando:

$ sudo apt-get update

Ti verrà chiesta una password per apportare modifiche, inseriscila e il gestore pacchetti aggiornerà i suoi database. Successivamente, è necessario eseguire:

$ sudo apt-get install libmediastreamer-dev

I pacchetti di dipendenza necessari e la stessa libreria di media streamer verranno scaricati e installati automaticamente.

La dimensione totale dei pacchetti deb delle dipendenze scaricati sarà di circa 35 MB. I dettagli sul pacchetto installato possono essere trovati con il comando:

$ dpkg -s libmediastreamer-dev

Esempio di risposta:

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/

Installazione degli strumenti di sviluppo

Installa il compilatore C e i suoi strumenti di accompagnamento:

$ sudo apt-get install gcc

Controlliamo il risultato interrogando la versione del compilatore:

$ gcc --version

La risposta dovrebbe essere qualcosa del genere:

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.

Creazione ed esecuzione dell'applicazione di prova

Creiamo dentro home cartella per i nostri progetti tutorial, chiamiamola mstutorial:

$ mkdir ~/mstutorial

Usa il tuo editor di testo preferito e crea un file di programma C chiamato mstest.c con il seguente contenuto:

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

Inizializza lo streamer multimediale, stampa un saluto ed esce.

Salvare il file e compilare l'applicazione di test con il comando:

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

Si noti che la linea

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

racchiuso tra virgolette, che si trovano sulla tastiera nello stesso punto della lettera "Ё".

Se il file non contiene errori, dopo la compilazione apparirà un file nella directory il massimo. Avviamo il programma:

$ ./mstest

Il risultato sarà così:

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.

In questo elenco, vediamo i messaggi di errore visualizzati dalla libreria ALSA, utilizzata per controllare la scheda audio. Gli stessi sviluppatori dello streamer multimediale ritengono che ciò sia normale. In questo caso, siamo d'accordo con riluttanza con loro.

Ora siamo tutti pronti per lavorare con lo streamer multimediale. Abbiamo installato la libreria dello streamer multimediale, lo strumento di compilazione e, utilizzando un'applicazione di prova, verificato che gli strumenti siano configurati e lo streamer multimediale si inizializzi correttamente.

Prossimo Articolo creeremo un'applicazione che assemblerà ed eseguirà l'elaborazione di un segnale audio in una catena di diversi filtri.

Fonte: habr.com