Esplora u mutore VoIP Mediastreamer2. Parte 1

U materiale di l'articulu hè pigliatu da u mo canale zen.

Introduzione

Questu articulu hè u principiu di una seria di articuli nantu à u prucessu di media in tempu reale cù u mutore Mediastreamer2. Durante a presentazione, e cumpetenze minime in u travagliu in u terminal Linux è a prugrammazione in a lingua C seranu usate.

Mediastreamer2 hè u mutore VoIP daretu à u famosu prughjettu di u software di u telefuninu VoIP open-source telefonu. Linphone Mediastreamer2 implementa tutte e funzioni relative à l'audio è u video. Una lista dettagliata di e capacità di u mutore pò esse vistu in questa pagina Mediastreamer. U codice fonte hè quì: GitLab.

In più in u testu, per comodità, invece di a parolla Mediastreamer2 useremu a so notazione russa: "mediastreamer".

A storia di a so creazione ùn hè micca sanu chjara, ma à ghjudicà da u so codice fonte, prima usava a biblioteca glib, chì pare à noi insinuà una pussibile relazione distante cù GStreamer. In paragone, u media streamer pare più ligeru. A prima versione di Linphone hè apparsu in u 2001, cusì à u mumentu u media streamer esiste è si sviluppa per quasi 20 anni.

U media streamer hè basatu annantu à una architettura chjamata "Data flow". Un esempiu di tali architettura hè mostratu in a figura sottu.

Esplora u mutore VoIP Mediastreamer2. Parte 1

In questa architettura, l'algoritmu di trattamentu di dati ùn hè micca specificatu da u codice di u prugramma, ma da un diagramma (graficu) di funzioni di cunnessione chì ponu esse disposti in ogni ordine. Sti funzioni sò chjamati filtri.

Questa architettura permette di implementà a funziunalità di processazione media in forma di un settore di filtri cunnessi in un circuitu per processà è trasmette u trafficu RTP di un telefunu VoIP.

A capacità di cunnette i filtri in schemi arbitrarii, u sviluppu simplice di novi filtri, è l'implementazione di u media streamer cum'è una biblioteca separata indipendente permettenu di esse usatu in altri prughjetti. Inoltre, u prugettu pò esse in u campu di VoIP, postu chì hè pussibule aghjunghje filtri fatti da sè stessu.

A biblioteca di filtri predeterminata hè abbastanza ricca è, cum'è digià dettu, pò esse allargata cù filtri di u nostru propiu disignu. Ma prima, descriveremu i filtri pronti chì venenu cù u media streamer. Eccu a so lista:

Filtri di sonu

