20100523

Cómo compilar ffmpeg con soporte para WebM

Tras el revuelo levantado con Google y su anuncio de WebM, el proyecto de contenedor y codec libre de derechos para publicar en web, me doy cuenta de que, por el momento, no hay disponible software para Mac OS X que permita crear vídeos en este formato.
Sin embargo, sí que está disponible el código fuente y los parches necesarios para compilar tu propia versión, y compruebo que hay los parches necesarios para añadirlo a ffmpeg y MPlayer (y por tanto también su parte de codificación - MEncoder).
Aunque me gusta más MEncoder como software para crear vídeos, ya he vivido antes la experiencia de tener que compilar  MPlayer y es bastante más elaborada (debido a las dependencias) que ffmpeg. Por otro lado, aunque ya hay guías, por ejemplo, sobre cómo cocinarlo en Windows, no he podido encontrar ningún sitio donde alguien haya publicado cómo hacerlo en un Mac. Por lo tanto, he dedicado un rato esta tarde a intentarlo, y aquí están los resultados.
En principio todo esto lo he hecho para, además de ir probando a publicar vídeos con el nuevo formato, comparar los resultados con H.264. Es por eso que algunas de las dependencias y pasos que indico no tendrían que ser necesarios si sólo quieres preparar vídeos con WebM.



Objetivo
Disponer de una versión compilada de ffmpeg que permita crear vídeos WebM y MP4 (con H.264 para el vídeo y AAC para el audio) de forma que se pueda usar con HTML5 e incluso añadir soporte para reproducción en Flash si este no funciona. Además, la idea es que dicha versión de ffmpeg tenga enlazada estáticamente la mayor cantidad posible de librerías, para poder transportarla fácilmente a un ordenador que no tenga instalado el entorno de desarrollo ni todas las dependencias necesarias.


Requerimientos previos
Por suerte, ya tengo instaladas en el ordenador algunas de las librerías que necesito, usando MacPorts. Son las siguientes:
bzip2
dirac
faac
faad2
lame
libmatroska
libogg
libtheora
libvorbis
x264
XviD
zlib

Una de las formas más sencillas de conseguir prácticamente todas consiste en instalar la variante de ffmpeg que provee MacPorts, con un comando como el siguiente (siendo usuario administrador):
$ sudo port install ffmpeg
o bien usando Porticus.

Una vez tengamos preparadas las principales librerías, nos bajamos desde la web del proyecto WebM los parches para ffmpeg. Concretamente, yo he usado la versión r2. Descomprimimos el archivo para tenerlo disponible más adelante.

También necesitaremos el código fuente de las librerías del codec VP8 y el contenedor WebM. Esto se ha de hacer usando git.
$ git clone git://review.webmproject.org/libvpx.git

Aunque yo he utilizado la versión de línea de comandos (instalada con MacPorts) existe la posibilidad de usar otras versiones, algunas con interfaz gráfica y todo.

Finalmente, será necesario obtener la versión correcta del código fuente de ffmpeg. Esto se puede hacer con SVN:
$ svn checkout -r 23190 svn://svn.ffmpeg.org/ffmpeg/ ffmpeg

El resultado de todo esto (yo he procurado ponerlo en el mismo directorio) sería el siguiente:

Con todo preparado, empezamos.


Configuración
En primer lugar, parcheamos el código fuente de ffmpeg para añadir VP8 y WebM:
$ cd ffmpeg/
$ cd trunk/
  
$ patch -p0 < ../../mplayer-vp8-encdec-support/allcodecs-register_VP8.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/allformats-add_webm.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/avcodec-AVCodecContext_add_VP8_specifics.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/avformat-minor_version_bump.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/avcodec-VP8_CODEC_ID.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/avcodec-minor_version_bump.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/libavcodec-build_VP8.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/libavcodec-new_options.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/libavformat-build_webm.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/libvpxdec.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/libvpxenc.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/matroska-add_V_VP8.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/matroskadec-add_webm.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/matroskaenc-add_webm.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/riff-VP80_fourcc.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/ffmpeg-only/configure-libvpx_test.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/ffmpeg-only/documentation-add_VP8__WEBM.diff 
$ patch -p0 < ../../mplayer-vp8-encdec-support/ffmpeg-only/ffpresets-libvpx.diff 


