Explorando o motor de VoIP Mediastreamer2. Parte 1

O material do artigo está tirado do meu canle zen.

Introdución

Este artigo é o comezo dunha serie de artigos sobre o procesamento de medios en tempo real mediante o motor Mediastreamer2. A presentación implicará as habilidades mínimas de traballo no terminal Linux e programación en linguaxe C.

Mediastreamer2 é o motor VoIP detrás do popular proxecto de software de teléfono VoIP de código aberto teléfono. Linphone Mediastreamer2 implementa todas as funcións relacionadas co audio e o vídeo. Pódese ver unha lista detallada das capacidades do motor nesta páxina de Mediastreamer. O código fonte está aquí: GitLab.

Máis adiante no texto, por comodidade, en lugar da palabra Mediastreamer2 usaremos a súa notación rusa: "mediastreamer".

A historia da súa creación non está totalmente clara, pero a xulgar polo seu código fonte, utilizou previamente a biblioteca glib, que nos parece insinuar unha posible relación distante con GStreamer. En comparación, o streamer multimedia parece máis lixeiro. A primeira versión de Linphone apareceu en 2001, polo que nestes momentos o streamer multimedia existe e desenvolveuse durante case 20 anos.

O streamer multimedia baséase nunha arquitectura chamada "Fluxo de datos". Un exemplo desta arquitectura móstrase na seguinte figura.

Explorando o motor de VoIP Mediastreamer2. Parte 1

Nesta arquitectura, o algoritmo de procesamento de datos non se especifica mediante un código de programa, senón por un esquema (gráfico) para conectar funcións que se poden organizar en calquera orde. Estas funcións chámanse filtros.

Esta arquitectura permite implementar a funcionalidade de procesamento multimedia en forma dun conxunto de filtros conectados ao esquema de procesamento e transmisión de tráfico RTP do teléfono VoIP.

A capacidade de conectar filtros en esquemas arbitrarios, o desenvolvemento sinxelo de novos filtros e a implementación do streamer multimedia como biblioteca independente independente permiten que se use noutros proxectos. Ademais, o proxecto pode estar no ámbito da VoIP, xa que é posible engadir filtros feitos por ti mesmo.

A biblioteca de filtros predeterminada é bastante rica e, como xa se mencionou, pódese ampliar con filtros de deseño propio. Pero primeiro, describiremos os filtros preparados que veñen co streamer multimedia. Aquí está a súa lista:

Filtros de son

