Explorando el motor VoIP Mediastreamer2. Parte 1

El material del artículo fue tomado de mi canal de Zen.

Introducción

Este artículo es el comienzo de una serie sobre el procesamiento de medios en tiempo real utilizando el motor Mediastreamer2. A lo largo de la exposición se utilizarán conocimientos básicos de trabajo en la terminal de Linux y programación en C.

Mediastreamer2 es un motor VoIP que se encuentra en la base de un popular proyecto de software de código abierto de teléfono VoIP. Linphone. En Linphone, Mediastreamer2 implementa todas las funciones relacionadas con el audio y el video. La lista detallada de características del motor se puede ver en esta página de Mediastreamer. El código fuente se encuentra aquí: GitLab.

A partir de ahora, por conveniencia, utilizaremos la notación rusa de Mediastreamer2: «медиастример».

La historia de su creación no está del todo clara, pero según su código fuente, anteriormente utilizaba la biblioteca Glib, lo que sugiere un posible parentesco lejano con GStreamer. En comparación, el mediastreamer parece ser más ligero. La primera versión de Linphone apareció en 2001, por lo que actualmente el mediastreamer existe y se desarrolla desde hace casi 20 años.

La base del mediastreamer se encuentra en una arquitectura llamada «Data flow» (flujo de datos). Un ejemplo de esta arquitectura se muestra en la figura a continuación.

Explorando el motor VoIP Mediastreamer2. Parte 1

En esta arquitectura, el algoritmo de procesamiento de datos se define no por código programático, sino por un esquema (gráfico) de conexión de funciones, que se pueden organizar en cualquier orden. Estas funciones se llaman filtros.

Esta arquitectura permite implementar la funcionalidad de procesamiento de medios en forma de un conjunto de filtros conectados en un esquema de procesamiento y transmisión de tráfico RTP de un teléfono VoIP.

La capacidad de conectar filtros en esquemas arbitrarios, el desarrollo sencillo de nuevos filtros y la implementación del mediastreamer como una biblioteca independiente permiten utilizarlo también en otros proyectos. De hecho, el proyecto puede estar en el área de VoIP, ya que existe la posibilidad de añadir filtros personalizados.

La biblioteca de filtros suministrada por defecto es bastante rica y, como ya se mencionó, puede ser ampliada con filtros de desarrollo propio. Pero primero describamos los filtros disponibles que se suministran junto con el mediastreamer. Aquí está su lista:

Filtros de audio

