Conversion de videos a HTML5 en Debian Wheezy

Estamos actualmente inmersos en un proyecto web consistente en la migración del actual motor al gestor de contenidos TYPO3. Se trata de una web con una importante carga de vídeos (unos 5 GB), los cuales están codificados como DivX, con la consiguiente complicación a la hora de asegurarse de que se visualizan correctamente en todas las plataformas de navegación actuales. Dado que existen algunas en las que esto ya no es posible (sobre todo en tablets y smartphones), la solución que planteamos era tirar de estándar y convertir toda la base audiovisual a HTML5, lo cual no es la panacea como comentaré más adelante, pero que al menos nos asegura que los vídeos podrán visualizarse adecuadamente de aquí a unos años.

Como estamos hablando de más de 150 vídeos, es evidente que la conversión no se podía hacer a mano, así que buscando por Google me encontré en un blog con una solución que podía automatizar el proceso, basada en la herramienta de línea de comandos ffmpeg, una verdadera navaja suiza para la codificación y conversión de material audiovisual.

Se trata de un script para Linux que toma como parámetro de entrada el vídeo a convertir y que produce como salida tres versiones del vídeo (una por cada codec soportado por la etiqueta video), una captura de pantalla en JPG para el parámetro poster y un pequeño código HTML para visualizarlo todo (que en TYPO3 no es necesario pero que no viene mal para otras situaciones). Sin embargo, el script no funcionaba bien del todo por varios motivos: algunos parámetros de invocación de ffmpeg estaban obsoletos, la visualización de los vídeos en las plataforma móviles de Apple no es correcta (como bien apuntaban en los comentarios del blog) y la generación del HTML para la visualización no funcionaba. Así que me puse manos a la obra y resolví los tres problemas (del segundo ya tenía la solución en los comentarios, como ya he dicho), obteniendo este script:

{code type=php}
#!/bin/bash

if [[ $1 ]]
then
filename=$(basename «$1»)
filename=${filename%.*}
directory=$(dirname «$1»)

duration=$(ffmpeg -i «$1» 2>&1 | grep Duration | awk ‘{print $2}’ | tr -d ,)
minutes=${duration%:*}
hours=${minutes%:*}
minutes=${minutes##*:}
seconds=${duration##*:}
seconds=${seconds%.*}

hours=$((hours*3600))
minutes=$((minutes*60))

total=$(expr $hours + $minutes + $seconds)
number=$RANDOM
let «number %= $total»

echo «Generating thumbnail»
ffmpeg -i «$1» -filter:v yadif -an -ss $number -t 00:00:01 -r 1 -y -vcodec mjpeg -f mjpeg «$directory/$filename.jpg» 2>&1
echo «Converting $filename to ogv»
ffmpeg -i «$1» -acodec libvorbis -ac 2 -ab 96k -ar 44100 -b:v 345k «$directory/$filename.ogv»
echo «Finished ogv»

echo «Converting $filename to webm»
ffmpeg -i «$1» -acodec libvorbis -ac 2 -ab 96k -ar 44100 -b:v 345k «$directory/$filename.webm»
echo «Finished webm»

echo «Converting $filename to h264»
ffmpeg -i «$1» -acodec aac -ab 160000 -vcodec libx264 -vpre ipod640 -b:v 345k -threads 0 -pix_fmt yuv420p -f mp4 -strict -2 «$directory/$filename.mp4»
echo «Finished h264»

echo «Writing HTML…»

echo «


» >> «$directory/$filename.html»

echo «All Done!»
else
echo «Usage: [filename]»
fi

{/code}

Basta con copiarlo y guardarlo en un fichero al que daremos un nombre descriptivo (por ejemplo, convertHTML5) y que deberemos almacenar en una ruta dentro de nuestro camino de ejecución. Personalmente, sugiero /usr/local/bin en base a las recomendaciones del estándar Linux para los sistemas de ficheros. Antes de proceder a su ejecución, debemos asegurarnos de que el script tiene los permisos adecuados:

# chmod 755 /usr/local/bin/convertHTML5

Igualmente, debemos asegurarnos de que las herramientas de apoyo que el script necesita están instaladas en nuestro sistema. En el caso de Debian, necesitamos al menos tener instalada Wheezy para asegurarnos de que las versiones de dichas herramientas son lo suficientemente actuales para que hagan su trabajo adecuadamente. Para ello además deberemos incluir el repositorio Debian Multimedia en nuestra lista en /etc/apt/sources.list:

deb http://oktan.ls.fi.upm.es/debian-multimedia/ wheezy main non-free

Tras actualizar la base de datos de paquetes:

# apt-get update

procedemos a instalar los paquetes necesarios:

# apt-get install ffmpeg x264 yasm lame libvpx1

Ya podemos proceder a convertir automáticamente todos nuestros vídeos, para lo cual lanzaremos un pequeño bucle:

# for i in *.{avi,AVI}; do convertHTML5 $i; done

Si tenemos vídeos en otros formatos diferentes a DivX, como WMV, MPG o MOV, basta con que añadamos sus extensiones a la lista dentro de las llaves en el bucle. ffmpeg es lo suficientemente inteligente para detectar el formato de entrada y actuar en consecuencia.

Como decía más arriba, este script da como salida tres versiones del vídeo original, uno en cada uno de los formatos (MP4, WEBM, OGV) que soporta la etiqueta video de HTML5. El motivo es que la conocida guerra de codecs se saldó con que cada navegador y plataforma soporta un formato diferente, lo que obliga a mantener una versión de cada uno para que todos los usuarios puedan disfrutar del material audiovisual sin importar cómo se conectan al sitio web. Lo único que ha provocado esta falta de entendimiento es que los desarrolladores tenemos que sufrir esta pesadilla y al menos duplicar el espacio dedicado a los audios y vídeos que queramos servir a través de HTML5. Entiendo que es muy positivo sustituir a Flash de una vez por todas, pero no a cualquier precio. De ahí mi comentario inicial de que esta solución no es precisamente una panacea.

En cualquier caso, este script nos está siendo de gran utilidad y por eso lo compartimos, esperando que también sea útil a nuestros lectores. Espero vuestros comentarios y posibles mejoras que se os puedan ocurrir.

1 comentario en “Conversion de videos a HTML5 en Debian Wheezy

  1. Pingback: Video.js, reproductor de video HTML5 de licencia libre | El blog de Activa Sistemas

Los comentarios están cerrados.