Explorando el motor VoIP de Mediastreamer2. Parte 1

El material del artículo está tomado de mi canal zen.

introducción

Este artículo es el comienzo de una serie de artículos sobre el procesamiento de medios en tiempo real utilizando el motor Mediastreamer2. La presentación involucrará las habilidades mínimas de trabajo en la terminal Linux y programación en el lenguaje C.

Mediastreamer2 es el motor VoIP detrás del popular proyecto de teléfono VoIP de software de código abierto. linfono. En Linphone Mediastreamer2 implementa todas las funciones relacionadas con el sonido y el vídeo. Se puede ver una lista detallada de las funciones del motor en esta página de Mediastreamer. El código fuente está aquí: GitLab.

Más adelante en el texto, por conveniencia, en lugar de la palabra Mediastreamer2, usaremos su notación rusa: "media streamer".

La historia de su creación no está del todo clara, pero a juzgar por su código fuente, anteriormente utilizó la biblioteca. Fácil, que, por así decirlo, insinúa una posible relación distante con GStreamer. En comparación con el cual, el transmisor de medios parece más liviano. La primera versión de Linphone apareció en 2001, por lo que en este momento el transmisor multimedia existe y se desarrolla desde hace casi 20 años.

En el corazón del transmisor de medios hay una arquitectura llamada "Flujo de datos" (flujo de datos). Un ejemplo de una arquitectura de este tipo se muestra en la siguiente figura.

Explorando el motor VoIP de Mediastreamer2. Parte 1

En esta arquitectura, el algoritmo de procesamiento de datos no se especifica mediante un código de programa, sino mediante un esquema (gráfico) para conectar funciones que se pueden organizar en cualquier orden. Estas funciones se denominan filtros.

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

La capacidad de combinar filtros en esquemas arbitrarios, el desarrollo simple de nuevos filtros, la implementación del transmisor de medios como una biblioteca separada e independiente, permiten su uso en otros proyectos. Además, el proyecto puede estar en el campo de VoIP, ya que es posible agregar filtros hechos por uno mismo.

La biblioteca de filtros proporcionada por defecto es bastante rica y, como ya se mencionó, se puede ampliar con filtros de su propio diseño. Pero primero, describamos los filtros listos para usar que vienen con el transmisor de medios. Aquí está su lista:

filtros de sonido

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 (archivos raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Reproductor de archivos (archivos raw/wav) (Windows): MS_WINSND_READ
  • Escribir en archivo (archivos wav) (Linux): MS_FILE_REC
  • Escribir en archivo (archivos wav) (Windows): MS_WINSND_WRITE
  • Unidad de audio Mac (Mac OS X)
  • MME (Windows)
  • SO (Linux): MS_OSS_WRITE, MS_OSS_READ
  • Port Audio (Mac OS X)
  • PulseAudio (Linux): MS_PULSE_WRITE, MS_PULSE_READ
  • Sonido de Windows (Windows)

Codificación/descodificación de audio

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

Procesamiento de sonido

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

Filtros de vídeo

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 DirectShow (Windows)
  • Reproducción DrawDib (Windows)
  • Reproducción externa: envío de video a la capa superior
  • Reproducción GLX (Linux): MS_GLXVIDEO
  • Mire - Imagen en movimiento sintética: MS_MIRE
  • Reproducción OpenGL (Mac OS X)
  • Reproducción de OpenGL ES2 (Android)
  • Captura de tiempo rápido (Mac OS X)
  • Reproducción SDL: MS_SDL_OUT
  • Salida de imagen estática: MS_STATIC_IMAGE
  • Video para captura de Linux (V4L) (Linux): MS_V4L
  • Video para captura de Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
  • Captura Video4windows (DirectShow) (Windows)
  • Captura Video4windows (DirectShow) (Windows CE)
  • Captura de vídeo para Windows (vfw) (Windows)
  • XV reproducción (Linux)

Codificación/descodificación de vídeo

  • H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Nieve: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
  • H.264 (solo decodificador): MS_H264_DEC
  • Teora: 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
  • Redimensionar
  • Otros filtros
  • Intercambio de bloques de datos entre hilos: MS_ITC_SOURCE, MS_ITC_SINK
  • Recopilación de bloques de datos de múltiples entradas a una sola salida: MS_JOIN
  • Recepción/transmisión RTP: MS_RTP_SEND, MS_RTP_RECV
  • Copia de datos de entrada a múltiples salidas: MS_TEE
  • Carga terminada: MS_VOID_SINK
  • Fuente del silencio: MS_VOID_SOURCE

plugins

filtros de sonido

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

    Filtros de vídeo

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

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 bajo Linux Ubuntu

Ahora instalaremos el transmisor de medios en la computadora y construiremos nuestra primera aplicación con él.

La instalación de Mediastremer2 en una computadora o máquina virtual con Ubuntu no requiere ninguna habilidad especial. Aquí y debajo, el símbolo "$" denotará el indicador de shell para ingresar comandos. Aquellos. si en el listado ves este símbolo al principio de la línea, entonces esta es la línea en la que se muestran los comandos a ejecutar en la terminal.

Se supone que durante los pasos de este artículo, su computadora tiene acceso a Internet.

Instalación del paquete libmediastremer-dev

Inicie la terminal y escriba el comando:

$ sudo apt-get update

Se le pedirá una contraseña para realizar cambios, ingrésela y el administrador de paquetes actualizará sus bases de datos. Después de eso, necesitas ejecutar:

$ sudo apt-get install libmediastreamer-dev

Los paquetes de dependencia necesarios y la propia biblioteca del transmisor de medios se descargarán e instalarán automáticamente.

El tamaño total de los paquetes deb de dependencia descargados será de aproximadamente 35 MB. Los detalles sobre el paquete instalado se pueden encontrar 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 <[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 herramientas de desarrollo.

Instale el compilador de C y las herramientas que lo acompañan:

$ sudo apt-get install gcc

Comprobamos el resultado consultando la versión del compilador:

$ gcc --version

La respuesta debería ser algo como esto:

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 y ejecución de la aplicación de prueba

Creamos en hogar carpeta para nuestros proyectos tutoriales, llamémoslo tutorial:

$ mkdir ~/mstutorial

Use 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");
}

Inicializa el transmisor multimedia, imprime un saludo y sale.

Guarde el archivo y compile la aplicación de prueba con el comando:

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

Tenga en cuenta que la línea

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

entre comillas, que se encuentran en el teclado en el mismo lugar que la letra "Ё".

Si el archivo no contiene errores, luego de la compilación aparecerá un archivo en el directorio prueba más. Iniciamos el programa:

$ ./mstest

El 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.

En este listado vemos los mensajes de error que muestra la biblioteca ALSA, se utiliza para controlar la tarjeta de sonido. Los propios desarrolladores del transmisor de medios creen que esto es normal. En este caso, estamos de acuerdo a regañadientes con ellos.

Ahora estamos listos para trabajar con el transmisor de medios. Hemos instalado la biblioteca del transmisor de medios, la herramienta de compilación y, mediante una aplicación de prueba, verificamos que las herramientas estén configuradas y que el transmisor de medios se inicialice correctamente.

Próximo статье crearemos una aplicación que ensamblará y ejecutará el procesamiento de una señal de audio en una cadena de varios filtros.

Fuente: habr.com