Servidor de video Open Source (streaming)

04 fevereiro, 2010 6 Comentários »

videolan A alguns anos atrás, mesmo antes da explosão do YouTube, eu tive a curiosidade de saber como colocar publicar um vídeo ao vivo na internet, utilizando uma Webcam e um objeto Flash. Minha idéia era de criar uma conferência no Flash com várias pessoas em uma sala de bate-papo, porem meu conhecimento era muito pouco na época para criar algo do tipo. Mesmo assim pesquisando na Internet, eu cheguei a conhecer uma tecnologia nova da antiga Macromedia (que foi comprada pela ADOBE) chamada de Macromedia Flash Communication Server MX. Este produto da Macromedia trabalhava como um servidor multimídia, onde fazia exatamente o que eu queria, e por sinal já vinha em uma de suas demonstrações um exemplo de sala de conferência com suporte a webcam.

Os anos se passaram e eu com o tempo desisti de trabalhar com o FCS, pois o mesmo era muito caro e eu não via mais futuro em investir meu tempo no produto. Eis que ano passado me surgiu um problema aqui na empresa no qual eu tive que voltar a estudar ferramentas de streaming para colocar uma programação ao vivo na internet. Minha missão então era achar uma ferramenta boa é de preferência open source, para disponibilizar na internet o vídeo.  Bom minha missão ainda está longe e terminar mas vou descrever o caminho que percorri e as ferramentas que testei e o resultado atual do projeto como está.

Buscando pela internet eu encontrei diversas alternativas ao FCS, que agora produto da ADOBE era chamado de Flash Media Server (FMS), algumas delas opensource, outras não mas free, e outras free mas com limitações. Eu testei então:

- Darwin Streaming Server -> Apple
- Red5 -> Feito em Java tendo mesmos recursos do FMS, porém 100% livre
- Wownza Media Systems -> Um bom media server porém a versão FREE tem muitas limitações.
- VideoLan -> Até agora não consegui descrever em que categoria se encaixa o VideoLan, ele é player, encoder, streaming server e etc.

De todos que testei, o VideoLan foi meu favorito, por ser mais simples e também por possui uma documentação mais completa, eu consegui resultados satisfatórios mais rápido que os outros. De inicio eu comecei testando o VideoLan no windows, depois comecei então no Slackware onde consegui fazer meu primeiro stream para a Web. Mas vou deixar para detalhar o VideoLan por último já que até agora ele é minha escolha para produção.

Darwin Streaming Server
O DSS, é um servidor stream da APPLE, ele transmite mídia atraves dos protocolos RTP/RTSP, sendo uma solução OpenSource de outro produto da APPLE o QuickTime Streaming Server. De inicio o DSS era um sistema operacional completo, mas hoje em dia já é distribuído separado como um software, minha aventura foi tentar rodar o DSS no Slackware64, porém foi um fracasso, não consegui fazer o programa iniciar, fiquei então de testar a versão SO, mas não encontrei tempo ainda.

RED5
O Red5 é um servidor escrito em java, onde busca oferecer os mesmo recursos do FMS da Adobe, foi criado através de engenharia reversa dos protocolos usados pelo FMS. Transmite através do protocolo RTMP. Sua instalação é simples, porém a configuração é um pouco complicada, pois a documentação é muito incompleta, você tem que queimar bastante a cuca para entender como o servidor funciona e garimpar a internet atrás de informações. Depois de instalar e iniciar o servidor, basta acessar o mesmo pelo seu navegador com a porta do Red5, que ele já tem exemplos para mostrar, e logo de inicio tudo funciona perfeitamente.
Porém para o tipo de transmissão que eu queria fazer o Red5 iria tomar mais tempo do que o normal, até que eu descobrisse como ele funciona 100%, mas é uma ótima ferramenta, e eu recomendo.

Wownza Media Systems
O Wownza é um Red5 bem mais completo, transmite tanto em RTP/RTSP como em RTMP, porém sua versão gratuita só permite o acesso de 10 conexões simultâneas, pode atender a pequenas soluções, mas eu não poderia me dar ao luxo de limitar a transmissão a 10 pessoas, se a 11 tentasse acessar, já ia ter reclamação. Vale a pena testar, mas para produção não vejo viável a versão FREE.