A continuación, compilamos las librerías de WebM y VP8:
$ cd ../..
$ cd libvpx
$. /configure --disable-examples
$ make
y copiamos los resultados en el directorio de ffmpeg:
$ mkdir -p ../ffmpeg/trunk/include
$ cp vp8/*.h ../ffmpeg/trunk/include/
$ cp vpx_codec/*.h ../ffmpeg/trunk/include/
$ cp vpx_ports/*.h ../ffmpeg/trunk/include/
$ mkdir -p ../ffmpeg/trunk/lib
$ cp libvpx.a ../ffmpeg/trunk/lib

Ahora, para evitar un error en la compilación, editamos el archivo ffmpeg/trunk/libavcodec/libvpxenc.c y cambiamos  IMG_FMT_I420 por VPX_IMG_FMT_I420.

Configuramos ffmpeg:
$ cd ../ffmpeg/trunk/

$ ./configure --prefix=/opt/local --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libvpx-vp8 --enable-libvorbis --enable-libx264 --enable-libtheora --enable-libfaac --enable-runtime-cpudetect --disable-network --disable-devices --extra-cflags="-I/opt/local/include -I./include" --extra-ldflags="-L/opt/local/lib -L./lib"
Notar cómo se indica que debe buscar archivos de cabecera y librerías, además de en los directorios por defecto, en /opt/local, que es donde MacPorts guarda los archivos. Esto debería modificarse si las librerías necesarias estuvieran en otro lugar.

Finalmente, si queremos enlazar estáticamente la mayor cantidad de librerías, tenemos que editar el archivo ffmpeg/trunk/config.mak sustituyendo

EXTRALIBS=  -lz -lbz2 -lm -lfaac -ltheoraenc -ltheoradec -logg -lvorbisenc -lvorbis -logg -lvpx -lvpx -lx264 -lm
por 
EXTRALIBS= /opt/local/lib/libz.a /opt/local/lib/libbz2.a /opt/local/lib/libfaac.a /opt/local/lib/libtheoraenc.a /opt/local/lib/libtheoradec.a /opt/local/lib/libvorbisenc.a /opt/local/lib/libvorbis.a /opt/local/lib/libogg.a ./lib/libvpx.a /opt/local/lib/libx264.a -lm
Notar de nuevo que, si las librerías están en un directorio distinto de opt/local, se debería poner ese.


Compilación
Este es, si todo ha salido bien, el paso más fácil:
$ make

Si no surge ningún problema, al cabo de un rato tendremos, en el directorio ../ffmpeg/trunk/ tanto el archivo ejecutable  ffmpeg (para codificar los vídeos) como el reproductor ffplay. (para poder verlos).

Podemos comprobar (en el caso de que lo hayamos configurado así) que los archivos tienen enlazadas de manera estática todas las dependencias posibles, usando el comando
$ otool -L ffmpeg 
que debería mostrar un resultado como
ffmpeg:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)

También podemos copiar en /opt/local/share/ffmpeg los archivos de preajustes de ffmpeg para VP8:
$ sudo cp ffpresets/libvpx_vp8* /opt/local/share/ffmpeg/


Conclusión
Si se han seguido todos los pasos (salvo por el detalle de los archivos de preajustes), tendremos unos ejecutables de ffmpeg y ffplay con los que poder convertir desde otros formatos archivos de vídeo a MP4(H.264/AAC) y WebM(VP8/Vorbis), con comandos parecidos a estos:
$ ffmpeg -i origen -acodec vorbis  -ac 2 -vcodec libvpx_vp8 destino.webm
$ ffmpeg -i origen -acodec aac -ac 2 -vcodec libx264 destino.mp4


Es posible que en otra entrada (cuando lo tenga funcionando), explique cómo preparar una página web para usarlos.

No hay comentarios:

Publicar un comentario en la entrada