Ripear DVD con FFmpeg, Recargado

Hace tiempo escribí algunos posts con instrucciones para ripear un DVD usando FFmpeg. En esos posts mencionaba que primero deberías probar con Handbrake antes de intentar ripear el DVD de la forma difícil desde la línea de comandos usando MPlayer y FFmpeg. Entonces, ¿cuál es la razón para escribir este post? ¿Cuál es el problema con Handbrake?. El problema de Handbrake es el típico problema de Linux de interfaces de usuario terribles 😦 . Si eres como yo y quieres ripear todos los títulos de un DVD, con Handbrake tienes que seleccionar un título, configurar las opciones, agregarlo a la cola de tareas y después seleccionar el siguiente título y repetir 😦 . Aunque el proceso puede tomar solamente unos cuantos clicks, cuando te encuentras con un DVD con muchos títulos, esos son algunos cientos de clicks más de los que quiero hacer; sin mencionar que tienes que escribir manualmente el nombre para cada uno de los archivos de salida ya que Handbrake te sugerirá el mismo nombre para todos los títulos sin importar si ya tienes uno con ese nombre en la cola de tareas. No entiendo como el programa “especializado” para ripear DVDs no tiene una opción para seleccionar varios o todos los títulos de un DVD 😦 .

Decepcionado con Handbrake, no me quedó otra opción que volver a la siempre confiable línea de comandos. El siguiente proceso aún requiere un poco de interacción del usuario pero la interacción es mucho menor que todos los nombres de archivo que tendría que escribir y todos los clicks que tendría que hacer en Handbrake para obtener el mismo resultado. Si ponemos todas las instrucciones en un script, la interacción que se requiere para hacerlo será aún menor.

En los anteriores posts usamos MPlayer y FFmpeg junto con una named pipe para ripear un título de un DVD. La idea aquí es usar el mismo método de forma repetida para ripear todos los títulos de un DVD. Para hacerlo, primero debemos saber cuantos títulos contiene el DVD en cuestión. Como antes, estoy usando una imagen de DVD sin encriptación, por lo que podemos obtener la información con el siguiente comando:

monstruosoft@debian:~$ mplayer -dvd-device mi-dvd.iso -identify -frames 0 dvd://1

El comando anterior imprimirá, entre otras cosas, el número total de títulos en el DVD e información sobre la duración de cada título. La opción -identify de MPlayer también mostrará más información sobre el DVD que podemos utilizar para extraer una lista de los títulos que queremos ripear.

Advertencia: El comando anterior para obtener el número de títulos de un DVD no es 100% confiable; algunos DVDs, particularmente de Disney, traen una protección que muestra 99 títulos, la mayoría con basura y duración de 2 horas que no quieres ripear.

Ahora que conocemos el número de títulos que contiene el DVD podemos usar un ciclo for para ripear una lista de títulos o bien ripearlos todos usando MPlayer y FFmpeg como está descrito en los anteriores posts. Supongamos que el DVD del ejemplo anterior tiene 20 títulos en total y queremos ripearlos todos excepto el título número 9; para hacerlo solamente debemos escribir el siguiente ciclo for en un script después de crear nuestra named pipe con el comando mkfifo:

for i in {1..8} {10..20}
do
ffmpeg -probesize 240M -analyzeduration 300M -i mypipe -map 0 -c:s copy -c:a copy -c:v libx264 -crf 20 -preset veryfast "mi-dvd-titulo-$i.mkv" &
mplayer -dvd-device mi-dvd.iso -dumpstream -dumpfile mypipe dvd://$i
wait
done

Podemos guardar el ciclo for anterior en un archivo llamado, por ejemplo, ripear-dvd.sh y ejecutarlo de la siguiente manera:

monstruosoft@debian:~$ ./ripear-dvd.sh

Y listo, el script ripeará todos los títulos que indicamos usando MPlayer y FFmpeg. Escribir el script y seleccionar la lista de títulos a ripear sigue tomando mucho menos tiempo de lo que me tomaría hacer lo mismo usando Handbrake. Además el script se puede reutilizar fácilmente con modificaciones mínimas para ripear más DVDs, lo que me ahorrará aún más tiempo.

Los comandos usados aquí son prácticamente los mismos usados en posts anteriores; usamos MPlayer con la opción -dumpstream para dumpear un título hacia nuestra named pipe que será usada por FFmpeg para llevar a cabo la recodificación. En este ejemplo estoy usando las opciones de FFmpeg -probesize y -analizeduration para incluir las pistas de subtítulos que no siempre aparecen desde el inico del video. Aparte de eso FFmpeg simplemente convierte el video al formato x264 y deja las pistas de audio sin modificar.

Hay algunas cosas que Handbrake hace mejor. Por ejemplo, con Handbrake puedes hacer mixdown a las pistas de audio, algo que no es sencillo con FFmpeg sin escribir un script más complicado. Handbrake también convertirá las pistas de subtítulos para que aparezcan bien cuando reproduces el video mientras que el script anterior solamente las copia, lo que puede hacer que los subtítulos aparezcan de colores extraños si no se convierten con una paleta de colores adecuada usando la opción -palette (por otro lado, recuerden no usar pistas de Closed Caption con Handbrake o crasheará sin nada más que un críptico error en la ventana de actividades). Handbrake también conservará los códigos de país para las pistas de audio y subtítulos. En resumen, Handbrake tiene algunas buenas opciones pero mientras no tenga la opción de seleccionar múltiples títulos, en mi opinión, no vale la pena.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s