Projeto SLTV
Introdução
No uso da TV Software Livre, foi identificada a necessidade de um software que reúna as tarefas de captura de áudio e vídeo, transcodifcação de formatos e transmissão de vídeo (stream) para servidores Icecast 2. Há diferentes métodos de transmissão, utilizando e combinando programas que realizam cada uma das tarefas supracitadas. Este programa publisher a ser desenvolvido é uma ferramenta que se soma ao método básico de transmissao multimídia através da internet na plataforma Linux.
Neste cenário, estamos desenvolvemos o SLTV como o programa principal para o setup de transmissão da TVSL, permitindo a captura e codificação em tempo real de diferentes entradas de vídeo e áudio, de dispositivos externos de captura como câmeras firewire, webcams USB e placas PCR e DVB. Nosso objetivo é desenvolver uma software internacionalizável, com uma interface gráfica que possa ser traduzida pra diferentes idiomas, de forma simplificada como no projeto Launchpad. O código-fonte do projeto será licenciado em GPLv3.
Arquitetura
A Arquitetura do SLTV segue a seguinte estrutura:
- Capture - Módulo responsável por identificar os dispositivos de captura e criar as entradas de fluxo de dados multimídia.
- Aqui, temos algumas alternativas prontas em C, C++ e Java, temos o publisher do Red5, temos o dvgrab e o próprio ffmpeg como software para interface com dispositivos de entrada de vídeo - xuggler é a lib Java que atua como um wrapper do ffmpeg.
- Encoder - Módulo com a funcionalidade de transcodificação de mídias entre diferentes formatos.
- Aqui vamos utilizar a nova versão da libtheora (1.1) e vorbis.
- Control - Interface gráfica do programa, utilizada para controle dos processos de captura, codificação, visualização e transmissão de vídeos. Incluindo a monitoração da transmissão (preview).
- Stream - Módulo que realiza a transmissão de vídeo Ogg Theora para um servidor Icecast 2 da internet. Neste módulo é realizada a análise do fluxo de transmissão, apresentando um relatório da qualidade da conexão e recomendação de configurações de vídeo (bitrate, resolução, etc.) que podem otimizar a transmissão.
- Aqui podemos utilizar um bind java para biblioteca nativa libshout, que é utilizada nos softwares oggfw e vlc(?).
- Upload - Módulo responsável por realizar o envio de arquivos de vídeo para servidores da internet (não faria parte do streamer?).
- Este é um módulo preparado para diversos protocolos como FTP, SSH e também portais de publicação de vídeos, como TV SL, Vimeo, Youtube, etc.
- Interface GUI - Módulo que o usuário utiliza diretamente, se comunica com o core do sistema para configuração das funcionalidade. Funciona desacoplado do core, permitindo que sejam desenvolvidas interfaces com diferentes níveis de complexidade, seja um tela "wizard" ou um editor complexo com suporte a múltiplos pipelines.
(1) O fluxo de áudio e vídeo originado no módulo Capture, ou proveniente de um arquivo do disco, (2) é direcionado para processamento no Encoder, depois de codificado em Ogg theora/vorbis o vídeo (3) é opcionalmente apresentado na tela de Preview do módulo Controle. (4) Através do módulo de Streamer, o fluxo de vídeo e áudio é direcionado para um servidor de web tv ou rádio da internet. O Streamer deve suportar os protocolos de stream de vídeo Icecast2 (http) e Red5 (rtmp e rtmpt). O módulo Uploader (5) se comunica com serviços remotos de armazenamento de vídeos através de protocolos de transmissão de arquivos ou Webservices.
Para poupar consumo de CPU, a utilização do preview do vídeo theora é opcional. Visto que a decodificação é uma tarefa que pode consumir desnecessariamente recursos de uma máquina com baixo poder computacional.
(será que vale a pena codificarmos e decodificarmos ao mesmo tempo na mesma máquina? que tal fazermos um preview do que estamos para controle de quem faz o stream - preview de audio e vídeo e era isso? dispensando o player? estou pensando no consumo de tempo de processador para fazer todas essas tarefas em cima de uma jvm)
Bibliotecas Nativas
Nesta etapa inicial do projeto temos que decidir qual será a infraestrutura nativa que utilizaremos para implementar os módulos do SLTV. Estamos pesquisando bibliotecas nativas com as seguintes funcionalidades:
- Ser multiplataforma: Linux, Windows e Mac OS.
- Captura de dados brutos DV de câmeras firewire.
- Captura de vídeo de webcams USB.
- Captura de áudio da placa de som.
- Encoding de diferentes formatos de vídeo e áudio.
- Decoding de diferentes formatos, com saída de vídeo e áudio em interface gráfica.
- Envio de stream de vídeo e áudio para servidores Icecast2 e Red5.
Há diferentes projetos com bibliotecas/frameworks que podem suportar as funcionalidades do SLTV:
- Cygnal? - servidor RTMP escrito em C++ (parte do pacote do novo Gnash). Toda a especificação do protocolo RTMP foi feita pelo projeto e ele atuar como um streaming server Ogg e Flash no futuro para substituir o Icecast2 e o Red5. Está ainda na versão alpha, mas promete melhoras substanciais, uma vez que o projeto tem apoio da FSF, Red Hat e doações de várias empresas e ONGs do mundo do software livre.
- Xuggler - Uma biblioteca para Java ou C++ para codificar, decodificar e manipular vídeo em tempo real. O xuggler inclui suporte a envio de vídeo stream à servidores Red5. Utiliza as funcionalidade do software ffmpeg.
- FMJ? - Framework Java multimídia que é uma implementação livre do framework JMF. Utiliza as funcionalidade do software ffmpeg.
- Fobs? - Framework Java que faz interface com o FFMpeg.
- GstreamerJava: interface java do framework multimedia Gstreamer (que permite captura de dispositivos, codificação de áudio e vídeo e comunicação com servidor Icecast2).
- LibVLC - A libVLC é capaz de acessar dispositivos de captura, transcodificar e transmitir áudio e vídeo em diferentes protocolos. O VLC é um software livre multiplataforma muito conhecido, capaz de reconhecer a maioria dos formatos de áudio e vídeo como (MPEG-2, MPEG-4, H.264, DivX?, MPEG-1, mp3, ogg, aac ...), além de DVDs, VCDs, CDs de áudio e formatos HD.
- LibShout - Biblioteca desenvolvida em C que envia stream de áudio (ogg vorbis e mp3) e vídeo theora para servidores Icecast2.
Linguagem de programação
O módulos será desenvolvida na linguagem de programação Java, suportando o
J2SE? 1.5.x. Decidimos usar a java por causa da JVM que é uma máquina virtual multiplataforma e, também, pelas facilidades de empacotamento (build) e distribuição transparente de programas através da internet. Na escolha da plataforma Java também pesa sua popularidade entre os desenvolvedores brasileiros, visto que o Brasil tem o maior número de desenvolvedores Java do mundo.
Interface Gráfica GUI
A interface gráfica (GUI) do sltv é independente dos módulos de processamento de áudio/vídeo, permitindo a implementação de diferentes modelos de interface. Inicialmente criaremos uma interface de controle do tipo Wizard, que permita a configuração dos parâmetros da captura e codificação do fluxo de áudio/vídeo, além de visualização (preview) do fluxo de vídeo de cada passo do pipeline. Interfaces gráfica mais complexas como a do firtree (firtree.org) poderão ser desenvolvidas.
Desenvolvimento
O projeto de desenvolvimento do software terá duração de 10 meses, a partir de agosto de 2009 [Ago 2009 - Jun 2010].
O desenvolvimento seguirá um fluxo iterativo com
versões estáveis sendo publicadas a cada 2 meses.
O processo de desenvolvimento seguirá um
modelo Ágil, onde o processo de especificação do sistema acompanha a implementação do código.
O desenvolvimento do projeto será organizado com as ferramentas:
A equipe de desenvolvimento é formada por:
- Líder do projeto e 1º desenvolvedor: Lucas Alberto S. Santos de Porto Alegre.
- Equipe: Luis Felipe
Histórico
A primeira reunião do projeto foi realizada no dia 23 de Julho de 2009, na sede da Associação Software Livre, onde estavam presentes Lucas Alberto e Fabrício Solagna. Neste primero encontro foram identificadas as principais necessidades dos usuário de ferramentas livres de captura e transmissão de vídeos, a partir disso montamos então uma lista das funcionalidades desejadas para a versão 1.0 do SLTV. Lucas ganhou acesso a um dos pontos de montagem da TV SL onde poderá executar testes.
Conversamos sobre as bibliotecas e os resultados dos testes com o xuggler e o gstreamer. Ambas as bibliotecas são capazes de suportar as principais funcionalidades do SLTV. Mas ainda temos problemas com o suporte a stream para icecast no xuggler e suporte a servidor red5 no gstreamer. Constamos que o projeto gstreamer é mais maduro do que o xuggler, pois é mais antigo e desenvolvido por muitos desenvolvedores, enquanto o xuggler é desenvolvido primordialmente pela empresa Xuggle.com.
Falamos sobre os usos do sistema, o qual, além de ser um publisher tradicional de captura -> stream, deverá suportar o uso de filtros de efeitos em tempo real, playlists, análise de qualidade de conexão, escolha da fonte de vídeo ou captura em tempo real, e módulo sala de controle. Destas funções, a sala de controle é a mais complexa e a mais desejada pela equipe da TV Software Livre. Com a "sala de controle" é possível controlar e monitorar a captura, codifcação e o stream de diferentes fluxos de vídeo usando um sistema integrado. A sala de controle poupa tempo e otimiza os recursos da TV SL na cobertura de eventos com múltiplas câmeras.
Requisitos e Casos de Uso
Acesse a página de
RequisitosSLTV.
Informações do projeto e Como participar
O projeto será desenvolvido de forma aberta no ambiente Launchpad (
https://launchpad.net/sltv).
TODOs
Lucas:
- Criar wiki: OK
- Criar lista de discussão: OK
- Comitar código dos experimentos com gstreamer-java e xuggler: OK
- Levantar informações sobre as bibliotecas nativas: OK
- Criar protótipo:
- stream de câmera firewire: ?
- Webcam: OK
- Pacote Bytecode do protótipo: sltv.jar
Felipe:
- Verificação do suporte do Linux às novas câmeras compactas HD (USB): PEND
Tarefas a serem realizadas pela equipe:
- Teste das bibliotecas listadas (Xuggler, LibVLC, GstreamerJava) para avaliação: RelatorioFinalLibs?
- Estudo do código dos projetos oggfwd, dvgrab e cygnal.
- Acompanhamento das listas de discussão dos projetos Red5, Icecast2, Gnash, Xuggler, Gstreamer-Java, FMJ.
--
LucasSantos - 02 Aug 2009