O conteúdo deste artigo foi retirado do meu .
Introdução
Este artigo é o início de uma série de artigos sobre o processamento em tempo real de dados de mídia usando o mecanismo Mediastreamer2. Durante a apresentação, serão utilizados conhecimentos básicos sobre o terminal Linux e programação em C.
Mediastreamer2 é um mecanismo VoIP que serve de base para o popular projeto open-source de um telefone VoIP. . No Linphone, o Mediastreamer2 implementa todas as funções relacionadas ao áudio e vídeo. Uma lista detalhada das capacidades do mecanismo pode ser vista nesta página do Mediastreamer. O código fonte está disponível aqui: .
A partir de agora, para conveniência, em vez de usar a palavra Mediastreamer2, utilizaremos sua notação em português: "midiastreamer".
A história de sua criação não é completamente clara, mas, de acordo com seu código fonte, ele usou anteriormente a biblioteca , o que sugere uma possível relação distante com . Em comparação, o midiastreamer parece ser mais leve. A primeira versão do Linphone foi lançada em 2001, portanto, atualmente o midiastreamer existe e se desenvolve há quase 20 anos.
Na base do midiastreamer está uma arquitetura chamada "Data flow" (fluxo de dados). Um exemplo dessa arquitetura está ilustrado na imagem abaixo.

Nessa arquitetura, o algoritmo de processamento de dados é definido não por código de programação, mas por um diagrama (grafo) de conexão de funções, que podem ser organizadas 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 em um esquema de processamento e transmissão de tráfego RTP de um telefone VoIP.
A possibilidade de conectar filtros em esquemas arbitrários, a fácil criação de novos filtros e a implementação do midiastreamer como uma biblioteca separada e autônoma permitem usá-lo também em outros projetos. Além disso, o projeto pode pertencer à área de VoIP, já que há a possibilidade de adicionar filtros feitos manualmente.
A biblioteca de filtros fornecida por padrão é bastante rica e, como já mencionado, pode ser expandida com filtros desenvolvidos pelo usuário. Mas, primeiro, vamos descrever os filtros prontos que vêm junto com o midiastreamer. Aqui está a lista deles:
Filtros de áudio
Captura e reprodução de áudio
- Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ
- Áudio 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)
- Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ
- DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
- Reprodutor de arquivos (raw/wav/pcap) (Linux): MS_FILE_PLAYER
- Reprodutor de arquivos (raw/wav) (Windows): MS_WINSND_READ
- Gravação em arquivo (wav) (Linux): MS_FILE_REC
- Gravação em arquivo (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 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 Linear: MS_L16_ENC, MS_L16_DEC
- Speex: MS_SPEEX_ENC, MS_SPEEX_DEC
Processamento de áudio
- Conversão de canal (mono->estéreo, estéreo->mono): MS_CHANNEL_ADAPTER
- Conferência: MS_CONF
- Gerador DTMF: MS_DTMF_GEN
- Supressão de eco (speex): MS_SPEEX_EC
- Equalizador: MS_EQUALIZER
- Mixer: MS_MIXER
- Compensador de perda de pacotes (PLC): MS_GENERIC_PLC
- Reamostragem: MS_RESAMPLE
- Detector de tons: 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 DrawDib (Windows)
- Reprodução externa — Enviar vídeo para o nível superior
- Reprodução GLX (Linux): MS_GLXVIDEO
- Mire — Imagem em movimento sintética: MS_MIRE
- Reprodução OpenGL (Mac OS X)
- Reprodução OpenGL ES2 (Android)
- Captura Quicktime (Mac OS X)
- Reprodução SDL: MS_SDL_OUT
- Saída de imagens estáticas: MS_STATIC_IMAGE
- Captura Video For Linux (V4L) (Linux): MS_V4L
- Captura Video For Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
- Captura Video4windows (DirectShow) (Windows)
- Captura Video4windows (DirectShow) (Windows CE)
- Captura Video For Windows (vfw) (Windows)
- Reprodução XV (Linux)
Codificação/decodificação de vídeo
- H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
- H.264 (apenas decodificador): MS_H264_DEC
- Theora: MS_THEORA_ENC, MS_THEORA_DEC
- VP8: MS_VP8_ENC, MS_VP8_DEC
Processamento de vídeo
- Captura 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
- Coleta de blocos de dados de várias entradas para uma saída: MS_JOIN
- Recepção/transmissão RTP: MS_RTP_SEND, MS_RTP_RECV
- Cópia de dados de entrada para várias saídas: MS_TEE
- Carga consistente: MS_VOID_SINK
- Fonte de silêncio: MS_VOID_SOURCE
Plugins
Filtros de áudio
- 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 H.264 V4L2 com aceleração de hardware
Após uma breve descrição do filtro, é exibido o nome do tipo utilizado ao criar uma nova instância desse filtro. Nas próximas seções, nos referiremos a esta lista.
Instalação no Linux Ubuntu
Agora, realizaremos a instalação do mediastreamer no computador e criaremos nosso primeiro aplicativo com ele.
A instalação do Mediastremer2 em um computador ou máquina virtual com Ubuntu não requer habilidades especiais. A partir de agora, o símbolo «$» representará o prompt do shell para a entrada de comandos. Ou seja, se você vir esse símbolo no início de uma linha, significa que essa linha mostra os comandos a serem executados no terminal.
Presume-se que, durante a execução das ações descritas neste artigo, seu computador tenha acesso à internet.
Instalação do pacote libmediastremer-dev
Abra o terminal e digite o comando:
$ sudo apt-get updateSerá solicitado a senha para fazer alterações, digite-a e o gerenciador de pacotes atualizará seus bancos de dados. Após isso, deve-se executar:
$ sudo apt-get install libmediastreamer-devOs pacotes de dependência necessários e a própria biblioteca do mediastreamer serão automaticamente baixados e instalados.
O tamanho total dos pacotes deb de dependência baixados será de aproximadamente 35 MB. Detalhes sobre o pacote instalado podem ser obtidos com o comando:
$ dpkg -s libmediastreamer-devExemplo de resposta:
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: Linphone web phone's media library - development files
Linphone é um telefone de áudio e vídeo pela internet usando o protocolo SIP. Ele
possui uma interface GTK+ e console, inclui uma grande variedade de codecs de áudio e vídeo
e fornece recursos de IM.
.
Este pacote contém as bibliotecas de desenvolvimento para manipular operações de mídia.
Original-Maintainer: Debian VoIP Team
Homepage: http://www.linphone.org/
Instalação das ferramentas de desenvolvimento
Instalamos o compilador de C e suas ferramentas associadas:
$ sudo apt-get install gccVerificamos o resultado, solicitando a versão do compilador:
$ gcc --versionA resposta deve ser aproximadamente assim:
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
Este é um software livre; veja a fonte para condições de cópia. Não há
garantia; nem mesmo para COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM FIM PARTICULAR.Compilação e execução do aplicativo de teste
Criamos na home uma pasta para nossos projetos de aprendizado, chamaremos de mstutorial:
$ mkdir ~/mstutorialUse 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 mediastreamer, imprime uma saudação e finaliza a execução.
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`está entre aspas, que estão no mesmo lugar do teclado onde está a letra «Ё».
Se o arquivo não contiver erros, após a compilação aparecerá um arquivo mstest. Execute o programa:
$ ./mstestO resultado será assim:
ALSA lib conf.c:4738:(snd_config_expand) Parâmetros desconhecidos 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) CTL inválido default:0
ortp-warning - Não foi possível conectar o mixer ao cartão: Argumento inválido
ALSA lib conf.c:4738:(snd_config_expand) Parâmetros desconhecidos 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM desconhecido default:0
ALSA lib conf.c:4738:(snd_config_expand) Parâmetros desconhecidos 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM desconhecido default:0
ortp-warning - Estranho, a placa de som HDA Intel PCH não parece ser capaz de nada, tentando novamente com plughw...
Mediastreamer está pronto.Neste trecho vemos mensagens de erro que a biblioteca ALSA gera, que é usada para controlar a placa de som. Os próprios desenvolvedores do mediastreamer consideram isso normal. Neste caso, concordaremos com eles.
Agora estamos prontos para trabalhar com o mediastreamer. Instalamos a biblioteca do mediastreamer, a ferramenta de compilação e, usando o aplicativo de teste, verificamos que as ferramentas estão configuradas e o mediastreamer é inicializado com sucesso.
Na próxima vamos criar um aplicativo que compile e execute o processamento de sinais de áudio em uma cadeia de vários filtros.
Fonte: habr.com