VideoLan
O VLC não é um servidor Stream, mas ele pode trabalhar como tal. O VideoLan no inicio possuía duas versões, o VLC (VideoLan Client) e o VLS (VideoLan Server), porém depois eles juntaram tudo em uma só solução que hoje é conhecida como VideoLan ou VLC. Este software atende qualquer necessidade, devido a forma que ele trabalha, e o suporte aos diversos codecs de vídeo e audio existentes.
O VideoLan possui um conceito simples de input e output, onde você escolhe de onde vem a mídia e para onde ela vai. Como por exemplo o ato simples de assistir um vídeo pelo VLC, o input será FILE (arquivo) e o output será DISPLAY (tela do computador). Com este conceito fica fácil por exemplo colocar sua webcam na internet com um simples comando do VLC, onde o input deve ser o DEVICE da webcam e o output um stream HTTP com encapsulamento FLV.

Aqui está o famoso diagrama do VideoLan, é meio antigo mas é assim mesmo que funciona.

Então para fazer a transmissão ao vivo eu utilizei o VLC para pegar a imagem e som através de uma placa de captura, e jogar esta transmissão para a web usando FLV. E para visualizar o FLV utilizei um simples player em flash conhecido como Flowplayer, o que por hora resolveu meu problema.

Como servidor eu estava utilizando:
SO: Linux Slackware 13.0 64bits
CPU: AMD Athlon(tm) Dual Core Processor 4450B 2.2GHZ
MEM: 2GB RAM
Placa de Captura: saa7134 Kworld Plus TV Turner Card
VideoLan: VLC 1.0.4

No caso para efetuar o teste, sintonizei a placa de TV no canal da globo, e executei o vlc pela shell do linux com o seguinte comando:

cvlc v4l2:///dev/video0 –v4l2-caching=6500 –v4l2-width=420 –v4l2-height=320 –input-slave=alsa://hw:1,0 –alsa-samplerate=16000 –sout “#transcode{fps=12,vcodec=FLV1,vb=120,acodec=mp3,ab=16,channels=1,samplerate=11025}:std{access=http{mime=video/x-flv},dst=0.0.0.0:8080/stream.flv}” –sout-mux-caching=10000

Detalhando o comando acima temos:

  1. cvlc -> inicia o vlc sem chamar a interface gráfica.
  2. v4l2:///dev/video0 -> utiliza o device video0 (que é a placa de captura) como input.
  3. –v4l2-caching=6500 –v4l2-width=420 –v4l2-height=320 -> parâmetros passados para o input onde determina um cache de 6.5 segundos e o tamanho da tela a ser capturado.
  4. –input-slave=alsa://hw:1,0 -> aqui eu escolho qual dispositivo de som vai ser usado como input, no caso existe o 0,0 e o 1,0 o que eu escolho e o da placa de captura, o 0,0 é o da placa de som do computador.
  5. –alsa-samplerate=16000 -> Isto muda a velocidade do som do input, se não usar isso a voz fica igual Alvin e os Esquilos ( somente para a captura, o resto fica normal).
  6. –sout -> O Sout é o comando que fala para onde deve ir o Output, caso não utilize ele manda por padrão para o DISPLAY.
  7. #transcode{fps=12,vcodec=FLV1,vb=120,acodec=mp3,ab=16,channels=1,samplerate=11025} -> O transcode é a conversão em tempo real de um tipo de midia para outro. No caso estamos recebendo um vídeo vindo da placa de captura que seu formato é desconhecido e não suportado pelo FLASH, então temos que transformar este sinal em algo compatível. Com isso fazemos um transcode para FLV e MP3. o VB=120 é que controla a qualidade do vídeo e o AB=16 é a qualidade do audio, quanto maior, melhor a qualidade e mais banda utilizada.
  8. std{access=http{mime=video/x-flv},dst=0.0.0.0:8080/stream.flv} -> Aqui no STD falamos para onde ele vai enviar o stream, no caso eu quero que envie para a porta 8080 utilizando o procolo HTTP, e que o stream saia como um arquivo do tipo (mime) video/x-flv, com o nome de stream.flv

Com isso basta utilizar qualquer player de FLV e colocar nosso endereço como fonte, http://meuip:8080/stream.flv que ele vai tocar o que está passando na placa de captura com um atraso de 6.5 segundos.

- Qual a vantagem de se utilizar o VLC para isso. Eu digo que é a praticidade de se fazer a coisa funcionar, de tornar um projeto visível, sem muito esforço e obter uma qualidade de transmissão a custo baixo.

