Explorando o mecanismo VoIP do Mediastreamer2. Parte 1

O material do artigo foi retirado do meu canal zen.

Introdução

Este artigo é o início de uma série de artigos sobre processamento de mídia em tempo real usando o mecanismo Mediastreamer2. A apresentação envolverá as habilidades mínimas de trabalho no terminal Linux e programação na linguagem C.

O Mediastreamer2 é o mecanismo de VoIP por trás do popular projeto de telefone voip de software de código aberto. telefone. No Linphone, o Mediastreamer2 implementa todas as funções relacionadas a som e vídeo. Uma lista detalhada dos recursos do mecanismo pode ser vista nesta página do Mediastreamer. O código fonte está aqui: GitLab.

Mais adiante no texto, por conveniência, em vez da palavra Mediastreamer2, usaremos sua notação russa: “media streamer”.

A história de sua criação não é totalmente clara, mas a julgar por seu código-fonte, ele usou anteriormente a biblioteca loquaz, o que, por assim dizer, sugere uma possível relação distante com GStreamer. Em comparação com o qual o streamer de mídia parece mais leve. A primeira versão do Linphone apareceu em 2001, então, no momento, o streamer de mídia existe e se desenvolve há quase 20 anos.

No coração do streamer de mídia está uma arquitetura chamada "Fluxo de dados" (fluxo de dados). Um exemplo dessa arquitetura é mostrado na figura abaixo.

Explorando o mecanismo VoIP do Mediastreamer2. Parte 1

Nesta arquitetura, o algoritmo de processamento de dados é especificado não por um código de programa, mas por um esquema (gráfico) para conectar funções que podem ser arranjadas em qualquer ordem. Essas funções são chamadas de filtros.

Essa arquitetura permite implementar a funcionalidade de processamento de mídia na forma de um conjunto de filtros conectados ao esquema de processamento e transmissão de tráfego RTP do telefone VoIP.

A capacidade de combinar filtros em esquemas arbitrários, o desenvolvimento simples de novos filtros, a implementação do streamer de mídia como uma biblioteca independente e separada permitem que ele seja usado em outros projetos. Além disso, o projeto pode ser na área de VoIP, já que é possível adicionar filtros feitos pelo próprio.

A biblioteca de filtros fornecida por padrão é bastante rica e, como já mencionado, pode ser estendida com filtros de nosso próprio design. Mas primeiro, vamos descrever os filtros prontos que acompanham o streamer de mídia. Aqui está a lista deles:

filtros de som

