Esploriamo il motore VoIP Mediastreamer2. Parte 1

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

Introduzione

Questo articolo segna l'inizio di una serie dedicata all'elaborazione dei media in tempo reale utilizzando il motore Mediastreamer2. Durante l'esposizione verranno utilizzate competenze minime di utilizzo del terminale Linux e di programmazione in linguaggio C.

Mediastreamer2 è un motore VoIP alla base di un popolare progetto open-source per telefoni VoIP. Linphone. In Linphone, Mediastreamer2 implementa tutte le funzioni relative a audio e video. Un elenco dettagliato delle funzionalità del motore è disponibile su questa pagina dedicata a Mediastreamer. Il codice sorgente si trova qui: GitLab.

Per comodità, in questo testo useremo la notazione russa per Mediastreamer2: «медиастример».

La storia della sua creazione non è del tutto chiara, ma a giudicare dal codice sorgente, in precedenza utilizzava la libreria Glib, il che suggerisce una possibile parentela remota con GStreamer. Rispetto a quest'ultimo, il mediastreamer appare più leggero. La prima versione di Linphone è stata lanciata nel 2001, quindi attualmente il mediastreamer esiste e si sviluppa da quasi 20 anni.

Alla base del mediastreamer c'è un'architettura chiamata "Data flow" (flusso dei dati). Un esempio di tale architettura è mostrato nell'immagine qui sotto.

Esploriamo il motore VoIP Mediastreamer2. Parte 1

In quest'architettura, l'algoritmo di elaborazione dei dati è definito non da codice sorgente, ma da uno schema (grafico) di connessione delle funzioni, che possono essere disposte in qualsiasi ordine. Queste funzioni sono chiamate filtri.

Questa architettura consente di implementare la funzionalità di elaborazione multimediale sotto forma di un insieme di filtri connessi in uno schema di elaborazione e trasmissione del traffico RTP di un telefono VoIP.

La possibilità di connettere i filtri in schemi arbitrari, la semplice creazione di nuovi filtri e l'implementazione del mediastreamer come una libreria separata autonoma consentono di utilizzarlo anche in altri progetti. Inoltre, il progetto può appartenere all'ambito VoIP, poiché è possibile aggiungere filtri creati a mano.

La libreria di filtri fornita di default è abbastanza ricca e, come già detto, può essere ampliata con filtri di propria creazione. Ma iniziamo a descrivere i filtri predefiniti che vengono forniti insieme al mediastreamer. Ecco la loro lista:

Filtri audio

