Introdução
FFmpeg é uma solução completa para gravar, converter e transmitir audio
e vídeo. Este pacote inclui a biblioteca libavcodec, responsável pelos codecs
de audio/video. FFmpeg é desenvolvido sob GNU/Linux, mas pode compilado
sob a maioria de sistemas operacionais, incluindo Microsoft Windows.
Componentes do pacote FFmpeg
- ffmpeg é um utilitário para a linha de comando que possui a função de
converter um formato de vídeo para outro. Vale à pena lembrar que este programa
suporta também a captura e codificação em tempo real de uma placa de TV ou webcam.
- ffserver é um programa servidor para transmitir de audio e vídeo via protocolo HTTP.
- ffplay é um player simples para o modo console que utiliza a biblioteca SDL com
as bibliotecas FFmpeg.
- libavcodec é uma biblioteca que contém todos os codificadores e decodificadores de audio/vídeo do pacote FFmpeg .
- o libavformat é uma biblioteca que contém analisadores e geradores de diversos formatos de audio e vídeo.
|
|
Download e instalação
Se você deseja efetuar a instalação através do pacote .RPM, efetue o download no link abaixo:
Abaixo a lista de dependências do pacote:
- libffmpeg0
- imlib2
- lame
- faad2
- libavcodec.so
- libavformat.so
Para efetuar o download e instalação dos fontes, siga as instruções abaixo:
$ wgethttp://kent.dl.sourceforge.net/sourceforge/ffmpeg/ffmpeg-0.4.9-pre1.tar.gz
Após o download, descompacte o pacote com o comando tar:
$ tar -zxvf ffmpeg-0.4.9-pre1.tar.gz
$ cd ffmpeg-0.4.9-pre1/
Crie os arquivos de configuração para a compilação:
$ ./configure
Compilando e instalando o pacote:
$ make
$ su -c "make install"
Nesta etapa, se todos os passos foram seguidos corretamente, o pacote ffmpeg foi instalado com sucesso!
|
|
Conceitos de funcionalidade
Partirei do princípio que o seu hardware de captura de vídeo está devidamente
instalado e configurado, pois este não é o objetivo deste tutorial.
Para gravar um vídeo, usamos o comando ffmpeg na linha de comando, como no exemplo abaixo:
$ ffmpeg teste.mpg
Input #0, video4linux, from "":
Duration: N/A, bitrate: N/A
Stream #0.0: Video: rawvideo, yuv420p, 160x128, 25.00 fps
Input #1, audio_device, from "":
Duration: N/A, bitrate: N/A
Stream #1.0: Audio: pcm_s16le, 44100 Hz, mono, 705 kb/s
Output #0, mpeg, to "teste.mpg":
Stream #0.0: Video: mpeg1video, 160x128, 25.00 fps, q=2-31, 200 kb/s
Stream #0.1: Audio: mp2, 44100 Hz, mono, 64 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Stream #1.0 -> #0.1
Press [q] to stop encoding
frame= 120 q=2.0 size= 112kB time=4.8 bitrate= 191.1kbits/s
Pressione a tecla (q) para finalizar a gravação.
Para reproduzir o vídeo, usamos o utilitário ffplay como no exemplo abaixo:
$ ffplay teste.mpg
Parâmetros principais do ffmpeg
- -L = Exibe a licença;
- -h = Exibe a mensagem de ajuda;
- -formats = Exibe os formatos, codecs e protocolos válidos;
- -f [formato] = Força a reprodução no formato especificado;
- -i [arquivo] = Nome do arquivo de entrada;
- -y = Substitui o arquivo anterior sem perguntar ao operador;
- -t [duração] = gera um vídeo com a duração especificada no formato hh:mm:ss[.xxx];
- -ss [posição] = Indica a gravação no tempo especificado, formato hh:mm:ss[.xxx];
- -title [string] = Determina a string de título;
- -author [string] = Determina a string do autor;
- -copyright [string] = Determina a string copyright;
- -comment [string] = Determina a string de comentário;
- -target [tipo] = Especifica o formato destino ("vcd", "svcd", "dvd", "dv", "pal-vcd", "ntsc-svcd", ... ). exemplo:
$ ffmpeg -i meu-video.avi -target vcd /tmp/vcd.mpg
- -hq = Ativa a configuração de alta qualidade.
|
|
ffserver: configurando o padrão de vídeo a ser transmitido
Inicialmente vamos aprender a criar o arquivo ffserver.conf. Este arquivo
é utilizado para definir os parâmetros do vídeo a ser transmitido (como o codec,
por exemplo). Logo abaixo teremos um exemplo da estrutura do arquivo ffserver.conf:
|
# Porta de conexão com o servidor
Port 8090
# Endereços válido para o servidor
BindAddress 0.0.0.0
# Número máximo de clientes conectados
MaxClients 1000
# Banda máxima a ser consumida pelos cliente em kbits/sec
MaxBandwidth 1000
# Apague esta linha se desejar iniciar o ffserver como um daemon
NoDaemon
##############################################
# Definições de atributos do arquivo de transmissão do vídeo vivo
<Feed feed1.ffm>
# Definição do nome do arquivo, localização e tamanho
File /tmp/feed1.ffm
FileMaxSize 200K
# Apenas a conexão localhost é aceita
ACL allow 127.0.0.1
</Feed>
##############################################
# Agora vamos definir o tipo, codec e outros parâmetros
<Stream test1.mpg>
# Definição da chamada
Feed feed1.ffm
# Formato do vídeo
Format mpeg
# Taxa de transmissão de audio
AudioBitRate 32
# Propriedade do canal de audio : 1 = mono, 2 = stereo
AudioChannels 1
# Freqüência do audio
AudioSampleRate 44100
# Taxa de transmissão do vídeo
VideoBitRate 64
# Taxa de tamanho do Buffer
VideoBufferSize 40
# Number of frames per second
VideoFrameRate 3
# Resolução do vídeo
VideoSize 160x128
# Parâmetro para sincronização na transmissão do vídeo
VideoGopSize 12
# Desliga o audio
NoAudio
# Desliga o video
#NoVideo
</Stream>
|
Abaixo alguns exemplos de configuração para os padrões de transmissão:
|
# Single quadro JPEG
<Stream test.jpg>
Feed feed1.ffm
Format jpeg
VideoFrameRate 2
VideoIntraOnly
VideoSize 352x240
NoAudio
</Stream>
|
|
# Em Flash
<Stream test.swf>
Feed feed1.ffm
Format swf
VideoFrameRate 2
VideoIntraOnly
NoAudio
</Stream>
|
|
# ASF compatível com Windows
<Stream test.asf>
Feed feed1.ffm
Format asf
VideoFrameRate 15
VideoSize 352x240
VideoBitRate 256
VideoBufferSize 40
VideoGopSize 30
AudioBitRate 64
StartSendOnKey
</Stream>
|
|
# MP3 audio
<Stream test.mp3>
Feed feed1.ffm
Format mp2
AudioCodec mp3
AudioBitRate 64
AudioChannels 1
AudioSampleRate 44100
NoVideo
</Stream>
|
|
# Real audio (apenas para 32 kbits de audio)
<Stream test.ra>
Feed feed1.ffm
Format rm
AudioBitRate 32
NoVideo
NoAudio
</Stream>
|
|
# Real Video
<Stream test.rm>
Feed feed1.ffm
Format rm
AudioBitRate 32
VideoBitRate 128
VideoFrameRate 25
VideoGopSize 25
NoAudio
</Stream>
|
|
# MPEG1 VCD compatible (media qualidade)
<Stream test.mpg>
Feed feed1.ffm
Format mpeg
VideoFrameRate 15
VideoSize 320x240
VideoBitRate 800
VideoGopSize 30
AudioChannels 2
AudioSampleRate 44100
AudioBitRate 128
AudioCodec mp3
StartSendOnKey
</Stream>
|
|
# DivX - AVI (baixa qualidade)
<Stream test.avi>
Feed feed1.ffm
Format avi
VideoCodec mpeg4
VideoFrameRate 10
VideoSize 320x240
VideoGopSize 20
AudioChannels 2
AudioSampleRate 44100
AudioBitRate 128
AudioCodec mp3
StartSendOnKey
</Stream>
|
|
# DivX - AVI (alta qualidade)
<Stream test.avi>
Feed feed1.ffm
Format avi
VideoCodec mpeg4 ## odivx divx4
VideoFrameRate 25
VideoSize 320x240
VideoBitRate 300
VideoGopSize 30
AudioChannels 2
AudioSampleRate 44100
AudioBitRate 128
AudioCodec mp3
StartSendOnKey
</Stream>
|
No link abaixo você encontra um modelo para transmitir no padrão MPEG1:
|
Port 8090
BindAddress 0.0.0.0
MaxClients 3
MaxBandwidth 1000
CustomLog -
NoDaemon
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 200K
ACL allow 127.0.0.1
</Feed>
<Stream test.mpg>
Feed feed1.ffm
Format mpeg
VideoFrameRate 3
VideoSize 160x128
VideoBitRate 256
VideoGopSize 12
NoAudio
</Stream>
|
|
Executando o pacote como um daemon
Para executar o ffserver como um daemon, em primeiro lugar remova a linha "NoDaemon" no arquivo ffserver.conf.
Crie um arquivo com o nome ffserverd em /etc/rc.d/init.d/ com o conteúdo logo abaixo. Use o comando "chkconfig -add" para adicionar o seu script do daemon.
|
#!/bin/sh
#
# ffserverservidor http multimedia streaming para live broadcasts
#
# chkconfig: 35 98 98
# description:video streaming
#
# processname: ffserver
# pidfile: /var/run/ffserver.pid
# config: /etc/ffserver.conf
. /etc/rc.d/init.d/functions
prog=ffserver
FFSERVER=/usr/local/bin/ffserver
CONFFILE=/etc/ffserver.conf
case "$1" in
start)
echo -n "Starting ffserver: "
touch /var/lock/subsys/ffserver
daemon $FFSERVER -f $CONFFILE
echo
;;
stop)
echo -n "Shutting down ffserver: "
killproc ffmpeg
killproc ffserver
echo
rm -f /var/lock/subsys/ffserver
;;
restart)
$0 stop
$0 start
;;
status)
status ffserver
;;
*)
echo "Uso: ffserver {start|stop|restart|status}"
exit 1
esac
exit 0
|
Em http://www.onlinetractorparts.com.au/rohbags/ffmpeg/ podemos encontrar um bom modelo de script de inicialização para daemons (tanto para ffserver como ffmpeg).
|
|
Colocando no ar o servidor de vídeo
Chega de blá-blá-blá. Para colocar em funcionamento a transmissão de vídeo, execute o
comando ffserver para capturar o vídeo e o ffmpeg para disponibilizá-lo
via protocolo HTTP como no exemplo abaixo:
Iniciando o ffserver
$ ffserver -f /etc/ffserver.conf
ffserver started.
127.0.0.1 - - [Wed Jun 1 19:15:35 2005] "GET /feed1.ffm HTTP/1.0" 20 0 8245
127.0.0.1 - - [Wed Jun 1 19:16:51 2005] "GET /test.rm HTTP/1.0" 200 284900
127.0.0.1 - - [Wed Jun 1 19:16:56 2005] "POST /feed1.ffm HTTP/1.0" 200 282624
Iniciando o ffmpeg
$ ffmpeg http://localhost:8090/feed1.ffm
Input #0, video4linux, from "":
Duration: N/A, bitrate: N/A
Stream #0.0: Video: rawvideo, yuv420p, 160x128, 25.00 fps
Output #0, ffm, to "http://localhost:8090/feed1.ffm":
Stream #0.0: Video: rv10, 160x128, 25.00 fps, q=3-31, 128 kb/s
Stream mapping:
Stream #0.0 -< #0.0
Press [q] to stop encoding
frame= 1992 q=3.0 size= 272kB time=79.7 bitrate= 28.0kbits/s
Pronto!!! Agora podemos visualizar o vídeo com qualquer player. Em nosso exemplo, podemos visualizá-lo com o ffplay:
$ ffplay http://201.27.36.89:8090/test.rm -x 160 -y 120
Assista o vídeo exemplo (utilizando o padrão Real-Vídeo) no link abaixo:
Use a força, seja livre. USE LINUX!!!
|
|