sábado, 19 de outubro de 2013

Usando o FFMPEG (FFPLAY) como player de streams HLS

HLS, ou HTTP Live Streaming, formato criado para a Apple para exibição de vídeo ao vivo no iOS e que vem sendo aos poucos sendo adaptada por outras plataformas (infelizmente ainda mal implementado no Android) exige um bocado de malabarismo para quem queira trabalhar com ele. Até mesmo para assistir os streams no computador enquanto trabalha.

Se você usa Mac, não é complicado. O QuickTime X tem suporte nativo ao HLS, basta abrir a URL com M3U8 nele. Nos outros sistemas, especialmente Windows, a coisa complica. O FFMPEG pode ser uma boa solução.

O FFMPEG, em alguns builds, vem com outras duas ferramentas, o FFPROBE e FFPLAY. A primeira serve de ferramenta de diagnóstico para arquivos. A segunda serve justamente para assistir conteúdo utilizando o engine do FFMPEG. E como nas últimas versões (atualmente estamos na 1.2.1) os suporte a HLS como formato de entrada evoluiu muito ele pode ser um player bem útil.

Basta chamar na linha de comando ffmpeg http://a.url.do/seu.stream/playlist.m3u8 Simples e prático.

domingo, 13 de outubro de 2013

Instalando o mais recente FFMPEG no Ubuntu 12.10

(Adaptado de: "Install FFMPEG on Ubuntu From Source" e "Making use of /usr/local/lib")

Tenho um VPS com Ubuntu 12.10 e precisava usá-lo para fazer remotamente conversões de formatos através do FFMPEG. O problema é que as distribuições oficiais via apt-get install ffmpeg não instalam realmente a última versão e sim uma versão modificada do 0.6 apenas para manter compatibilidade com outros programas. Como usar então as últimas versões do aplicativo nesse sistema, ou ainda, como utilizar outras bibliotecas não incluídas por padrão? Compilando do código-fonte. Para os não tão iniciados no mundo Linux (eu incluso), aqui vai um registro do caminho das pedras:

Comece fazendo a limpeza

Retire todas as dependências previamente instaladas via apt-get para evitar conflitos:

sudo apt-get remove ffmpeg x264 libav-tools libvpx-dev libx264-dev yasm

PS: Caso precise da biblioteca libfaac lembre-se de adicionar o repositório multiverse. Leia mais detalhes aqui

Instale as dependências

sudo apt-get update

sudo apt-get -y install autoconf build-essential checkinstall git libass-dev libfaac-dev libgpac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev librtmp-dev libtheora-dev libtool libvorbis-dev pkg-config texi2html zlib1g-dev

Instalando os pacotes

Yasm

cd

wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz

tar xzvf yasm-1.2.0.tar.gz

cd yasm-1.2.0

./configure

make

sudo checkinstall --pkgname=yasm --pkgversion="1.2.0" --backup=no --deldoc=yes --fstrans=no --default

make install

x264

cd

git clone --depth 1 git://git.videolan.org/x264

cd x264

./configure --enable-static

make

sudo checkinstall --pkgname=x264 --pkgversion="3:$(./version.sh | awk -F'[" ]' '/POINT/{print $4"+git"$5}')" --backup=no --deldoc=yes --fstrans=no --default

make install

fdk-aac

cd

git clone --depth 1 git://github.com/mstorsjo/fdk-aac.git

cd fdk-aac

autoreconf -fiv

./configure --disable-shared

make

sudo checkinstall --pkgname=fdk-aac --pkgversion="$(date +%Y%m%d%H%M)-git" --backup=no --deldoc=yes --fstrans=no --default

make install

libvpx

cd

git clone --depth 1 http://git.chromium.org/webm/libvpx.git

cd libvpx

./configure --disable-examples --disable-unit-tests

make

sudo checkinstall --pkgname=libvpx --pkgversion="1:$(date +%Y%m%d%H%M)-git" --backup=no --deldoc=yes --fstrans=no --default

make install

E finalmente, o FFMPEG em si

