Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Convertir un DVD físico a "Matroska"

Última Actualización: 31 de enero de 2011 - Lunes

En este documento describo los pasos para convertir un DVD dual con subtítulos a un fichero "matroska".

Dado que vamos a hacer varias pasadas sobre el DVD, resulta conveniente copiarlo al disco duro, y trabajar sobre la copia. De esta forma las pasadas siguientes serán más rápidas y menos ruidosas, al no necesitar acceder al DVD físico. Para ello uso "k9copy". Si no tenemos ese programa o uno similar, podemos convertir la película directamente desde DVD, o bien volcar el MPEG que nos interesa directamente al disco duro, y luego trabajar sobre él.

Una vez que tenemos el DVD en el disco duro, hay que buscar el título que nos interesa. Algo del tipo:

mplayer dvd://X -dvd-device DIRECTORIO -identify

Donde "X" es un número que, empezando en "1" vamos subiendo hasta encontrar el vídeo que queremos. En nuestro caso la película es el título "5". El programa nos mostrará mucha información, como los audios disponibles, los subtítulos presentes y sus respectivos idiomas. En mi caso, hay dos audios (español e inglés) y un juego de subtítulos, en castellano.

El siguiente paso será extraer los dos audios y recodificarlos en Vorbis (el motivo porque uso Vorbis ya lo he explicado):

mplayer -aid 128 -ao pcm:fast:file=FICHERO.es.wav -vo null -vc null dvd://5 -dvd-device DIRECTORIO
mplayer -aid 129 -ao pcm:fast:file=FICHERO.en.wav -vo null -vc null dvd://5 -dvd-device DIRECTORIO
normalize -v FICHERO.es.wav FICHERO.en.wav
oggenc FICHERO.es.wav FICHERO.en.wav

El siguiente paso consiste en recodificar el vídeo. Como la imagen tiene una resolución de 720x576, decido usar un bitrate de vídeo de 800Kbps. Pero tenemos dos problemas importantes que resolver aún.

El primero es que el vídeo está entrelazado. Convertirlo a formato progresivo supone pérdidas, y no existe un procedimiento perfecto, válido para todos los gustos y todos los tipos de movimiento. Además, la conversión suele emborronar un poco la imagen, incluso en escenas estáticas.

La recomendación habitual, tal vez un poco desfasada hoy en día, es utilizar el filtro kerndeint. Podemos ver el resultado con algo como:

mplayer dvd://5 -dvd-device DIRECTORIO -vf kerndeint

De esta forma validamos que la calidad es aceptable para nosotros.

El segundo detalle es que la imagen tiene bordes negros y, en la parte superior, lo que parecen ser datos de teletexto/subtítulos. Hay que recortar la imagen. Podemos hacer pruebas a mano, pero mplayer tiene una opción para sugerirnos la zona de corte de forma automática. Algo del tipo:

mplayer dvd://5 -dvd-device DIRECTORIO -vf kerndeint,cropdetect

Nos movemos al medio de la película y vemos en el terminal la sugerencia del área de corte:

[CROP] Crop area: X: 8..712  Y: 0..575  (-vf crop=704:576:8:0).0 0 
[CROP] Crop area: X: 8..712  Y: 0..575  (-vf crop=704:576:8:0).0 0 
[CROP] Crop area: X: 8..712  Y: 0..575  (-vf crop=704:576:8:0).0 0 
[CROP] Crop area: X: 8..712  Y: 0..575  (-vf crop=704:576:8:0).0 0 
A:1807.1 V:1807.1 A-V: -0.003 ct: -0.068 554/554 12% 19%  1.1% 0 0 
Exiting... (Quit)

A continuación probamos a reproducir la película con esos datos:

mplayer dvd://5 -dvd-device DIRECTORIO -vf kerndeint,crop=704:576:8:0

En este caso la banda de teletexto/subtítulos o lo que sea de arriba no se elimina, aunque sí nos deshacemos de los otros tres bordes. Probando algunos valores, llegamos a

mplayer dvd://5 -dvd-device DIRECTORIO -vf kerndeint,crop=704:568:8:8

Una vez que sabemos cómo desentrelazar la imagen y quitarle los bordes, y que la reproducción parece correcta, llega el momento de recodificar.