- Qual a desvantagem de ser utilizar o VLC para isso. O flash player entende que o stream.flv é um arquivo, e não um stream, então para o navegador do visitante ele está abrindo um vídeo infinito, ele não trabalha direito com isso, qualquer lag e etc é sentida pelo navegador por não ser realmente um stream e sim um arquivo com download infinito. Outro problema é que o VLC fica dando erros e warnings de buffer overflow e underflow dependendo da configuração que você utilize, e até hoje mesmo funcionando, não sei como eliminar esses erros e deixar o sistema 100%.

Ainda existe um cenário número dois que estou testando. Temos que transmitir uma programação ao vivo que só pode ser capturada de um lugar que possui um link de apenas 2MBPS. E fazer uma transmissão nesse local com certeza vai detonar todo o link só com transmissão dependendo da quantidade de pessoas que estiver assistindo ao mesmo tempo.
Para solucionar isto eu utilizei uma técnica de enviar o sinal para um servidor aqui no backbone e daqui do backbone fazer o stream para a internet. Com isso eu instalei um servidor Linux Slackware64 com uma placa de captura no local com 2mpbs, e capturo o sinal e envio via UDP para outro servidor aqui no backbone, e dele envia para HTTP usando FLV, usando os comandos abaixo:

SERVIDOR CAPTURA
Linux Slackware 13.0 64bits
AMD Athlon(tm) 64 Processor 3200+ 2GHZ
2GB RAM
saa7134 Kworld Plus TV Turner Card
VLC 1.0.4
cvlc v4l2:///dev/video0 –v4l2-caching=6500 –v4l2-width=420 –v4l2-height=320 –input-slave=alsa://hw:1,0 –alsa-samplerate=16000 –sout “#transcode{vcodec=h264,vb=800,scale=1,acodec=mp3,ab=128,channels=2}:std{access=udp,mux=ts,dst=10.1.3.88:1234}” -vv

SERVIDOR NO BACKBONE
Linux Slackware 13.0 64bits
AMD Athlon(tm) Dual Core Processor 4450B 2.2GHZ
2GB RAM
VLC 1.0.4
cvlc udp://@:1234 –udp-caching=3000 –sout “#transcode{fps=12,vcodec=FLV1,vb=120,acodec=mp3,ab=16,channels=1,samplerate=11025}:std{access=http{mime=video/x-flv},dst=0.0.0.0:8080/stream.flv}” –sout-mux-caching=10000 -vv

Este esquema funciona, porém não é o melhor esquema de ser fazer, é digamos uma gambiarra, ainda estou a procura da solução perfeita, mas vejo que esta missão está longe de terminar, mas no final espero que ajuda alguem que se encontre no mesmo barco que eu, e que se tiver alguma solução melhor fique a vontade para comentar.

Acho que este foi meu primeiro post de 2010 hehehe FELIZ ANO NOVO LOL (Fevereiro FTW).


6 Responses to “Servidor de video Open Source (streaming)”

  1. Por: Palmito Windows XP Firefox 3.5.7 on fev 10, 2010 | Reply

    Você é o cara dos tutoriais, valha nossa senhora.

  2. Por: Thiago Melo Linux Firefox 3.5.6 on fev 10, 2010 | Reply

    Tem que repassar o conhecimento né :D

  3. Por: Kleber Duarte Lima Windows XP Firefox 3.6 on mar 9, 2010 | Reply

    Boa Tarde Thiago li o seu tutorial porem estou precisando de uma ajuda estou recebendo um streaming no VLC porem eu gostaria que a saida de video não fosse pelo monitor e sim para saido da minha placa ZORAN da PINNACLE, no mplayer eu consigo fazer funciona muito bem com o seguinte comando “mplayer -vo zr mms://ip” esse -vo zr esta dizendo que estou saindo pela placa ZORAN, agora no VLC eu não consegui nada, você poderia me ajudar?

  4. Por: Thiago Melo Linux Firefox 3.5.6 on mar 10, 2010 | Reply

    Kleber essa sua placa tem saída de vídeo? Creio eu que a saída de vídeo funciona como se fosse outra tela do monitor, no caso no linux seria o display 2.
    No caso do Linux creio que voce teria que utilizar isso
    –vout x11 –x11-display :0.1

    O display principal é o 0.0 o 0.1 seria o segundo e assim por diante.

  5. Por: Kleber Duarte Lima Windows XP Firefox 3.6 on mar 10, 2010 | Reply

    Thiago você sabe como faz para executar o VLC no modo texto do linux? ele não tem modo grafico, ele vai exibir em modo texto mesmo!

  6. Por: manu Windows XP Firefox 3.0.18 on mar 10, 2010 | Reply

    Tu é o cara!!!

Post a Comment