Captura e reprodución de audio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Son nativo de Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Servizo de cola de audio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Servizo de unidades de audio (Mac OS X)
  • Artes (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Reprodutor de ficheiros (ficheiros raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Reprodutor de ficheiros (ficheiros raw/wav) (Windows): MS_WINSND_READ
  • Escribir no ficheiro (ficheiros wav) (Linux): MS_FILE_REC
  • Escribir no ficheiro (ficheiros 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
  • Son de Windows (Windows)

Codificación/decodificación de audio

  • G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC
  • Lei µ G.711: 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 lineal: MS_L16_ENC, MS_L16_DEC
  • Expresión: MS_SPEEX_ENC, MS_SPEEX_DEC

Procesamento de audio

  • Conversión de canle (mono->estéreo, estéreo->mono): MS_CHANNEL_ADAPTER
  • Conferencia: MS_CONF
  • Xerador DTMF: MS_DTMF_GEN
  • Cancelación de eco (speex): MS_SPEEX_EC
  • Ecualizador: MS_EQUALIZER
  • Mesturador: MS_MIXER
  • Compensador de perda de paquetes (PLC): MS_GENERIC_PLC
  • Remuestrador: MS_RESAMPLE
  • Detector de tons: MS_TONE_DETECTOR
  • Control de volume e medición do nivel de sinal: MS_VOLUME

Filtros de vídeo

Captura e reprodución de vídeo

  • Captura de Android
  • reprodución de Android
  • Captura de AV Foundation (iOS)
  • Reproducción de AV Foundation (iOS)
  • Captura DirectShow (Windows)
  • Reproducción de DrawDib (Windows)
  • Reproducción externa: envía vídeo ao nivel superior
  • Reprodución GLX (Linux): MS_GLXVIDEO
  • Mire - Imaxe en movemento sintética: MS_MIRE
  • Reprodución OpenGL (Mac OS X)
  • Reprodución de OpenGL ES2 (Android)
  • Captura Quicktime (Mac OS X)
  • Reprodución SDL: MS_SDL_OUT
  • Saída de imaxes estáticas: MS_STATIC_IMAGE
  • Vídeo para captura de Linux (V4L) (Linux): MS_V4L
  • Vídeo para captura de Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Captura de Video4windows (DirectShow) (Windows)
  • Captura de Video4windows (DirectShow) (Windows CE)
  • Captura de vídeo para Windows (vfw) (Windows)
  • Reproducción XV (Linux)

Codificación/decodificación de vídeo

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, neve: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (só decodificador): MS_H264_DEC
  • Theora: MS_THEORA_ENC, MS_THEORA_DEC
  • VP8: MS_VP8_ENC, MS_VP8_DEC

Procesamento de vídeo

  • Instantánea JPEG
  • Conversor de formato de píxeles: MS_PIX_CONV
  • Redimensionador
  • Outros filtros
  • Intercambio de bloques de datos entre fíos: MS_ITC_SOURCE, MS_ITC_SINK
  • Recollida de bloques de datos de varias entradas a unha saída: MS_JOIN
  • Recepción/transmisión RTP: MS_RTP_SEND, MS_RTP_RECV
  • Copiando datos de entrada a varias saídas: MS_TEE
  • Carga coincidente: MS_VOID_SINK
  • Fonte de silencio: MS_VOID_SOURCE

Complementos

Filtros de son

  • Codificador/decodificador AMR-NB
  • Codificador/decodificador G.729
  • Codificador/decodificador iLBC
  • Codificador/decodificador SILK

    Filtros de vídeo

  • Codificador de software H.264
  • Codificador/decodificador acelerado por hardware H.264 V4L2

Despois dunha breve descrición do filtro, móstrase o nome do tipo, que se usa cando se crea unha nova instancia deste filtro. Na seguinte discusión faremos referencia a esta lista.

Instalación en Linux Ubuntu

Agora instalaremos o streamer multimedia no teu ordenador e construímos a nosa primeira aplicación con el.

Instalar Mediastremer2 nun ordenador ou máquina virtual que executa Ubuntu non require habilidades especiais. Aquí e abaixo, o símbolo "$" indicará o indicador do shell para introducir ordes. Eses. se na lista ves este símbolo ao comezo dunha liña, isto significa que esta é unha liña que mostra os comandos a executar no terminal.

Suponse que mentres realiza os pasos descritos neste artigo, o seu ordenador ten acceso a Internet.

Instalando o paquete libmediastromer-dev

Inicie o terminal e escriba o comando:

$ sudo apt-get update

Pediráselle un contrasinal para facer cambios; introdúceo e o xestor de paquetes actualizará as súas bases de datos. Despois disto, debes facer:

$ sudo apt-get install libmediastreamer-dev

Os paquetes de dependencia necesarios e a propia biblioteca de transmisión multimedia descargaranse e instalaranse automaticamente.

O tamaño total dos paquetes de dependencia de deb descargados será de aproximadamente 35 MB. Pódense atopar detalles sobre o paquete instalado co comando:

$ dpkg -s libmediastreamer-dev

Exemplo de resposta:

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/

Instalación de ferramentas de desenvolvemento

Instale o compilador C e as ferramentas que o acompañan:

$ sudo apt-get install gcc

Comprobamos o resultado consultando a versión do compilador:

$ gcc --version

A resposta debería ser algo así:

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.

Creación e execución dunha aplicación de proba

Creamos en casa carpeta dos nosos proxectos educativos, chamémoslle mtutorial:

$ mkdir ~/mstutorial

Usa o teu editor de texto favorito e crea un ficheiro de programa C chamado mstest.c co seguinte contido:

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

Inicializa a transmisión multimedia, imprime un saúdo e sae.

Garda o ficheiro e compila a aplicación de proba co comando:

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

Teña en conta que a liña

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

entre comiñas, que se atopan no teclado no mesmo lugar que a letra "Y".

Se o ficheiro non contén erros, despois da compilación o ficheiro aparecerá no directorio mstest. Comezamos o programa:

$ ./mstest

O resultado será así:

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.

Neste listado, vemos as mensaxes de erro que mostra a biblioteca ALSA, úsase para controlar a tarxeta de son. Os propios desenvolvedores do streamer multimedia cren que isto é normal. Neste caso, inevitablemente estaremos de acordo con eles.

Agora estamos preparados para traballar co streamer multimedia. Instalamos a biblioteca de transmisión multimedia, a ferramenta de compilación e utilizamos unha aplicación de mostra para verificar que as ferramentas estaban configuradas e que o transmisor multimedia se inicializaba correctamente.

No seguinte Artigo crearemos unha aplicación que recollerá e executará o procesamento de sinal de audio nunha cadea de varios filtros.

Fonte: www.habr.com