O material do artigo foi retirado do meu
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.
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
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.
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
Fonte: habr.com