Studio del motore VoIP Mediastreamer2. Parte 1

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

Introduzione

Questo articolo è l'inizio di una serie di articoli sulla lavorazione in tempo reale dei dati multimediali utilizzando il motore Mediastreamer2. Durante l'esposizione saranno coinvolte competenze minime di lavoro nel terminale Linux e programmazione in linguaggio C.

Mediastreamer2 è un motore VoIP che sta alla base del popolare progetto open-source di un telefono VoIP Linphone. In Linphone, Mediastreamer2 implementa tutte le funzioni relative a audio e video. Puoi vedere un elenco dettagliato delle funzionalità del motore su questa pagina Mediastreamer. Il codice sorgente è disponibile qui: GitLab.

In seguito nel testo, per comodità, utilizzeremo la notazione russa della parola Mediastreamer2: «медиастример».

La storia della sua creazione non è del tutto chiara, ma a giudicare dal suo codice sorgente, prima utilizzava la libreria Glib, il che ci suggerisce una possibile parentela remota con GStreamer. In confronto, 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 dati). Un esempio di tale architettura è illustrato nell'immagine qui sotto.

Studio del motore VoIP Mediastreamer2. Parte 1

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

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

La possibilità di collegare filtri in schemi arbitrari, la semplice creazione di nuovi filtri e l'implementazione del mediastreamer come una libreria autonoma consentono di utilizzarlo anche in altri progetti. Inoltre, il progetto può essere nel campo del VoIP, poiché è possibile aggiungere filtri creati autonomamente.

La libreria di filtri fornita di default è piuttosto ricca e, come già detto, può essere estesa con filtri di propria creazione. Ma prima descriviamo i filtri pronti che vengono forniti insieme al mediastreamer. Ecco il loro elenco:

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
  • 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
  • Riproduttore di file (file raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Riproduttore di file (file raw/wav) (Windows): MS_WINSND_READ
  • Registrazione in file (file wav) (Linux): MS_FILE_REC
  • Registrazione in file (file wav) (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)

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

  • Adattatore di 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 di perdita di pacchetti (PLC): MS_GENERIC_PLC
  • Risempler: 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

  • Acquisizione Android
  • Riproduzione Android
  • Acquisizione AV Foundation (iOS)
  • Riproduzione AV Foundation (iOS)
  • Acquisizione DirectShow (Windows)
  • Riproduzione DrawDib (Windows)
  • Riproduzione esterna — Invio 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
  • Video For Linux (V4L) acquisizione (Linux): MS_V4L
  • Video For Linux 2 (V4L2) acquisizione (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) acquisizione (Windows)
  • Video4windows (DirectShow) acquisizione (Windows CE)
  • Video For Windows (vfw) acquisizione (Windows)
  • XV riproduzione (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 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ù ingressi a un'uscita: MS_JOIN
  • Ricezione/trasmissione RTP: MS_RTP_SEND, MS_RTP_RECV
  • Copia di 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 che viene utilizzato per creare una nuova istanza di questo filtro. In seguito ci riferiremo a questo elenco.

Installazione su Linux Ubuntu

Ora procederemo con l'installazione del media streamer sul computer e creeremo la nostra prima applicazione con esso.

L'installazione di Mediastremer2 su un computer o una macchina virtuale con Ubuntu non richiede particolari competenze. D'ora in poi, il simbolo «$» indicherà il prompt della shell per l'immissione dei comandi. Pertanto, se nel listing visualizzate questo simbolo all'inizio di una riga, significa che si tratta di una riga in cui sono mostrati i comandi da eseguire nel terminale.

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

Installazione del pacchetto libmediastremer-dev

Apriamo il terminale e digitiamo il comando:

$ sudo apt-get update

Verrà richiesto di inserire la password per apportare modifiche; digitela e il gestore dei pacchetti aggiornerà i suoi database. Dopo di che, è necessario eseguire:

$ sudo apt-get install libmediastreamer-dev

Saranno scaricati e installati automaticamente i pacchetti di dipendenza necessari e la libreria del media streamer.

La dimensione totale dei pacchetti deb di dipendenza scaricati sarà di circa 35 MB. I dettagli sul pacchetto installato possono essere ottenuti 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: Sviluppatori Ubuntu <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Source: linphone
Version: 3.6.1-2.5
Depends: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Description: Libreria media del telefono web Linphone - file di sviluppo
Linphone è un telefono internet audio e video che utilizza il protocollo SIP. Dispone di un'interfaccia GTK+ e console, include una vasta gamma di codec audio e video, e offre funzionalità di messaggistica IM.
.
Questo pacchetto contiene le librerie di sviluppo per gestire le operazioni media.
Original-Maintainer: Debian VoIP Team <pkg-voip-maintainers@lists.alioth.debian.org>
Homepage: http://www.linphone.org/

Installazione degli strumenti di sviluppo

Installiamo il compilatore C e gli strumenti correlati:

$ sudo apt-get install gcc

Controlliamo il risultato richiedendo la versione del compilatore:

$ gcc --version

La risposta dovrebbe essere simile a questa:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Questo è software libero; consultare il sorgente per le condizioni di copia. Non esiste NESSUNA
garanzia; nemmeno per COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO.

Compilazione e avvio dell'applicazione di prova

Creiamo in home una cartella per i nostri progetti di studio, chiamandola mstutorial:

$ mkdir ~/mstutorial

Utilizzate il vostro editor di testo preferito e create un file di programma in C chiamato mstest.c con il seguente contenuto:

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

Esso inizializza il media streamer, stampa un 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`

Si prega di notare che la stringa

`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à un file mstest. Eseguiamo 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 predefinito 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 predefinito:0
ALSA lib conf.c:4738:(snd_config_expand) Parametri sconosciuti 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM sconosciuto predefinito:0
ortp-warning-Strano, la scheda audio HDA Intel PCH sembra non essere in grado di fare nulla, riprovando con plughw...
Mediastreamer è pronto.

In questo listing vediamo i messaggi di errore generati dalla libreria ALSA, utilizzata per gestire la scheda audio. Gli stessi sviluppatori del mediastreamer considerano questo normale. In questo caso, ci troviamo a dover concordare con loro.

Ora abbiamo tutto pronto per lavorare con il mediastreamer. Abbiamo installato la libreria del mediastreamer, lo strumento di compilazione e, attraverso un'applicazione di prova, abbiamo verificato che gli strumenti siano configurati e che il mediastreamer venga inizializzato con successo.

Nel prossimo abbiamo chiarito il corretto completamento dei programmi che utilizzano il mediastreamer. creeremo un'applicazione che compila e avvia 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