Cattura è riproduzione audio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Sonu nativu Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Audio Queue Service (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Serviziu di unità audio (Mac OS X)
  • Arti (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • File player (file raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • File player (file raw/wav) (Windows): MS_WINSND_READ
  • Scrivite in u schedariu (fichi wav) (Linux): MS_FILE_REC
  • Scrivite in u schedariu (fichi 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)

Codificazione / decodificazione 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

Trattamentu audio

  • Cunversione di u canali (mono->stereo, stereo->mono): MS_CHANNEL_ADAPTER
  • Cunferenza: MS_CONF
  • Generatore DTMF: MS_DTMF_GEN
  • Annulazione di l'eco (speex): MS_SPEEX_EC
  • Equalizzatore: MS_EQUALIZER
  • Mixer : MS_MIXER
  • Compensatore di perdita di pacchettu (PLC): MS_GENERIC_PLC
  • Resampler: MS_RESAMPLE
  • Rilevatore di tonu: MS_TONE_DETECTOR
  • Controlu di u voluminu è misurazione di u livellu di u signale: MS_VOLUME

Filtri Video

Cattura è riproduzione di video

  • cattura Android
  • Riproduzione Android
  • AV Foundation Capture (iOS)
  • Riproduzione di AV Foundation (iOS)
  • Cattura DirectShow (Windows)
  • Riproduzione DrawDib (Windows)
  • Riproduzione esterna - Mandate video à u livellu più altu
  • Riproduzione GLX (Linux): MS_GLXVIDEO
  • Mire - Stampa sintetica in muvimentu: MS_MIRE
  • Riproduzione OpenGL (Mac OS X)
  • Riproduzione OpenGL ES2 (Android)
  • Quicktime capture (Mac OS X)
  • Riproduzione SDL: MS_SDL_OUT
  • Output d'imaghjini statichi: MS_STATIC_IMAGE
  • Video Per Linux (V4L) cattura (Linux): MS_V4L
  • Video Per Linux 2 (V4L2) cattura (Linux): MS_V4L2_CAPTURE
  • Video4windows (DirectShow) cattura (Windows)
  • Cattura Video4windows (DirectShow) (Windows CE)
  • Video per Windows (vfw) cattura (Windows)
  • Riproduzione XV (Linux)

Codificazione / decodificazione di video

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

Trattamentu Video

  • Snapshot JPEG
  • Convertitore di furmatu di pixel: MS_PIX_CONV
  • Resizer
  • Altri filtri
  • Scambiu di blocchi di dati trà i fili: MS_ITC_SOURCE, MS_ITC_SINK
  • Raccolta di blocchi di dati da più input à una output: MS_JOIN
  • Ricezione / trasmissione RTP: MS_RTP_SEND, MS_RTP_RECV
  • Copia di dati di input à parechje outputs: MS_TEE
  • Carica currispondente: MS_VOID_SINK
  • Fonte di silenziu: MS_VOID_SOURCE

Plugins

Filtri di sonu

  • Encoder/decoder AMR-NB
  • G.729 encoder / decoder
  • codificatore / decodificatore iLBC
  • Encoder/decoder SILK

    Filtri Video

  • Codificatore di u software H.264
  • Encoder / decoder H.264 V4L2 cù accelerazione hardware

Dopu una breve descrizzione di u filtru, u nome di u tipu hè indicatu, chì hè utilizatu quandu crea una nova istanza di stu filtru. In a discussione seguente, avemu da riferite à sta lista.

Installazione sottu Linux Ubuntu

Avà avemu da stallà u media streamer nant'à u vostru urdinatore, è custruisce a nostra prima applicazione cun ella.

L'installazione di Mediastremer2 nantu à un urdinatore o una macchina virtuale chì esegue Ubuntu ùn richiede micca cumpetenze speciali. Quì è quì sottu, u simbulu "$" denotarà u prompt di shell per inserisce cumandamenti. Quelli. se in u listinu vede stu simbulu à u principiu di una linea, allora questu significa chì questu hè una linea chì mostra i cumandamenti per esse eseguiti in u terminal.

Hè presumitu chì mentre eseguite i passi descritti in questu articulu, u vostru urdinatore hà accessu à Internet.

Installazione di u pacchettu libmediastromer-dev

Lanciate u terminal è scrive u cumandimu:

$ sudo apt-get update

Vi sarà dumandatu una password per fà cambiamenti; inserite è u gestore di pacchetti aghjurnà a so basa di dati. Dopu questu avete bisognu di fà:

$ sudo apt-get install libmediastreamer-dev

I pacchetti di dipendenza necessarii è a libreria media streamer stessu seranu scaricati è installati automaticamente.

A dimensione tutale di i pacchetti di dependenza di deb scaricati serà di circa 35 MB. I dettagli nantu à u pacchettu installatu ponu esse truvati cù u cumandimu:

$ dpkg -s libmediastreamer-dev

Esempiu 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 di Strumenti di Sviluppu

Installa u compilatore C è i so strumenti chì l'accumpagnanu:

$ sudo apt-get install gcc

Cuntrollamu u risultatu dumandendu a versione di compilatore:

$ gcc --version

A risposta deve esse qualcosa cum'è questu:

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.

Custruisce è gestisce una applicazione di prova

Creemu in casa cartulare per i nostri prughjetti educativi, chjamemu mstutorial:

$ mkdir ~/mstutorial

Aduprate u vostru editore di testu favuritu è ​​​​create un schedariu di prugramma C chjamatu mstest.c cù u seguenti cuntenutu:

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

Inizializza u streamer di media, stampa un salutu, è finisce l'esecuzione.

Salvà u schedariu è compile l'applicazione di prova cù u cumandimu:

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

Per piacè nutate chì a linea

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

chjusu in virgulette, chì si trovanu nantu à u teclatu in u stessu locu cum'è a lettera "Y".

Se u schedariu ùn cuntene errori, dopu a compilazione, u schedariu apparirà in u cartulare mstest. Eseguimu u prugramma:

$ ./mstest

U risultatu serà cusì:

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 questu listinu vedemu i missaghji di errore generati da a biblioteca ALSA, chì hè utilizata per cuntrullà a carta di sonu. I sviluppatori di i media streamer stessi credenu chì questu hè normale. In questu casu, avemu inevitabbilmente d'accordu cun elli.

Avà simu pronti à travaglià cù u media streamer. Avemu installatu a biblioteca di media streamer, l'uttellu di compilazione, è hà utilizatu una applicazione di mostra per verificà chì l'arnesi sò stati cunfigurati è u media streamer inizializatu bè.

Dopu articulu criaremu una applicazione chì cullerà è eseguirà u processu di signale audio in una catena di parechji filtri.

Source: www.habr.com