Captura e reprodução de áudio

  • Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
  • Som nativo do Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
  • Serviço de fila de áudio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
  • Serviço de unidade de áudio (Mac OS X)
  • Artes (Linux): MS_ARTS_WRITE, MS_ARTS_READ
  • DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
  • Reprodutor de arquivos (arquivos raw/wav/pcap) (Linux): MS_FILE_PLAYER
  • Reprodutor de arquivos (arquivos raw/wav) (Windows): MS_WINSND_READ
  • Gravar no arquivo (arquivos wav) (Linux): MS_FILE_REC
  • Gravar no arquivo (arquivos wav) (Windows): MS_WINSND_WRITE
  • Unidade de áudio Mac (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
  • Som do Windows (Windows)

Codificação/decodificação de áudio

  • G.711 lei: MS_ALAW_DEC, MS_ALAW_ENC
  • G.711 µ-lei: 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 linear: MS_L16_ENC, MS_L16_DEC
  • Velocidade: MS_SPEEX_ENC, MS_SPEEX_DEC

Processamento de som

  • Conversão de canal (mono->estéreo, estéreo->mono): MS_CHANNEL_ADAPTER
  • Conferência: MS_CONF
  • Gerador DTMF: MS_DTMF_GEN
  • Cancelamento de eco (speex): MS_SPEEX_EC
  • Equalizador: MS_EQUALIZER
  • Misturador: MS_MIXER
  • Compensador de Perda de Pacote (PLC): MS_GENERIC_PLC
  • Reamostrador: MS_RESAMPLE
  • Detector de tom: MS_TONE_DETECTOR
  • Controle de volume e medição de nível de sinal: MS_VOLUME

Filtros de vídeo

Captura e reprodução de vídeo

  • captura android
  • reprodução android
  • Captura AV Foundation (iOS)
  • Reprodução AV Foundation (iOS)
  • Captura DirectShow (Windows)
  • Reprodução do DrawDib (Windows)
  • Reprodução externa - Enviando vídeo para a camada superior
  • Reprodução GLX (Linux): MS_GLXVIDEO
  • Mire - imagem em movimento sintético: MS_MIRE
  • Reprodução OpenGL (Mac OS X)
  • Reprodução OpenGL ES2 (Android)
  • Captura rápida (Mac OS X)
  • Reprodução SDL: MS_SDL_OUT
  • Saída de imagem estática: MS_STATIC_IMAGE
  • Captura de vídeo para Linux (V4L) (Linux): MS_V4L
  • Captura de vídeo para 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 reprodução (Linux)

Codificação/decodificação de vídeo

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

Processamento de vídeo

  • instantâneo jpeg
  • Conversor de formato de pixel: MS_PIX_CONV
  • Redimensionador
  • Outros filtros
  • Troca de blocos de dados entre threads: MS_ITC_SOURCE, MS_ITC_SINK
  • Coletando blocos de dados de várias entradas para uma única saída: MS_JOIN
  • RTP receber/transmitir: MS_RTP_SEND, MS_RTP_RECV
  • Copiando dados de entrada para várias saídas: MS_TEE
  • Carregamento encerrado: MS_VOID_SINK
  • Fonte de silêncio: MS_VOID_SOURCE

plugins

filtros de som

  • 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

Após uma breve descrição do filtro, é mostrado o nome do tipo, que é utilizado ao criar uma nova instância deste filtro. A seguir, nos referiremos a esta lista.

Instalação no Linux Ubuntu

Agora vamos instalar o streamer de mídia no computador e construir nosso primeiro aplicativo com ele.

A instalação do Mediastremer2 em um computador ou máquina virtual executando o Ubuntu não requer nenhuma habilidade especial. Aqui e abaixo, o símbolo "$" denotará o prompt do shell para inserir comandos. Aqueles. se na listagem você vir este símbolo no início da linha, então esta é a linha na qual os comandos são mostrados para serem executados no terminal.

Supõe-se que, durante as etapas deste artigo, seu computador tenha acesso à Internet.

Instalando o pacote libmediastreamer-dev

Inicie o terminal e digite o comando:

$ sudo apt-get update

Você será solicitado a fornecer uma senha para fazer alterações, insira-a e o gerenciador de pacotes atualizará seus bancos de dados. Depois disso, você precisa executar:

$ sudo apt-get install libmediastreamer-dev

Os pacotes de dependência necessários e a própria biblioteca do streamer de mídia serão baixados e instalados automaticamente.

O tamanho total dos pacotes deb de dependência baixados será de aproximadamente 35 MB. Detalhes sobre o pacote instalado podem ser encontrados com o 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/

Instalando ferramentas de desenvolvimento

Instale o compilador C e as ferramentas que o acompanham:

$ sudo apt-get install gcc

Verificamos o resultado consultando a versão do compilador:

$ gcc --version

A resposta deve ser algo como isto:

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.

Construindo e executando o aplicativo de avaliação

Nós criamos em Início pasta para nossos projetos de tutorial, vamos chamá-la tutorial:

$ mkdir ~/mstutorial

Use seu editor de texto favorito e crie um arquivo de programa C chamado mstest.c com o seguinte conteúdo:

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

Ele inicializa o streamer de mídia, imprime uma saudação e sai.

Salve o arquivo e compile o aplicativo de teste com o comando:

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

Observe que a linha

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

entre aspas, que estão localizadas no teclado no mesmo local da letra "Ё".

Se o arquivo não contiver erros, após a compilação, um arquivo aparecerá no diretório mstest. Iniciamos o programa:

$ ./mstest

O resultado será assim:

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.

Nesta listagem, vemos as mensagens de erro que a biblioteca ALSA exibe, ela é usada para controlar a placa de som. Os próprios desenvolvedores do streamer de mídia acreditam que isso é normal. Nesse caso, concordamos relutantemente com eles.

Agora estamos prontos para trabalhar com o streamer de mídia. Instalamos a biblioteca do streamer de mídia, a ferramenta de compilação e, usando um aplicativo de teste, verificamos se as ferramentas estão configuradas e o streamer de mídia inicializa com sucesso.

Próximo статье vamos criar uma aplicação que irá montar e executar o processamento de um sinal de áudio em uma cadeia de vários filtros.

Fonte: habr.com