Cattura e riproduzione audio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Audio nativo Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Servizio Audio Queue (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Servizio Audio Unit (Mac OS X)
  • Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Riproduttore di file (file raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Riproduttore di file (file raw/wav) (Windows): MS_WINSND_READ
  • Registrazione su file (file wav) (Linux): MS_FILE_REC
  • Registrazione su file (file wav) (Windows): MS_WINSND_WRITE
  • Unità Audio 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
  • Windows Sound (Windows)

Codifica/decodifica audio

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

Elaborazione audio

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

Filtri video

Acquisizione e riproduzione video

  • Acquisizione Android
  • Riproduzione Android
  • Acquisizione AV Foundation (iOS)
  • Riproduzione AV Foundation (iOS)
  • Acquisizione DirectShow (Windows)
  • Riproduzione DrawDib (Windows)
  • Riproduzione esterna — Invia 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
  • Uscita immagini statiche: MS_STATIC_IMAGE
  • Acquisizione Video For Linux (V4L) (Linux): MS_V4L
  • Acquisizione Video For Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Acquisizione Video4windows (DirectShow) (Windows)
  • Acquisizione Video4windows (DirectShow) (Windows CE)
  • Acquisizione Video For Windows (vfw) (Windows)
  • Riproduzione XV (Linux)

Codifica/decodifica video

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

Elaborazione video

  • Snapshot JPEG
  • Convertitore 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ù ingressi in un'uscita: MS_JOIN
  • Ricezione/trasmissione RTP: MS_RTP_SEND, MS_RTP_RECV
  • Copiare i dati in ingresso su più uscite: MS_TEE
  • Carico coerente: MS_VOID_SINK
  • Fonte di silenzio: MS_VOID_SOURCE

Plugin

Filtri audio

  • Codificatore/decodificatore AMR-NB
  • Codificatore/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 utilizzato per creare una nuova istanza di questo filtro. D'ora in poi faremo riferimento a questo elenco.

Installazione su Linux Ubuntu

Ora procederemo all'installazione del mediastreamer sul computer e creeremo la nostra prima applicazione con esso.

L'installazione di Mediastremer2 su un computer o su una macchina virtuale con Ubuntu non richiede abilità particolari. D'ora in poi useremo il simbolo «$» per indicare l'invito della shell per l'inserimento di comandi. Cioè, se nel listing vedi questo simbolo all'inizio di una riga, significa che è una riga in cui sono mostrati i comandi da eseguire nel terminale.

Si presuppone che, durante l'esecuzione delle azioni descritte in questo articolo, il tuo computer abbia accesso a Internet.

Installazione del pacchetto libmediastremer-dev

Apriamo il terminale e digitiamo il comando:

$ sudo apt-get update

Ti verrà richiesta una password per apportare modifiche, inseriscila e il gestore pacchetti aggiornerà i suoi database. Dopo di che, esegui:

$ sudo apt-get install libmediastreamer-dev

I pacchetti di dipendenza necessari e la libreria del mediastreamer verranno scaricati e installati automaticamente.

La dimensione totale dei pacchetti deb delle dipendenze scaricati sarà di circa 35 MB. Puoi scoprire ulteriori dettagli sul pacchetto installato 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 
Architecture: amd64
Source: linphone
Version: 3.6.1-2.5
Depends: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Description: Libreria media per il telefono web Linphone - file di sviluppo
Linphone è un telefono internet audio e video che utilizza il protocollo SIP. Ha un'interfaccia GTK+ e console, include una grande varietà di codec audio e video e fornisce funzionalità di messaggistica istantanea.
.
Questo pacchetto contiene le librerie di sviluppo per la gestione delle operazioni multimediali.
Original-Maintainer: Debian VoIP Team 
Homepage: http://www.linphone.org/

Installazione degli strumenti di sviluppo

Procediamo installando il compilatore C e gli strumenti correlati:

$ sudo apt-get install gcc

Verifichiamo il risultato richiedendo la versione del compilatore:

$ gcc --version

La risposta dovrebbe essere più o meno simile a questa:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Questo è un software libero; vedere la sorgente per le condizioni di copia. Non c'è nessuna
garanzia; neppure di commerciabilità o idoneità per uno scopo particolare.

Compilazione e avvio di un'applicazione di prova

Creiamo nella home una cartella per i nostri progetti didattici, chiamandola mstutorial:

$ mkdir ~/mstutorial

Usa il tuo editor di testo preferito e crea un file per il 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");
}

Questo file inizializza il media streamer, stampa un messaggio di saluto e termina l'esecuzione.

Salviamo il file e compiliamo l'applicazione di test con il comando:

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

Nota che la riga

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

è racchiusa tra virgolette che si trovano sulla tastiera nello stesso posto della lettera «Ё».

Se il file non contiene errori, dopo la compilazione apparirà nel catalogo il file mstest. Avviamo il programma:

$ ./mstest

Il risultato sarà il seguente:

ALSA lib conf.c:4738:(snd_config_expand) Parametri sconosciuti 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) CTL non valido:0
ortp-warning-Impossibile collegare il mixer alla scheda: Argomento non valido
ALSA lib conf.c:4738:(snd_config_expand) Parametri sconosciuti 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM sconosciuto default:0
ALSA lib conf.c:4738:(snd_config_expand) Parametri sconosciuti 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM sconosciuto default:0
ortp-warning-Strano, la scheda audio HDA Intel PCH sembra non essere capace di nulla, riprovando con plughw...
Mediastreamer è pronto.

In questo elenco vediamo i messaggi di errore restituiti dalla libreria ALSA, utilizzata per gestire la scheda audio. Gli stessi sviluppatori del media streamer ritengono che sia normale. In questo caso, ci troviamo costretti a concordare con loro.

Ora abbiamo tutto pronto per lavorare con il media streamer. Abbiamo installato la libreria del media streamer, lo strumento di compilazione e con un'applicazione di prova abbiamo verificato che gli strumenti siano configurati e che il media streamer si inizializzi correttamente.

Nella prossima articolo creeremo un'applicazione che raccoglierà e avvierà l'elaborazione del segnale audio in una catena di più filtri.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster