FFmpeg (https://www.ffmpeg.org/) é uma solução completa e multiplataforma para gravar, converter e transmitir áudio e vídeo. O FFmpeg é a estrutura multimídia líder, capaz de decodificar, codificar, transcodificar, mux, demux, transmitir, filtrar e reproduzir praticamente qualquer coisa que humanos e máquinas tenham criado. Ele suporta os formatos antigos mais obscuros até a vanguarda. Não importa se eles foram projetados por algum comitê de padrões, a comunidade ou uma corporação.
Também é altamente portátil: o FFmpeg compila, executa e passa nossa infraestrutura de teste FATE em Linux, Mac OS X, Microsoft Windows, BSDs, Solaris, etc... em uma ampla variedade de ambientes de compilação, arquiteturas de máquina, e configurações.
A própria biblioteca FFmpeg está sob licença LGPL 2.1. A ativação de certas bibliotecas externas (como libx264) altera a licença para GPL 2 ou posterior.
Eu usei o script ffmpeg-android-maker (colaboradores: Alexander Berezhnoi Javernaut + codacy-badger Codacy Badger + A2va) para compilar as bibliotecas. Este script baixa o código fonte do FFmpeg de https://www.ffmpeg.org e constrói a biblioteca e a monta para Android. O script produz bibliotecas compartilhadas (arquivos *.so), bem como arquivos de cabeçalho (arquivos *.h).
O foco principal do ffmpeg-android-maker é preparar bibliotecas compartilhadas para integração perfeita em um projeto Android. O script prepara o diretório `output` que deve ser usado. E não é a única coisa que este projeto faz. O código-fonte do ffmpeg-android-maker está disponível sob a licença do MIT. Consulte o arquivo LICENSE.txt para obter mais detalhes em https://github.com/Javernaut/ffmpeg-android-maker/ As bibliotecas eXport-it FFmpeg são apenas compiladas com libaom, libdav1d, liblame, libopus e libtwolame... mas não todas as bibliotecas associadas.
Para desenvolver o suporte Java para FFmpeg e executá-lo no Android 7.1 a 12, comecei a partir do projeto MobileFFmpeg documentado em https://github.com/tanersener/mobile-ffmpeg/ por Taner Sener, que não é mais mantido ... e está licenciado sob LGPL 3.0 ...
Finalmente, preparei um projeto JNI Android Studio com as bibliotecas, incluí arquivos e código de suporte Java e gerei um arquivo de biblioteca .aar para integrar como uma biblioteca adicional em meus projetos existentes.
Para iniciar um canal multicast é necessário usar um cliente, para acessar um servidor UPnP em sua rede local (Wi-Fi) com suporte a FFmpeg. Este servidor deve responder com a lista dos arquivos que exporta. Se este servidor tiver suporte para FFmpeg, um pequeno texto "Como canal" deve ser mostrado em vermelho no final da linha superior da página da lista. Quando o texto é "vermelho", clicar no botão "play" funciona como antes de usar o protocolo UPnP. Se você clicar no texto, ele deverá ficar "verde" e clicar no botão "reproduzir", após selecionar os arquivos de vídeo ou áudio, deverá iniciar um "canal".
Os arquivos de mídia selecionados são reproduzidos aparentemente da mesma maneira que através do UPnP, exceto que o atraso na inicialização é maior devido a tarefas adicionais. Você deve manter este cliente reproduzindo os arquivos de mídia para manter o pipe ativo.
O IP multicast não funciona na Internet, funciona apenas na rede local, portanto, principalmente no Wi-Fi. Um canal de dados multicast pode ser compartilhado por vários clientes simultaneamente. Você está enviando um fluxo de dados de mídia em sua rede Wi-Fi e mostra esses dados em dispositivos conectados, quase de forma síncrona, apenas a diferença de atraso de latência.
Com streaming UPnP ou HTTP, cada dispositivo requer a largura de banda do vídeo mostrado e a largura de banda global é a soma de ambos os tráfegos. Com o streaming multicast, enviamos um fluxo de dados na LAN que é compartilhado entre vários clientes.
Se você usar outro cliente em sua rede após iniciar um canal, deverá ver uma linha adicional na janela principal do cliente. Basta clicar nesta linha para iniciar o show.
Também é possível usar outros produtos como VLC, SMplayer, ... para exibir um vídeo ou ouvir música distribuída em um canal multicast usando apenas a URL "UDP" mostrada no cliente eXport-it.
p>A boa maneira de interromper um canal multicast é interrompê-lo no cliente em que você o iniciou, pois esse canal é controlado lá. Tocar até o fim dos arquivos de mídia transmitidos também deve dar o fim do show.