En la primera pasada el mencoder realiza un análisis de la dificultad de cada fotograma, de forma que en la segunda pasada podamos asignar más bits a las escenas más exigentes, y menos bits a las escenas más simples, con el objetivo de mantener un bitrate "medio" determinado. Obsérvese que, a diferencia de mi página anterior, aquí no buscamos que la película mida un tamaño en bytes determinado (por ejemplo, para que quepa exactamente en un CD), sino que nos fijamos un "bitrate" medio, que básicamente especifica el nivel de calidad que nos interesa. La diferencia es que si ajustamos a un tamaño final, las películas más largas en tiempo tendrán una calidad peor. En cambio si ajustamos a bitrate, la calidad es más o menos constante, pero las películas más largas medirán más. Cosa bastante razonable...

Para la primera pasada, la evaluación de la complejidad de cada escena de la película, hacemos:

mencoder -vf kerndeint,crop=704:568:8:8 -oac copy \
  -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:max_bframes=16:pass=1:turbo \
  -sid 79 -o /dev/null -passlogfile FICHERO.divx2pass.log dvd://5 -dvd-device DIRECTORIO

Usamos el CODEC de vídeo XVID en vez de X.264, por necesidades mías que no vienen a cuento, y que posiblemente desaparecerán pronto. Lo de "-sid 79" es para NO quemar los subtítulos en la imagen. En el caso de la reproducción de DVDs eso no ocurre por defecto, pero si estamos reproduciendo desde un Matroska, por ejemplo, sí. Indicando unos subtítulos (esperemos) inexistentes, nos curamos un salud.

Habrá gente que quiera o necesite quemar los subtítulos en la propia imagen, por ejemplo, porque su (antiguo) reproductor de salón no los reproduce como ficheros externos. En ese caso debe añadir las opciones correspondientes, básicamente las mismas que pongamos al visualizar la película con mplayer. Lo importante es recordar que todas las opciones de recodificación deben ser las mismas, en la pasada uno (evaluación de complejidad) y dos (recodificación). Si no lo hacemos así, las estadísticas recogidas no se ajustarán a los fotogramas finales. El resultado final será una pérdida de calidad, porque la asignación de bits por fotograma no encaja exactamente con su complejidad real, porque los fotogramas se han alterado con los subtítulos.

La segunda pasada utiliza la estimación de complejidad de cada escena, calculada en la primera pasada, para asignar un número diferente de bits a cada fotograma:

mencoder -vf kerndeint,crop=704:568:8:8 -oac copy \
  -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:max_bframes=16:pass=2:threads=2:bitrate=800 \
  -sid 79 -o FICHERO.avi2 -passlogfile FICHERO.divx2pass.log dvd://5 -dvd-device DIRECTORIO

Obsérvese que copiamos el sonido tal cual, no lo tocamos para nada. Lo tiraremos cuando montemos el Matroska final.

Una vez recodificada, le echamos un ojo. La calidad de vídeo es bastante mala, porque normalmente daría 800Kbps a las películas de 700 pixels de ancho, pero panorámicas. Esta peli tiene formato mucho más cuadrado, casi el doble de pixels de lo que suelo recodificar normalmente. Intuitivamente eso hace que, para el mismo nivel de calidad, tenga que doblar el bitrate. En realidad eso no es así, porque el desentrelazado ya difumina un poco la imagen y por la propia naturaleza de la película (grandes zonas de color homogéneo). Me decido por probar un bitrate de 1200Kbps:

mencoder -vf kerndeint,crop=704:568:8:8 -oac copy \
  -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:max_bframes=16:pass=2:threads=2:bitrate=1200 \
  -sid 79 -o FICHERO.avi2 -passlogfile FICHERO.divx2pass.log dvd://5 -dvd-device DIRECTORIO

Obsérvese que lanzamos directamente la fase dos de la recodificación. Esto es así porque no hemos alterado la configuración del recodificador de vídeo, así que las estadísticas recogidas en la primera pasada siguen siendo válidas.

Cuando terminamos la nueva recodificación, echamos un ojo al vídeo. Estoy satisfecho con la calidad que obtengo ahora.

