quarta-feira, 26 de maio de 2010

Compilar o ffmpeg com codec VP8

Nota: 16/06/2010 A nova versão do FFmpeg (0.6) já tem suporte a VP8. Já não é necessário usar este script para aplicar o patch.

Como já sabem, o Google liberou o codec VP8.
Eu fiz o dowload do código fonte do codec e apliquei o patch para o ffmpeg que está no site do WebM. O libvpx compilou... mas o "make install" não instalou os executáveis e "lib's", nas pastas do sistema. Tive de copiar os "executáveis" do libvpx para a raiz do sistema. Para contornar este problema criei um pacote deb "manualmente". (O checkinstall também dá erro.)

Por isso fiz um script para ser mais fácil o processo de instalação do ffmpeg no Ubuntu (9.10 ou 10.09) com suporte a x264 e libvpx_vp8.

Algumas considerações:
  • O script usa versões "snapshot" do ffmpeg x264 e libvpx_vp8, para reduzir a possibilidade de ocorrem incompatibilidades e erros.
  • Se o seu processador for de 64bit, o script optimiza o comando "./configure".
  • Só testei o script no Ubuntu 9.10 mas deve funcionar sem problemas no Ubuntu 10.04. A única diferença é o "pacote" libxvidcore4-dev que mudou de nome para libxvidcore-dev no Ubuntu 10.04.
  • Este script é provisório, é apenas para instalar o libvpx nesta fase de integração com o ffmpeg. Futuramente não será necessário aplicar "patches" no ffmpeg.
  • Utilize o script por sua própria conta e risco. Recomendo a sua utilização num VM ou através do liveCD.



#!/bin/bash
#tuxmind.blogspot.com
#Licença:
#http://creativecommons.org/licenses/by-nc-sa/3.0/
##########################################################
#Recompilar ffmpeg (vp8 x264) Ubuntu 10.04 / 9.10.
##########################################################


rec_ffmpeg() {

erro() {
echo "ERRO. Não foi possível aceder ao servidor. Tente mais tarde."
exit
}

cd ~

if [ -e recomp_ffmpeg ]
then
echo "recomp_ffmpeg já existe"
else
mkdir recomp_ffmpeg
fi
cd recomp_ffmpeg

#adicionar repositorios e pacotes necessários
dependencias() {
VERSAO=`cat /etc/lsb-release | grep DISTRIB_RELEASE | cut -d= -f 2`
case $VERSAO in
9.10 ) LIBXVIDCORE_DEV="libxvidcore4-dev" ;;
10.04 ) LIBXVIDCORE_DEV="libxvidcore-dev" ;;
*) echo "ERRO! O script só funciona no Ubuntu, nas versões 9.10 e 10.04"; exit ;;
esac
#adicionando repositorios universe multiverse
sudo software-properties-gtk -e universe
sudo software-properties-gtk -e multiverse
sudo apt-get update

#purge libvpx :P
sudo apt-get purge -y ffmpeg x264 libx264-dev libvpx
sudo apt-get update
#Nome do pacote alterado no ubuntu 10.04 é "libxvidcore-dev", ubuntu 9.10 era "libxvidcore4-dev"
sudo apt-get install -y build-essential subversion checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libtheora-dev $LIBXVIDCORE_DEV libsdl1.2-dev libvorbis-dev libopencore-amrwb-dev libopencore-amrnb-dev git-core libx11-dev libxfixes-dev zlib1g-dev || erro
echo "dependencias-ok" > dep.log
}

if [ -e dep.log ]
then
echo "dependencias-ok"
else
dependencias
fi

#x264
if [ -e x264-snapshot-20100524-2245.tar.bz2 ]
then
echo "x264-ok"
else


#git clone git://git.videolan.org/x264.git
wget -t 10 -w 20 ftp://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20100524-2245.tar.bz2 || erro
tar xjf x264-snapshot-20100524-2245.tar.bz2
mv x264-snapshot-20100524-2245 x264
cd x264

#./configure
#64bit ou 32bit?
if [ `uname -m` == x86_64 ]
then
./configure --enable-pic
else
./configure
fi

#./configure --enable-pic
make
sudo checkinstall --fstrans=no --install=yes --pkgname=x264 --pkgversion "2:0.96.1602+git69588a7" --default

cd ..
fi


#libvpx
if [ -e libvpx-0.9.0.tar.bz2 ]
then
echo "libvpx-0.9.0-ok"
else


