Convertir videos a formatos compatibles con HTML5

Muchas veces me he encontrado en la situación de necesitar colocar un video en un sitio web y no contar con el mismo en un formato adecuado. Afortunadamente en cualquier distro GNU/Linux contamos con la navaja Suiza de la multimedia, ffmpeg.

En este artículo de MDN encontramos una revisión muy completa sobre este tema y cuáles son los contenedores compatibles con HTML5, se reducen a 3. El formato MP4, que aunque propietario es el más difundido y soportado; el WEBM, completamente libre menos conocido; y el OGG también libre pero menos utilizado.

Sobre el contenedor MP4, tampoco es cualquiera, tiene que tener los streams en códecs específicos. El vídeo debe estar en H.264 baseline profile ya que le exige menos capacidad de procesamiento a la máquina del usuario. Un vídeo en H.264 High profile probablemente también podrá ser visualizado, pero en un dispositivo con baja capacidad de procesamiento, un teléfono de gama baja o incluso una laptop con un procesador atom por ejemplo podrán empezar a visualizarlo y luego de algunos minutos no podrán continuar la reproducción del vídeo o se ralentizará el dispositivo. El audio debe estar en formato AAC. También alguno navegadores soportan que el audio este en MP3, pero no son todos.

En esta tabla se resume los formatos de video compatibles con HTML5.

Contenedor (video codec / audio codec)ChromeFirefox (Gecko)Internet ExplorerOperaSafari
WebM (VP8 / vorbis)6.04.09.010.63.1
WebM (VP9 / theora)29.028.0??
OGG (Theora / vorbis)3.5Sin soporte10.50Sin soporte
MP4 (H.264 / AAC)9.0
MP4 (H.264 / MP3)9.03.1

Para convertir un vídeo a MP4 con H.264 baseline tomando como base un MP4 con video H.264 en otro perfil y optimizado para reproducir vía web.

1
$ ffmpeg -i input-mp4-highprofile.mp4 -movflags faststart -vcodec libx264 -vprofile baseline -crf 18 -acodec copy output-mp4-baselineprofile.mp4

Para convertir un video a WEBM tomando como base un video MP4 (aunque puede ser cualquier tipo).

1
$ ffmpeg -i input.mp4 -vcodec libvpx -crf 10 -b:v 0 -acodec libvorbis -threads 4 output.webm

La velocidad de encoding es extremadamente lenta, entre 8-10 frames por segundo.

VirtualBox en modo headless

Es altamente común que se utilicen máquinas virtuales para el desarrollo de software, regularmente uso VirtualBox desde el entorno gráfico en Arch Linux para hacer estas cosas, pero muchas veces solo necesito que este corriendo una distro con ciertos servicios sin necesidad de usar entorno gráfico alguno y aquí es donde entra el modo headless. Para esto tenemos la aplicación VBoxManage.

1
2
3
4
5
6
7
8
9
10
11
# Listar máquinas virtuales
$ VBoxManage list vms
"experiment-1" {fdb95c20-45c8-4811-8ee6-3fabdd5bd969}
"mysql" {31355c2b-ec28-4392-929e-094b288aa002}
"mongodb" {4934f61c-b007-44b0-b730-a450e885a616}

# Arrancar máquina virtual en modo headless
$ VBoxManage startvm experiment-1 --type headless

# Apagar máquina virtual
$ VBoxManage controlvm experiment-1 poweroff