cd

git clone --depth 1 git://source.ffmpeg.org/ffmpeg

cd ffmpeg

./configure --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3

make

sudo checkinstall --pkgname=ffmpeg --pkgversion="7:$(date +%Y%m%d%H%M)-git" --backup=no --deldoc=yes --fstrans=no --default

make install

hash -r

Pronto!

Ué, e esse erro "undefined reference to `x264(...)"?"

É um problema que pode acontecer por referências erradas à biblioteca do x264. Tente:

Edite o arquivo /etc/ld.so.conf e adicione a linha "/usr/local/lib"

Execute "sudo ldconfig"

Continue a instalação do FFMPEG novamente a partir do 'make'"

ERROR: libvpx decoder version must be >=0.9.1

cd ~/libvpx

make clean

git pull

./configure

make

sudo checkinstall --pkgname=libvpx --pkgversion="$(date +%Y%m%d%H%M)-git" --backup=no --default --deldoc=yes

http://stackoverflow.com/questions/14899290/error-libvpx-decoder-version-must-be-0-9-1

sábado, 12 de outubro de 2013

Publicando um stream Flash no Original Livestream.com

Uma capacidade muito interessante do FFMPEG é de poder enviar o resultado final da codificação em forma de streaming para outro computador ou servidor, inclusive no formato RTMP, usado por servidores como o Flash Media Server ou Wowza Server. Sobre essas capacidades falarei mais a fundo numa próxima oportunidade.

O que me levou a fazer esse post é uma dor de cabeça que eu tive durante um bom tempo. Uso um serviço de streaming chamado Livestream, e no seu serviço original (não confundir com o novo Livestream, uma plataforma tecnológica bem diferente) é possível enviar o stream através de programas como Wirecast e Flash Live Encoder, que usam o protocolo RTMP. Ou seja, em tese deveria funcionar. Mas no meu computador não conseguia realizar conexão.

O curioso é que com outros servidores, como o Wowza, eu conseguia. Demorei um certo tempo para descobrir a questão. E acho que agora matei a charada.

Há um certo tempo o FFMPEG permite a publicação de streams através do comando -f rtmp://servidor/app/caminho, mas graças a uma implantação de parte da biblioteca do librtmp, vinda do projeto rtmpdump. Note bem: parte.

Ao tentar usar a URL do Livestream, que utiliza vários parâmetros para autenticação (rtmp://publish.livestream.com/mogulus/[canal]/username=[usuario]/password=[senha]/isAutoLive=true) o parser padrão dessa parte da biblioteca se confundia e acessava o caminho errado. E não é possível passar os parâmetros corretamente.

Tá, e como resolvo isso?

Ao compilar o FFMPEG para esse trabalho, exija as legítimas Havaianas certifique-se que o comando ./configure tenha também o parâmetro --enable-librtmp***, além dos demais parâmetros que você deseje para o FFMPEG. Assim você garante que o FFMPEG será compilado usando a biblioteca original inteira, não apenas a resumida dentro do programa. Aí é só utilizar "rtmp://publish.livestream.com/mogulus/[canal]/username=[usuario]/password=[senha]/isAutoLive=true/live app=mogulus/[canal]/username=[usuario]/password=[senha]/isAutoLive=true live=1" como endereço do servidor.

UPDATE: Caso sua transmissão também seja direcionada para dispositivos móveis (e isso obriga também que o vídeo seja em h264 e o áudio em AAC, nada de MP3) é importante que você defina também "playpath" no comando, indicando o intevalo de keyframes e o bitrate total da transmissão (audio+video). Neste exemplo: "rtmp://publish.livestream.com/mogulus/[canal]/username=[usuario]/password=[senha]/isAutoLive=true/live app=mogulus/[canal]/username=[usuario]/password=[senha]/isAutoLive=true playpath=livestream?videoKeyframeFrequency=5&totalDatarate=400 live=1"

*** Caso você use Mac com o Homebrew, o comando para instalar com o librtmp é brew install ffmpeg --with-rtmpdump