Il materiale dell'articolo è tratto dal mio
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.
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
Al centro dello streamer multimediale c'è un'architettura chiamata "flusso di dati" (flusso di dati). Un esempio di tale architettura è mostrato nella figura seguente.
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
Fonte: habr.com