#VP8 Google :)
#a versão no git nem sempre é estável :P
#git clone git://review.webmproject.org/libvpx.git
wget -t 10 -w 20 http://webm.googlecode.com/files/libvpx-0.9.0.tar.bz2 || erro
tar xjf libvpx-0.9.0.tar.bz2
cd libvpx-0.9.0

#./configure
#64bit ou 32bit?
if [ `uname -m` == x86_64 ]
then
./configure --disable-install-docs --target=x86_64-linux-gcc --enable-pic --enable-vp8
#./configure --disable-install-docs --target=x86_64-linux-gcc --enable-pic --enable-install-bins=/usr/local/bin --enable-install-libs=/usr/local/lib --enable-install-srcs=/usr/local/src -enable-VP8
#DEBIAN/control
ARQ="amd64"
VPX="vpx-vp8-nodocs-x86_64-linux-v0.9.0/*"
else
./configure --disable-install-docs --target=x86-linux-gcc --enable-vp8
#DEBIAN/control
ARQ="i386"
VPX="vpx-vp8-nodocs-x86-linux-v0.9.0/*"
fi

make install
#criar deb, porque o parametro "install" não instalou o libvpx. bug no makefile? :P
mkdir -p PACKAGE/{usr/local,}
cp -r $VPX PACKAGE/usr/local/
#libvpx-src :P
#rm -rf PACKAGE/usr/local/build/
#rm -rf PACKAGE/usr/local/src/
rm -rf PACKAGE/usr/local/md5sums.txt
mkdir PACKAGE/DEBIAN

cat > PACKAGE/DEBIAN/control << EOF
Package: libvpx
Priority: extra
Maintainer: tuxmind.blogspot.com
Architecture: $ARQ
Version: 0.9.0
Depends:
Provides: libvpx
Description: codecVP8
EOF

sudo dpkg-deb -b PACKAGE/ libvpx-ubuntu.deb
sudo dpkg -i libvpx-ubuntu.deb

cd ..
fi


svn_ffmpeg() {

#svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
svn checkout -r 23165 svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg || erro

}

if [ -e ffmpeg ]
then
echo "ffmpeg-ok"
else
svn_ffmpeg
fi

#Patch ffmpeg
if [ -e mplayer-vp8-encdec-support-r2.tar.bz2 ]
then
echo "ffmpeg-patch-ok"
exit
else
wget -t 10 -w 20 http://webm.googlecode.com/files/mplayer-vp8-encdec-support-r2.tar.bz2 || erro
tar xjf mplayer-vp8-encdec-support-r2.tar.bz2
cp -r mplayer-vp8-encdec-support/*.diff ffmpeg
cp -r mplayer-vp8-encdec-support/ffmpeg-only/*.diff ffmpeg
cd ffmpeg
for patchs in *.diff; do patch -p0 < $patchs ;done
echo "Patch ok"
fi

#./configure
#64bit ou 32bit?
if [ `uname -m` == x86_64 ]
then
./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-libxvid --enable-avfilter --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvorbis --enable-x11grab --enable-version3 --enable-libvpx-vp8 --arch=x86_64
else
./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-libxvid --enable-avfilter --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvorbis --enable-x11grab --enable-version3 --enable-libvpx-vp8
fi

make
sudo checkinstall --fstrans=no --install=yes --pkgname=ffmpeg --pkgversion "4:SVN-r23165" --default

}

##########################################################
#INICIAR SCRIPT
##########################################################

rec_ffmpeg xargs sudo
echo "O script terminou :P"
exit



Importante: Para ter a certeza que o script "chegou ao fim" aguarde pela mensagem: "O script terminou :P".

Depois de instalar faça um teste:

ffmpeg -i entrada.mp4 -sameq -vcodec libvpx_vp8 -acodec libvorbis saida.webm

Para ver o resultado use o ffplay:

ffplay saida.webm

Nos testes que realizei, achei a relação qualidade/compressão muito boa. É a minha opinião pessoal. Porque não fiz uma comparação com base cientifica.
Outra coisa que notei é que o "encoder" é muito lento. Talvez a integração com o ffmpeg, ainda não esteja perfeita.

Sugestões são bem vindas. Também gostaria de saber se posso fazer alguma coisa para melhorar o desempenho do libvpx no ffmpeg, ou se estou a esquecer de alguma coisa.

EDIT: Já fiz um teste no Ubuntu 10.04 versão i386, e funcionou.

Nenhum comentário :