Otra posibilidad hubiera sido escalar la imagen, para reducir la resolución y utilizar ahí un bitrate bajo. La imagen sería más pequeña, pero tendría mayor calidad, con un bitrate menor. Por ejemplo, usar 800Kbps, pero escalando el 720x576 a 512x408 (la resolución debería ser un múltiplo de 16, en este caso sería 512x416, con un pequeño borde negro en los márgenes verticales). Es la mitad de resolución que el original, y un bitrate de 800Kbps sería apropiado. Si optamos por esta solución, tenemos que repetir la primera pasada sobre el vídeo, para recoger estadísticas de complejidad nuevas. Opto por recurrir a una resolución vertical de 384 pixels, dejando que la horizontal se calcule sola. El bitrate elegido será de 800Kbps. Tenemos que hacer las dos pasadas:

mencoder -vf kerndeint,crop=704:568:8:8,scale=-2:384 -oac copy \
  -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:max_bframes=16:pass=1:turbo \
  -sid 79 -o /dev/null -passlogfile FICHERO.divx2pass.log dvd://5 -dvd-device DIRECTORIO

mencoder -vf kerndeint,crop=704:568:8:8,scale=-2:384 -oac copy \
  -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:max_bframes=16:pass=2:threads=2:bitrate=800 \
  -sid 79 -o FICHERO.avi2 -passlogfile FICHERO.divx2pass.log dvd://5 -dvd-device DIRECTORIO

El siguiente paso es hacerse con los subtítulos. Este proceso es un poco doloroso y muy manual. El problema es que en los DVDs los subtítulos de los diferentes idiomas no son texto, sino imágenes. Esto tiene la gran ventaja de que no hay que preocuparse de cosas como el juego de caracteres (pensemos en los subtítulos chinos), pero para nosotros es un problema porque los subtítulos sí los vamos a almacenar como texto. Por tanto, no solo hay que extraer las imágenes que conforman los subtítulos, sino que además hay que pasarles un OCR (reconocedor óptico de caracteres) para convertirlo a texto. Este proceso está muy lejos de ser perfecto, por lo que el paso final es siempre revisarse el fichero de texto generado a la caza de erratas, símbolos que se pierden o se convierten de forma errónea, etc.

Este paso es muy coñazo, y es algo a mejorar mucho. Algunas páginas web relevantes:

En el futuro habrá que volver a investigar este tema. Con suerte, la situación habrá mejorado.

Esta película es antigua, y solo contiene los subtítulos en castellano. Normalmente extraeríamos subtítulos en varios idiomas.

Al final tendremos los siguientes ficheros:

  • Un fichero "avi2" con el vídeo recodificado. Este fichero contiene también un audio, pero no lo vamos a usar.

  • Dos ficheros "ogg" con los audios español e inglés.

  • Un fichero "srt" con los subtítulos en castellano.

Ahora hay que montar el "matroska":

mkvmerge -o "FICHERO [DUAL-sp_subs-Vorbis].jcea.mkv" -A FICHERO.avi2
         --language 0:es FICHERO.es.ogg --language 0:en FICHERO.en.ogg
         --sub-charset 0:utf-8 --language 0:es 200.es.srt

El "-A" es para que no adjunte el audio del "AVI" intermedio, ya que los que nos interesa son los audios en "OGG".

Una vez que tenemos el "Matroska", le echamos un vistazo rápido. Miramos básicamente dos temas: que el "charset" de los subtítulos sean correctos y que el video y los audios no estén desincronizados. Si lo primero está mal, simplemente regeneramos el "matroska" indicando el charset correcto (por ejemplo, "iso8859-1"). Si el problema es la desincronización entre audio y vídeo, lo más simple es remontar el "matroska" indicando "offsets" entre las pistas. Para eso se usan los parametros "-y" o "--sync <TID:d[,o[/p]]>". Echadle un ojo a "mkvmerge --help".

En mi caso, todo está bien. ¡Por fin!.

Gracias a Marta por prestarme el DVD de una película que llevaba buscando desde el 4 de febrero de 2004. Lenta pero inexorablemente... :-)


Historia

  • 31/ene/11: Primera versión de este documento



Python Zope ©2011 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS