Conversión de vídeos para iPod en Debian

Atención porque empieza, lo que seguro será, una larga serie de tutoriales dedicados a productos de la manzanita. ¿Por qué? Arxel ya presumía de su iPod Touch y yo tengo en mis manos un iPod Classic (si es que no me lo merezco). Como nos gusta comentar y compartir aquellas cosas que vamos aprendiendo y nos resultan útiles, —y sobre todo que hayamos probado por nosotros mismos— aquí nos tendréis dándoos la vara.

Me centraré, en este post, exclusivamente en el iPod Classic, que es el que tengo. Para el iPod Nano nhttp://nand-magazine.net/2008/01/02/conversion-de-videos-para-ipod-en-debian/#comment-4877o varía. En cuanto al iPod Touch, le pediremos a Arxel que nos haga una guía 😉

Vídeo en el iPod

The IT Crowd on iPod Classic
Los modelos de iPod que reproducen vídeo (desde los de quinta generación) soportan dos códecs de vídeo: H.264 y MPEG-4 en tres tipos de contenedores (o formatos): .m4v, .mp4 y .mov. Muchos de los vídeos que nos encontramos por la red o series y películas que nos descargarmos están en .avi y comprimidos con DivX o XviD, lo que implica que tenemos que convertirlos al formato adecuado para que el iPod los pueda reproducir.

NOTA: técnicamente, el iPod soporta XviD, pero no es lo más recomendable (por calidad, sobre todo). Así que nos centraremos en los otros dos códecs de vídeo.

El formato de audio también es un tanto especial. No es el popular MP3, sino AAC (ojo, que es incluso algo mejor que el primero).

En resumen, los vídeos que vayan a ir a nuestro iPod deben cumplir las siguientes condiciones:

  • Vídeo: H.264 ó MPEG-4
  • Audio: AAC

Hay que tener en cuenta ciertas limitaciones en cuanto a audio y vídeo. Si nos pasamos, puede que el iPod no reproduzca el vídeo o el sonido:

  • Vídeo
    • H.264: hasta 768 kbps, 320×240, 30 fotogramas por segundo (fps), perfil de línea de base hasta el Nivel 1.3.
    • H.264: hasta 1.5 Mbps, 640×480, 30 fps, perfil de línea de base de baja complejidad
    • MPEG-4: hasta 2,5 Mb/s, 640×480, 30 fps, Perfil simple.
  • Audio: hasta 160 kb/s, 48000 Hz y audio estéreo

Con lo cual sería tontería codificar un vídeo a más de 30 fotogramas por segundo, con 192 kb/s de audio y a una resolución de 800×600. El iPod lo truncará a su límite. Así que está bien tener estas limitaciones en cuenta porque podemos usarlas para conseguir vídeos de tamaño mucho menor o sencillamente optimizados.

ffmpeg: el conversor

En GNU/Linux tenemos una auténtica navaja suiza. El ffmpeg nos deja hacer de todo (en lo que a vídeo se refiere). Aunque tenemos dos problemas: se usa por consola (¿esto es un problema?) y los paquetes para Debian no están compilados con soporte para AAC, XviD o H.264 [ Aviso para usuarios de Debian lenny: El paquete de ffmpeg para Debian lenny tiene habilitado este soporte, así que bastará con que instaléis el binario vía apt o aptitude ]. ¿Qué significa esto? Que no podemos usarlo —tal como viene— para convertir nuestros vídeos a “formato iPod”. ¿Entonces qué hacemos? ¿No hay más opciones? Podríamos usar el mencoder (que es del estilo de ffmpeg, pero a mí no me gusta tanto :-P) o pasarnos a otro sistema operativo (¡NOOOO!). Debo confesar que estuve haciendo pruebas de conversiones en un Windows con un programa gratuito y bastante sencillo llamado Videora, pero me desesperó, así que me volví a mi Debian y me dije: “Vamos a compilar ffmpeg”.

Compilando ffmpeg con soporte para H.264, AAC, XviD…

Espero que nadie se haya asustado al escuchar la palabra “compilar”. En realidad no es ninguna experiencia traumática. Fue más sencillo de lo que esperaba. Venga, comencemos.

Necesitamos el código fuente del ffmpeg que descargaremos vía subversion para hacernos con la última versión. (Para instalar subversion: #apt-get install subversion). Nos situamos en el directorio donde almacenaremos el código y lo descargamos tal que así: svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg. Tendremos una carpeta llamada ffmpeg con un montón de archivos y directorios.

Antes de seguir, tenemos que instalar las siguientes bibliotecas y el compilador de C:

#apt-get install liblame-dev libfaad2-dev libfaac-dev libxvidcore4-dev libvorbis-dev liba52-dev libdc1394-dev libgsm-dev libx264-dev gcc

Ahora, y dentro del directorio de ffmpeg, configuraremos el archivo configure (valga la redundancia):

./configure --enable-gpl --enable-pp --enable-libvorbis --enable-liba52 --enable-libdc1394 --enable-libgsm --disable-debug --enable-libmp3lame --enable-libfaad --enable-libfaac --enable-libxvid --enable-pthreads --enable-libx264

Ejecutamos el archivo Makefile: $make.

E instalamos: #make install.

Después de un rato, si todo ha ido bien, tendremos el binario en la carpeta /usr/local/bin (salvo que configurárais otra ruta manualmente).

Podemos hacer una prueba para comprobar si se ha compilado con soporte para los codecs que nos interesan. Así que ejecutáis ffmpeg sin parámetros y buscáis en las primeras líneas enable-biblioteca. Yo obtengo esta salida:

tempwin@debianbox:~/packages/ffmpeg$ ffmpeg
FFmpeg version SVN-r11352, Copyright (c) 2000-2007 Fabrice Bellard, et al.
  configuration: --enable-gpl --enable-pp --enable-libvorbis --enable-liba52 --enable-libdc1394 --enable-libgsm --disable-debug --enable-libmp3lame --enable-libfaad --enable-libfaac --enable-libxvid --enable-pthreads --enable-libx264
  libavutil version: 49.6.0
  libavcodec version: 51.49.0
  libavformat version: 52.3.0
  built on Dec 29 2007 22:55:01, gcc: 4.2.3 20071123 (prerelease) (Debian 4.2.2-4)
usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...
Hyper fast Audio and Video encoder

H.264 vs MPEG-4

Por si alguien lo había notado, instalamos la biblioteca libx264 y no libh264. ¿Por qué? Bueno, libh264 no existe 😛 El códec X.264 es una implementación libre de la especificación del códec H.264, por ello es la que se usa en sistemas GNU/Linux.

Lo bueno que tiene H.264 frente a MPEG-4 es que consigue vídeos de alta calidad con tamaños menores que MPEG-4. Pero tiene inconvenientes. Es bastante lento y hace un uso más intensivo de la CPU. Esto se traduce en más horas de transcodificación. Además, los parámetros que hay que pasarle a ffmpeg son muchos más pues hay que controlar más aspectos. Eso sí, se nota en el resultado. Para vídeos de resoluciones grandes (más de 640×480), es mejor MPEG-4. En los ejemplos de este post usaremos ambos. Cambiar entre uno y otro es muy sencillo, así hacéis pruebas y os quedáis con el que más os convenza.

Convirtiendo vídeos a formato iPod

Desde luego es más corto decir “formato iPod” que vídeo codificado usando H.264 ó MPEG-4 con sonido comprimido en AAC 😛

Yo uso ffmpeg con los siguientes parámetros:

MPEG-4

No lo he probado a fondo porque casi no lo uso.

ffmpeg -i video_origen.avi -f mp4 -vcodec mpeg4  -b 768kb -qmin 3 -qmax 5 -bufsize 1M -acodec libfaac -ab 96kb -s 320x240 -aspect 4:3 -title "Título del vídeo" video_resultante.mp4

Sobre la resolución (-s) y la proporción (-aspect), lee el final del post (importante).

MPEG-4 Panorámico

Cuando el vídeo original tiene un aspecto 16:9. Cambiamos la resolución (-s) a 320×192 (después de muchas pruebas, he resuelto que es la mejor para el iPod, en cuanto a vídeos panorámicos se refiere) y el aspecto (-aspect) a 16:9. A veces, indicar el aspecto no es necesario, tan sólo la resolución.

ffmpeg -i video_origen.avi -f mp4 -vcodec mpeg4  -b 768kb -qmin 3 -qmax 5 -bufsize 1M -acodec libfaac -ab 96kb -s 320x192 -aspect 16:9 -title "Título del vídeo" video_resultante.avi.mp4

H.264

Es el que suelo usar. En dos pases (tarda más, pero el resultado es muchísimo mejor).

ffmpeg -y -i video_origen.avi.avi -an -v 1 -threads auto -vcodec libx264 -b 256k -bt 175k -refs 1 -loop 1 -deblockalpha 0 -deblockbeta 0 -parti4x4 1 -partp8x8 1 -me full -subq 1 -me_range 21 -chroma 1 -slice 2 -bf 0 -level 30 -g 300 -keyint_min 30 -sc_threshold 40 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.7 -qmax 51 -qdiff 4 -i_qfactor 0.71428572 -maxrate 768k -bufsize 2M -cmp 1 -s 320x240 -aspect 4:3 -f mp4 -pass 1 /dev/null

Segunda pasada:

ffmpeg -y -i input_file.avi -v 1 -threads auto -vcodec libx264 -b 256k -bt 175k -refs 1 -loop 1 -deblockalpha 0 -deblockbeta 0 -parti4x4 1 -partp8x8 1 -me full -subq 6 -me_range 21 -chroma 1 -slice 2 -bf 0 -level 30 -g 300 -keyint_min 30 -sc_threshold 40 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.7 -qmax 51 -qdiff 4 -i_qfactor 0.71428572 -maxrate 768k -bufsize 2M -cmp 1 -s 320x240 -aspect 4:3 -acodec libfaac -ab 96k -ar 44100 -ac 2 -f mp4 -pass 2 -title "Título del vídeo" video_resultante.mp4

H.264 Panorámico

Igual que con MPEG-4: Cambiamos la resolución por 320×192 y el aspecto por 16:9

Algunas consideraciones

Es importante conocer las propiedades del vídeo original antes de hacer la conversión. Si la fuente original tiene una calidad de audio muy pobre, pocos fotogramas por segundo y un bitrate bajo, de nada va a servir que aumentemos la calidad pues como mucho tendrá la misma que el original. A lo que me refiero es a si, en el vídeo original, el audio fue grabado a 64k, es tontería pasarle, a la hora de convertirlo, 96k. Sin embargo, al revés podemos usarlo para hacer una conversión perfecta y/o más comprimida.

Podéis mejorar la calidad del sonido (-ab), así como la frecuencia de muestreo (-ar), dándole valores más elevados. En los ejemplos está puesto a 96k y se escucha muy bien. Más calidad se traduce en más tamaño, así que tenedlo en cuenta. Lo mismo podéis hacer con la calidad del vídeo (argumento -b). Os recuerdo que todo esto teniendo presente las limitaciones del vídeo original.

Si queréis optimizar vuestros vídeos para que puedan verse con buena calidad en una televisión, ajustad la resolución a 640×480 y el bitrate de media (-b) a 500k.

Proporciones de pantallaPara que los vídeos en formato panorámico se vean bien en el iPod hay que ir al menú VídeosAjustesAjustar a pantalla y desactivar esta opción, de lo contrario, el iPod trataría de ajustar el vídeo para que ocupe todo el ancho y la altura de la pantalla posible, traduciéndose en imágenes alargadas y estrechas. Echando un vistazo a la imagen de la derecha, tenéis un ejemplo de lo os digo.

Para los vídeos que tengan una resolución panorámica, pero no sigan ningún estándar (16:9, 2.39:1, 1.85:1, etc.), deberemos ajustar la altura a la medida óptima y que sea divisible por 16. A la anchura no tenemos que hacerle nada porque 320 es divisible por 16 (es decir, su resto es 0). Un ejemplo: Si el vídeo original es de 608×256, le correspondería una resolución de 320×134 (basta hacer una regla de tres), pero 134 no es divisible por 16. El valor más cercano, divisible por 16, por abajo sería 128, y por arriba 144. No son demasiados píxeles de diferencia, así que recomiendo coger el valor más alto (las bandas negras serán más finas). Ah, ¿que por qué el capricho de que tenga que ser divisible por 16? El códec comprime el vídeo bloques de 16×16 píxeles. Podrías indicarle una altura que no fuera divisible por este número, pero la compresión afectaría más a la calidad.

Según la versión de ffmpeg que tengas, para indicar el códec de vídeo y audio a usar, puede variar el nombre. En la versión que tengo yo para usar el códec AAC, lo indico con -acodec libfaac; pero he visto otra versiones en las que basta con -acodec aac. Lo mismo pasa con -vcodec libx264; hay versiones que es tan sencillo como -vcodec h264. Sabréis cuál usar si al escribirlas, os devuelve un error del tipo Unknown encoder 'aac' o Unknown enconder 'h264'.

Los valores de vídeo y audio son también válidos para el iPod Nano, pues también tiene la misma resolución de pantalla que el Classic.

Sobre las relaciones de aspecto (o proporciones), es importante conocerlas para obtener vídeos lo más fieles al original (acordaos de la divisibilidad por 16):

  • 4:3 (TV): 320×240
  • 16:9 (TV panorámica): 320×176, 320×192
  • 1.85:1 (Panorámica estándar): 320×160, 320×176
  • 2.39:1 (CinemaScope o Panavision): 320×128, 320×144

Para acabar, unos datos para que veáis los resultados:

  • Vídeo Original
    • Audio: VBR MP3, 128kbps, 48000Hz
    • Vídeo: 608×256, 25 fps, DivX 5, 1hh:45mm:48ss
    • Tamaño: 699,8MB
  • Vídeo iPod
    • Audio: AAC, 128kbps, 48000 Hz
    • Vídeo: 320×144, 25 fps, H264
    • Tamaño: 282,0 MB

Lo sé. Un artículo denso y mal estructurado porque sigo añadiendo cosas según hago avances. De todos modos, la idea es reunir todo tipo de información sobre la codificación de vídeos para el iPod. ¡Que aproveche!

17 comentarios en “Conversión de vídeos para iPod en Debian

  1. Hola.

    Llegue aquí buscando en google “como hacer un binario linux ffmpeg con soporte mp3”, literalmente vaya xD

    La cosa es que a principios de años empecé un proyecto para hacerme una especie de youtube privado para amiguetes y la web que tengo sobre Hip Hop. Y la cosa iva bien hasta que antes de hacer nada decido hacer unas conversiones de vídeo de prueba y todos los videos se convertían a flv pero el audio mirando la info estaba en mp2… Pruebo a meterlo en un flashplayer (el archiconocido JW FLV Player; http://www.jeroenwijering.com/?item=JW_FLV_Media_Player ) y no se escucha el audio…

    El problema es que es un hosting que me da acceso shell y demás. Así que no tiene instalado ffmpeg ni nada y el archivo que subi era un ffmpeg binario… Subi el lame también y con archivos de sonido va bien, pero claro podría hacer el video por un lado y audio por otro pero no se, creo que podría tener grabes consecuencias de sincronía.

    Se te ocurre alguna solución? 😛 jejeje

    Gracias tanto si es sí, como si es no!!

    Saludos & PAZ!

  2. Hola, ZydRick,

    Con ffmpeg es sencillo convertir cualquier vídeo a flv con audio comprimido en mp3. Sería algo así:

    ffmpeg -i entrada.avi -f flv -acodec mp3 salida.flv

    Nota que puedes añadir muchas más opciones para controlar la calidad de la imagen, del audio, resolución, etc. Aquí te he puesto sólo las opciones para convertir el vídeo a flv y el sonido a mp3.

    Si tu hosting te da acceso shell, es muy probable que te permita compilar programas. Así que prueba a compilar el ffmpeg con soporte para mp3:

    $ ./configure --enable-libmp3lame
    $ make 
    $ sudo make install
    

    Espero haberte ayudado. Si no, danos la lata lo que quieras 😉

  3. El comando ya lo usé hace tiempo y no iva, no tiene soporte mp3… Así que probaré esta noche a ver si puedo compilar… Pero me extriñe vaya… jejeje

    De todos modos a ver…. Sino, ¿funcionará compilarlo con soporte mp3 en mi pc y subir luego el binario?

    Muchisimas gracias, muy útil el post!!

    Y muy rápido en contestar!! jeje

    Saludos, gracias & PEACE!!

  4. Te sorprendería saber lo “pelado” que viene el ffmpeg que viene con algunas distribuciones o en paquetes ya creados (.deb, .rpm, etc.).

    Si compilas en tu sistema y luego llevas el binario a otro, tendrás problemas si en ese sistema de destino no existen las bibliotecas que usa ffmpeg, pues cuando las necesite, no las encontrará. Por eso te preguntaba si tu hosting te permite compilar programas.

    Por cierto, enhorabuena por utilizar software libre para tu proyecto 🙂

  5. Al intentar hacer el configure en el host me dice esto:
    Unable to create and execute files in /tmp. Set the TMPDIR environment
    variable to another directory and make sure that /tmp is not mounted
    noexec.
    Sanity test failed.
    If you think configure made a mistake, make sure you are using the latest
    version from SVN. If the latest version fails, report the problem to the
    ffmpeg-user@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net.
    Include the log file “config.err” produced by configure as this will help
    solving the problem.

    Nada le di unas cuantas vueltas pero no se si esque no conseguí cambiar la variable TMPDIR o que realmente no tengo privilegios.

    Bueno hasta el miércoles!!

    Enorabuena por la web, muy útil muchas cosas que ví por ahí.

    Y siempre uso aplicaciones libres en proyectos web.

    Saludos, PAZ!!

  6. Doy por supuesto que ya tienes compilado lame, ya que el error que me comentas es de ffmpeg.

    El error que te da es porque no tienes permiso de ejecución en el directorio /tmp. Lo que tienes que hacer es indicar al script de configuración del ffmpeg que todo lo haga en tu directorio.

    Cambia ciertas variables del sistema para que apunten a directorios dentro de tu carpeta personal:

    $ export PATH="$PREFIX/bin:$PATH"
    $ export MANPATH="$PREFIX/man:$MANPATH"
    $ export INFOPATH="$PREFIX/info:$INFOPATH"
    $ export LD_LIBRARY_PATH="$PREFIX/lib:$LD_LIBRARY_PATH"
    $ export PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
    $ export CPPFLAGS="-I$PREFIX/includes $CPPFLAGS"
    $ export LDFLAGS="-L$PREFIX/lib $LDFLAGS"
    

    Ahora, ejecuta el configure así:

    $ ./configure --prefix=$HOME --enable-shared

    Añade los enable que quieras.

    Si te da más errores, seguramente sea algo de permisos con los directorios nuevos, o que tengas que crearlos o que me he liado al escribir. Revísalo y aquí estamos 🙂

  7. Eiii gracias probaré luego… Comprobaré que tiene lame el servidor!! Sino pues a compilar más cosas xD
    Es una putada… Porque no harán libre el jodido mp3!!!! :'(

    Gracias!! Si funciona también avisaré y diré como lo hice en mi blog personal que tengo muy abandonado:
    http://blog.igabi.es/

    GRACIAS, de nuevo xD!!

    Saludos!

  8. Nada no lo conseguí… Pero tengo un binario del lame en el servidor que por separado si he comprimido audios con él y tal… No puedo combinarlo de alguna manera sin perder la sincronización del audio?

    Saludos, PAZ & GRACIAS!!

  9. Venga, hombre, no desistas 🙂

    Puedes combinar el audio con el vídeo con ffmpeg. Si, por ejemplo, has extraído el audio de un vídeo, y luego lo has comprimido en mp3 con el lame, bastaría: $ ffmpeg -i video.flv -i audio.mp3 video_final.flv

  10. Lo intentaré con el vídeo y audio por separado a ver como queda… xD

    Gracias porque mire la ayuda y nada no encontraba como combinar audio/vídeo..

    Saludos, mañana digo que tal fué…

  11. Hola, nano,

    Tengo los repositorios básicos:

    # Repositorios oficiales
    deb http://security.debian.org/ lenny/updates main contrib
    deb-src http://security.debian.org/ lenny/updates main contrib
    
    # Repositorios de seguridad
    deb http://ftp.de.debian.org/debian/ lenny main contrib
    deb-src http://ftp.de.debian.org/debian/ lenny main contrib
    
    # Repositorio Multimedia
    deb http://www.debian-multimedia.org/ lenny main
    

    En el momento de escribir este artículo tenía los de etch (igual que los de arriba pero cambiando lenny por etch).

  12. Pana tengo un problema ejecutando este comando #apt-get install liblame-dev libfaad2-dev libfaac-dev libxvidcore4-dev libvorbis-dev liba52-dev libdc1394-dev libgsm-dev libx264-dev gcc me dice lo siguiente:
    liblame-dev no está disponible sino que libmp3lame-dev lo reemplaza, corrijo e instalo inmediatamente me aparece otro error parecido :
    El paquete libfaad2-dev no está disponible, Sin embargo, los siguientes paquetes lo reemplazan:
    libfaad-dev
    corrijo e instalo:
    me Aparece otro error:
    Nota, seleccionando liba52-0.7.4-dev en lugar de liba52-dev
    liba52-0.7.4-dev ya está en su versión más reciente.
    El paquete libdc1394-dev es un paquete virtual provisto por:
    libdc1394-22-dev 2.0.2-1
    libdc1394-13-dev 1.1.0-5
    Necesita seleccionar explícitamente uno para instalar.
    E: El paquete libdc1394-dev no tiene candidato para su instalación

    Luego del calvario entro en la carpeta donde descargué el source y hago el comando que recomiendas:

    ./configure –enable-gpl –enable-pp –enable-libvorbis –enable-liba52 –enable-libdc1394 –enable-libgsm –disable-debug –enable-libmp3lame –enable-libfaad –enable-libfaac –enable-libxvid –enable-pthreads –enable-libx264

    arrojandome el error:

    Unknown option “–enable-pp”.
    See ./configure –help for available options.

    Supongo que como los paquetes cambiaron las opciones tambien, sabes cuales son las opciones correctas para el Debian Lenny???

    Nhomar

  13. Hola, Nhomar. Tengo que advertir en el artículo que, cuando lo escribí, estaba usando Debian etch y había que compilar ffmpeg para que soportase ciertos códecs pues no venía en el binario disponible para etch. Sin embargo, y afortunadamente, en lenny ya viene el binario compilado con todas las bibliotecas necesarias. Así que te recomiendo que instales ffmpeg desde apt o aptitude y listo, no tendrás que pasar por más calvarios 🙂

  14. Hola buenos dias, estuve leyendo sobre el ffmpeg y tengo unas dudas, yo eh compilado el ffmpeg con algunos codecs, eh visto que me faltan mas codecs (ejemplo aac, xvid por poner un ejemplo) las dudas son, si al volver a compilar tengo que agregar toda las lineas anteriores:

    Ejemplo:
    1ro lo compile asi:
    ./configure –enable-gpl –enable-pp –enable-libvorbis –enable-liba52 –enable-libdc1394 –enable-libgsm –disable-debug –enable-libfaad –enable-libfaac –enable-pthreads –enable-libx264

    para agregar los que me faltan tendria que hacer esto:
    ./configure –enable-gpl –enable-pp –enable-libvorbis –enable-liba52 –enable-libdc1394 –enable-libgsm –disable-debug –enable-libfaad –enable-libfaac –enable-pthreads –enable-libx264 –enable-libmp3lame –enable-libxvid

    o solo
    ./configure –enable-libmp3lame –enable-libxvid

    no entiendo bien esto, soy nuevo en linux, me prodrian orientar…

  15. Eduardo, ¿qué versión de Debian tienes? Te lo pregunto porque, como está escrito en el artículo, si tienes Debian Lenny, no tendrás que compilar ffmpeg sino que podrás usar el que hay en los repositorios pues ya viene con ese soporte activado.

    En caso de que tengas que compilar, debes añadir todas las opciones, no funciona lo de ir compilando poco a poco, así que tendrías que hacer lo primero que comentas, poner todos los enable necesarios.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *