sábado 28 de enero de 2012

Convertir Videos para Celulares con FFMPEG

Que tal si puedieras ver peliculas en tu celular ahora que tenes 4GB u 8GB de memoria? Quiza en un viaje, o quiza como yo para que tus hijos vean un dibujo animado y se entretengan un rato mientras esperan por algo... Las pantallas de celulares cada vez mas grandes, las amplias memorias internas o expandibles y la posibilidad de escuchar con auriculares sin molestar a nadie hacen que ver videos, peliculas o documentales en tu celular sea cada vez mas comodo.



Lamentablemente me encontre con que los formatos que reproducen los celulares no siempre son los que presentan los videos que tenemos en la PC, desde codecs no soportados hasta tamaños demasiado grandes para las pantallas. De todas maneras, si encontraramos ese video que copiado dentro del celular se reproduzca sin problemas, seguramente no tenga las dimensiones adecuadas y no lodamos ver en modo de "pantalla completa" aprovechando asi la pequeña pantalla al máximo.

Afortunadamente en Ubuntu/Linux podemos hacer uso de FFMPEG que es un programa para manipular videos. Con el mismo podemos agrandar, estirar, y hacer lo que queramos con nuestro video y asi ajustarlo y optimizarlo par la visualizacion en nuestro celular.

Instalacion de FFMPEG (Ubuntu 10.10, 11.04 y 11.10)


Para instalar el último FFMPEG en Ubuntu 10.04 seguir este thread de Ubuntu Forums: HOWTO: Install and use the latest FFmpeg and x264. Para instalar la ultima version de FFMPEG (no la version que viene en los repositorios de Ubuntu) seguimos estso pasos

Quitamos la version oficial de repositorios Ubuntu ya que por cuestiones de licencia no tenemos la libreria libfaac.

>> sudo apt-get remove ffmpeg x264 libx264-dev

Instalamos dependencias

>> sudo apt-get update
>> sudo apt-get install build-essential checkinstall git libfaac-dev libjack-jackd2-dev \
      libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev \
      libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev texi2html yasm zlib1g-dev

Instalamos x264

>> cd
>> git clone git://git.videolan.org/x264
>> cd x264
>> ./configure --enable-static
>> make
>> sudo checkinstall --pkgname=x264 --pkgversion="3:$(./version.sh | \
        awk -F'[" ]' '/POINT/{print $4"+git"$5}')" --backup=no --deldoc=yes \
        --fstrans=no --default

Instalamos FFMPEG

>> cd
>> git clone --depth 1 git://source.ffmpeg.org/ffmpeg
>> cd ffmpeg
>> ./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb \
  --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 \
  --enable-nonfree --enable-postproc --enable-version3 --enable-x11grab
>> make
>> sudo checkinstall --pkgname=ffmpeg --pkgversion="5:$(date +%Y%m%d%H%M)-git" --backup=no \
  --deldoc=yes --fstrans=no --default
>> hash x264 ffmpeg ffplay ffprobe

Listo! Ahora a convertir videos para nuestro celular

Teniendo el video que queremos convertir, lo primero es ver si la relación de aspecto del video (o sea el alto y ancho) guardan la misma proporcion que la pantalla de nustro movil. A simple vista podemos ver si el video es demasiado ancho (en ese caso sobra de costado) o es demasiado alto (en ese caso sobra de arriba y abajo). Para optimizar el video a nuestra pantalla sin alterar las proporciones del mismo debemos calcular cuantos pixeles debemos cortar, ya sea de arriba o de los costados.

si sobra de costado

sobrante = (ancho.video − (alto.video x ancho.pantalla/alto.pantalla))/2

si sobra de arriba

sobrante = (alto.video − (ancho.video x alto.pantalla/ancho.pantalla))/2

Ejemplo

Celular Samsung GT S5230 (pantalla 400 x 240 pixeles)
Video Trailer HD (dimensiones 1280 x 720 pixeles)

Con este ejemplo podemos ver de que estamos hablando. Claramente el video del trailer HD es demasiado grande para reproducirse en ese celular, pero primero debemos calcular de donde debemos recortar el video para que mantenga las proporciones adecuadas y llene la pantalla.

sobrante = (1280 − (720 x 400/240))/2
sobrante = 40 px

lo que quiere decir que en realidad el video recortado a 1280 x 640 es el que tiene las proporciones correctas para nuestra pantalla. Ahora lo que restaria es redimensionarlo a 400x240 pixeles. Si al hacer la cuenta nos da 0 quiere decir que el video ya tiene las proporciones adecuadas de nuestra pantalla y si da negativo es porque en realidad el video sobra de los costados y no de arriba y abajo, y hay que rehacer el calculo con la otra ecuacion. Una cosa engañosa del Samsung GT S5230 es que el tamaño maximo de video soportado es 320x240, pero el mismo puede visualizarse en "pantalla completa" en 400x240... lo que resultra en el video estirado hacia los costados. Eso lo solucionamos con la opcion -vf "crop=1280:640:0:40,scale=320:240", que simplemente lo recorta a una proporcion de 400x240 y luego lo redimensiona a 320x240 por lo cual el video queda como estirado hacia arriba o comprimido de los costados... pero con la opcion -aspect 16:9 cuando lo visualizamos en pantalla completa el efecto se compensa y el video tiene las proporciones reales. El parametro de aspecto no es necesario en la mayoria de los celulares, en tal caso no se pone y listo.


Pasada #1 del Encoder

Otra cosa importante es hacer por lo menos 2 pasadas de encoder, asi mejoraremos la calidad del video. En la pasada 1 se debe generar un archivo de estadisticas del propio video (opcion -vstats) que luego el encoder utilizara en una eventual pasada 2 para comprimir adecuadamente los frames y evitar los famosos cuadraditos o artefactos en momentos donde las condiciones del video varian muy drasticamente, por ejemplo de una escena oscura a la luz o similares. La pasada 1 del encoder no es paralelizable asi que la opcion -threads es ignorada en este paso. Hay que prestar atencion a la orden de recortar ya que nuestro video es de 1280 x 720 y lo queremos recortar a 1280 x 640, o sea queremos recortar 40px de arriba y 40px de abajo, por lo tanto la orden es crop=1280:640:0:40 que significa que recortaremos 1280x640 empezando de x=0 y de y=40. Si quisieramos recortar un video 40 px de ambos lados la orden seria crop=1280:640:40:0, con esto queda clara la sintaxis.

>> ffmpeg -i video.mp4 -vcodec mpeg4 -vf "crop=1280:640:0:40,scale=320:240" -b 512k -acodec libfaac -ac 2 -ar 44100 -ab 128 -aspect 16:9 -pass 1 -threads 1 -vstats video-pass1.mp4

Pasada #2

>> ffmpeg -i video.mp4 -vcodec mpeg4 -vf "crop=1280:640:0:40,scale=320:240" -b 512k -acodec libfaac -ac 2 -ar 44100 -ab 128 -aspect 16:9 -pass 2 -threads 4 -vstats video-pass2.mp4

Aqui el video de entrada es el mismo, solo que aqui utilizara el archivo estadistico del video y pasara directamente a el pass 2 (opcion -pass 2) y aqui es donde podemos paralelizar el proceso si tenemos varios nucleos en nustro CPU (opcion -threads 2) o los que sean.

Explicacion de algunos otros parametros de FFMPEG

-b 512k         :: video bitrate (calidad de video) de 512kbps, puede ser 1024k o 1536k dependiendo del celular
-acodec libfaac :: codec para el audio AAC
-ac 2           :: cuantos canales de sonido (2 = stereo)
-ar 44100       :: frecuencia de sampleo del sonido
-ab 128         :: audio bitrate (calidad de sonido) de 128 kbps, puede ser 128, 160 o 192... más es innecesario
-aspect 16:9    :: que el archivo de salida guarde una relacion de aspecto determinada
-pass 1         :: numero de pasaje de encoder
-threads 4      :: que utilize 4 nucleos (solo aplicable al pass 2)
-vstats         :: que genere si no hay o utilize el archivo de estadisticas del video

De esta forma podemos controlar cada aspecto del video y asi optimizar la calidad del audio, video y cuidar el tamaño del archivo en el caso de videos muy largos.

Ejemplo Trailer RA.One HD convertido para Nokia N900 (pantalla de 800x400px) en varias calidades.

-b 1536k ---> 16.2 MB


-b 1024k ---> 11.0 MB


-b 512k  ---> 5.8 MB


A mirar esas pelis!

1 comentarios:

  1. Gracias por el post y los videos! Unos cuantos comandos para copiar por ahi para repetir y llenar de pelis el celular!!

    ResponderSuprimir