Captura y reproducción de audio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Sonido nativo de Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Servicio de Cola de Audio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Servicio de Unidad de Audio (Mac OS X)
  • Artes (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Reproductor de archivos (raw/wav/pcap archivos) (Linux): MS_FILE_PLAYER
  • Reproductor de archivos (raw/wav archivos) (Windows): MS_WINSND_READ
  • Grabación en archivo (wav archivos) (Linux): MS_FILE_REC
  • Grabación en archivo (wav archivos) (Windows): MS_WINSND_WRITE
  • Unidad de Audio (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
  • Sonido de Windows (Windows)

Codificación/decodificación de sonido

  • G.711 a-ley: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-ley: 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
  • Speex: MS_SPEEX_ENC, MS_SPEEX_DEC

Procesamiento de sonido

  • Adaptador de canal (mono->estéreo, estéreo->mono): MS_CHANNEL_ADAPTER
  • Conferencia: MS_CONF
  • Generador DTMF: MS_DTMF_GEN
  • Supresión de eco (speex): MS_SPEEX_EC
  • Ecualizador: MS_EQUALIZER
  • Mezclador: MS_MIXER
  • Compensador de pérdida de paquetes (PLC): MS_GENERIC_PLC
  • Re-sampleador: MS_RESAMPLE
  • Detector de tonos: MS_TONE_DETECTOR
  • Control de volumen y medición de nivel de señal: MS_VOLUME

Filtros de video

Captura y reproducción de video

  • Captura de Android
  • Reproducción de Android
  • Captura de AV Foundation (iOS)
  • Reproducción de AV Foundation (iOS)
  • Captura de DirectShow (Windows)
  • Reproducción de DrawDib (Windows)
  • Reproducción externa — Envío de video al nivel superior
  • Reproducción de GLX (Linux): MS_GLXVIDEO
  • Mire — Imagen en movimiento sintética: MS_MIRE
  • Reproducción de OpenGL (Mac OS X)
  • Reproducción de OpenGL ES2 (Android)
  • Captura de Quicktime (Mac OS X)
  • Reproducción de SDL: MS_SDL_OUT
  • Salida de imágenes estáticas: MS_STATIC_IMAGE
  • Captura de Video para Linux (V4L) (Linux): MS_V4L
  • Captura de Video para Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Captura de Video4windows (DirectShow) (Windows)
  • Captura de Video4windows (DirectShow) (Windows CE)
  • Captura de Video Para Windows (vfw) (Windows)
  • Reproducción de XV (Linux)

Codificación/decodificación de video

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

Procesamiento de video

  • Instantánea JPEG
  • Convertidor de formato de píxeles: MS_PIX_CONV
  • Redimensionador
  • Otros filtros
  • Intercambio de bloques de datos entre hilos: MS_ITC_SOURCE, MS_ITC_SINK
  • Recolección de bloques de datos desde múltiples entradas a una salida: MS_JOIN
  • Recepción/transmisión RTP: MS_RTP_SEND, MS_RTP_RECV
  • Copiar datos de entrada a múltiples salidas: MS_TEE
  • Carga coherente: MS_VOID_SINK
  • Fuente de silencio: MS_VOID_SOURCE

Plugins

Filtros de audio

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

    Filtros de video

  • Codificador de software H.264
  • Codificador/decodificador H.264 V4L2 con aceleración de hardware

Después de una breve descripción del filtro, se muestra el nombre del tipo que se utiliza al crear una nueva instancia de este filtro. En lo que sigue, nos referiremos a esta lista.

Instalación en Linux Ubuntu

Ahora procederemos a instalar el mediastreamer en la computadora y construyamos nuestra primera aplicación con él.

La instalación de Mediastremer2 en una computadora o máquina virtual que ejecute Ubuntu no requiere habilidades especiales. A partir de aquí, el símbolo «$» designará el indicador de la terminal para ingresar comandos. Es decir, si en el listado ves este símbolo al inicio de la línea, significa que esta es la línea donde se muestran los comandos para ejecutar en la terminal.

Se supone que durante la realización de las acciones descritas en este artículo, tu computadora tiene acceso a Internet.

Instalación del paquete libmediastremer-dev

Abrimos la terminal y tecleamos el comando:

$ sudo apt-get update

Se solicitará la contraseña para realizar cambios, introdúcela y el gestor de paquetes actualizará sus bases. Después de esto, hay que ejecutar:

$ sudo apt-get install libmediastreamer-dev

Los paquetes de dependencias necesarios y la propia biblioteca del mediastreamer se descargarán e instalarán automáticamente.

El tamaño total de los paquetes deb de dependencias descargados será de aproximadamente 35 MB. Puedes obtener detalles sobre el paquete instalado con el comando:

$ dpkg -s libmediastreamer-dev

Ejemplo de respuesta:

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: Biblioteca de medios del teléfono web de Linphone - archivos de desarrollo
Linphone es un teléfono de internet de audio y video que usa el protocolo SIP. Tiene una interfaz GTK+ y de consola, incluye una gran variedad de códecs de audio y video, y proporciona características de IM.
.
Este paquete contiene las bibliotecas de desarrollo para manejar operaciones de medios.
Original-Maintainer: Debian VoIP Team 
Homepage: http://www.linphone.org/

Instalación de herramientas de desarrollo

Instalamos el compilador de C y las herramientas asociadas:

$ sudo apt-get install gcc

Verificamos el resultado solicitando la versión del compilador:

$ gcc --version

La respuesta debe ser aproximadamente así:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Este es software libre; consulta la fuente para conocer las condiciones de copia. No hay
garantía; ni siquiera para la COMERCIALIZACIÓN o la IDONEIDAD PARA UN PROPÓSITO ESPECÍFICO.

Construcción y ejecución de una aplicación de prueba

Creamos en home una carpeta para nuestros proyectos de aprendizaje, la llamaremos mstutorial:

$ mkdir ~/mstutorial

Utilice su editor de texto favorito y cree un archivo de programa en C llamado mstest.c con el siguiente contenido:

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

Este inicializa el mediastreamer, imprime un saludo y finaliza la ejecución.

Guardamos el archivo y compilamos la aplicación de prueba con el siguiente comando:

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

Tenga en cuenta que la línea

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

está entre comillas, las cuales se encuentran en el teclado donde está la letra «Ё».

Si el archivo no contiene errores, después de la compilación aparecerá un archivo en el directorio mstest. Ejecutamos el programa:

$ ./mstest

El resultado será el siguiente:

ALSA lib conf.c:4738:(snd_config_expand) Parámetros desconocidos 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) CTL default no válido:0
ortp-warning-No se pudo adjuntar el mezclador a la tarjeta: Argumento no válido
ALSA lib conf.c:4738:(snd_config_expand) Parámetros desconocidos 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM desconocido default:0
ALSA lib conf.c:4738:(snd_config_expand) Parámetros desconocidos 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM desconocido default:0
ortp-warning-Raro, parece que la tarjeta de sonido HDA Intel PCH no puede hacer nada, reintentando con plughw...
Mediastreamer está listo.

En este listado vemos los mensajes de error que devuelve la biblioteca ALSA, que se utiliza para gestionar la tarjeta de sonido. Los propios desarrolladores del mediastreamer consideran que esto es normal. En este caso, nos veremos forzados a estar de acuerdo con ellos.

Ahora estamos listos para trabajar con el mediastreamer. Hemos instalado la biblioteca del mediastreamer, la herramienta de compilación y con una aplicación de prueba hemos comprobado que las herramientas están configuradas y que el mediastreamer se inicializa correctamente.

En la siguiente el artículo crearemos una aplicación que recopile y ejecute el procesamiento de señales de audio en una cadena de varios filtros.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster