Share on Google+Share on FacebookTweet about this on Twitter

Para quien haya leido la entrada sobre codificación de videos, comprendería que existen dos tipos de subtítulos. Los subtítulos llamados hardcoded y los llamados softcoded. Son muy diferentes.

Los subtítulos hardcoded se codifican en la misma pista de video. Si un video está compuesto por frames (imágenes), los subtítulos hardcoded forman parte de la misma imagen. Por lo tando este tipo de susbtítulos no se pueden habilitar o deshabilitar, y mucho menos cambiar entre diferentes pistas de subtítulos.

Los subtítulos softcoded en oposición, no forman parte de la imagen en sí del video. Son pistas diferentes a la pista de video, como lo puedan ser las pistas de audio o las pistas de capítulos. Estas se sincronizan con el video y se superponen sobre este. El resultado son subtítulos que podemos habilitar o deshabilitar a voluntad, con una apariencia mucho más suave y agradable, y además podremos alternar entre unos u otros.

Como dije en su entonces en la entrada de codificación de video, la culpa es tan solo de Apple y su manía de no hacer las cosas de forma NORMAL. MPEG-4 tiene un estandar completamente funcional para subtítulos, capítulos o pistas de audio múltiples. Pero Apple se empeña en hacer todo como a ellos les gusta. El resultado es que tenemos que llevarnos horas y horas pensando como podemos hacer cosas que a priori son más que simples. Si Apple hiciese las cosas de forma normal, tan solo sería necesario un paso. Como esto no es así, tenemos que jugar con QuickTime, editores hexadecimales…

No debería de ser complicado codificar una aplicación relativamente simple para implementar todo esto. Una aplicación que fuese: Abrir video, seleccionar pistas de audio, subtítulos, capítulos… seleccionar idimas, procesar y listo. Pero sinceramente después de las horas investigando y peleándome con QT tengo de todo menos ganas de escribir código. Quizás sea posible en cambio modificcar el código fuente de mp4box.exe y hacer una implementación rudimentaria para dar soporte. Al acabar de escribir esta entrada me pondré en contacto con Kurtnoise por si nos hace el favor a todos de implementarlo en mp4box o en Yamb.

Para quien quiera probar que todo funciona perfectamente puede ver mi viejo y querido “fragmento prueba” de todo este tiempo. Y lo advierto de nuevo, son los últimos 4 minutos del último episodio de la última temporada de Friends, luego no me lloreis si os estropeo el final:

http://rapidshare.com/files/112596021/Fin.mov.html

Sí, son archivos Mov. Es una tontería sobre extensiones. Si le ponemos extension mp4 QT no lo reconoce, si ponemos MOV lo reconoce… Apple…

Sincronizar y listo:

Antes de comenzar, será bueno tener un indice de todo el proceso. Puede que en algún momento nos liemos, pero si comprendemos el proceso, no tiene por qué ser complicado:

1º. Partir de la base de tener ya codificadas las diferentes pistas de nuestro archivo (video, audio, capítulos). Este paso se puede obtener del manual de codificación de video que se encuentra en este mismo blog. Aunque en dicho manual no estaban aun los subtítulos, con lo que algunos pasos que se dan alli se pueden saltar. Siguiendo aquel manual, lo mejor sería después de la codificación del video y del audio no mezclar ambos, y dejar ello para más adelante, cuando tengamos todos los elementos a mezclar.

2º. Obtener el archivo de subtítulos .ttxt

3º. Crearemos un archivo .MP4 para cada uno de los subtítulos, al igual que tenemos una pista de video en un archivo mp4 o dos pistas de audio en otros dos .mp4 diferentes y también haremos trampa para que QT los reconozca como pistas de texto al menos

4.º. Editaremos los archivos .mov de los subtítulos para que QT interprete las pistas de texto ttxt como pistas de subtítulos.

5º. Una vez tengamos todas las pistas elementales en .mp4 y .mov (menos los capítulos) iremos añadiendo una pista a una pista en un contenedor mov nuevo.

6º. Una vez tengamos en el contenedor .MOV todas las pistas elementales, tan solo tendremos que indicar idiomas, capítulos y demás.

Dado que apple no proporciona ninguna herramienta para incorporar subtítulos, el proceso puede ser un poco… complicado, por decirlo de alguna manera. El problema es que ni siquiera QT es capaz de marcar una pista de texto como subtítulos, por lo que debemos de hacerlo nosotros mismos. Tampoco conozco ahora mismo ningún programa que pueda hacerlo ni tengo tiempo ni motivación para crear una aplicación yo mismo.

Voy a decir paso a paso como lo tengo hecho yo, no quiere decir que no sea posible hacerlo de otra forma. En todo momento usando Windows, y aunq me odien los amantes de MAC siento decir que la versatilidad de windows frente a MAC no tiene palangón.

2º. Extracción y obtención de los subtítulos:

Antes que nada evidentemente necesitamos los subtítulos. Yo he partido de subtítulos tipo ttxt por ser el estandar, pero supongo que partiendo de subtítulos .srt tampoco habría ningún problema. Como obtenemos estos archivos de subtítulos?

Todos los DVDs. al ripearlos podemos también extraer los subtítulos. Una vez la película ha sido ripeada (y usamos ripear como acción de volcar el contenido de un DVD al PC) podríamos usar cualquier programa de extracción de subtítulos. En mi caso he seleccionado SubRip, maravillosa aplicación donde las halla para este trabajo.

Hay que comprender que los subtítulos en los DVD no son lineas de texto, sino imágenes superpuestas en el video. Por lo tando, para convertir los subtítulos de un DVD a ttxt por ejemplo es necesario un programa que sea capaz de:

1º. Extraer las imágenes de los subtítulos
2º. Realizar un OCR por la ímagen e ir interpretando caracter a caracter
3º. Convetir los datos extraidos en el archivo deseado con el formato deseado.

Como es común, lo voy a realizar con imágenes en un ejemplo real, puesto que será mucho más intuitivo a la hora de querer seguir los pasos. Como hemos dicho, partimos de que ya tenemos el DVD ripeado en el PC.

SubRip -> http://zuggy.wz.cz/redir.php?co=21

Lo primero será descomprimir/instalar el programa y abrirlo, evidentemente. El proceso será simple. Primero abriremos el encabezado de un DVD, su archivo IFO. Una vez este archivo abierto, el programa nos dirá las pistas de subtítulos encontradas, seleccionaremos la deseada y empezaremos con la extracción. Tenemos varias opciones de extracción, nosotros nos centraremos en OCR. OCR es una técnica de reconocimiento de texto a partir de imágenes.

Llegado a este punto, en cuanto le demos a “Start” comenzará el proceso OCR. Es muy simple, rápido y eficaz. Nos saldrá una ventana preguntándonos por cada caracter. Nosotros tendremos que ir escribiendo el caracter al que corresponde. Así, si nos muetra la imagen la letra B mayúscula, tendremos que introducir la letra ‘B’ pro el teclado. De este modo, el programa sabrá ya siempre que ese caracter será la B. Este proceso se repetirá tantas veces como caracteres diferentes haya. Es decir, una vez la letra B pro ejempplo esté procesada no nos volverá a preguntar por la misma. Esto significa que los primeros 5 minutos prácticamente los pasaremos “traduciendo” letra a letra, pero evidentemente en cuanto tengamos cada vez más caracteres identificados, el proceso se acortará enormemente. Cuando acabemos además podremos guardar el diccionario generado para ser reutilizado en otra ocasión. Esto es util por ejemplo en series en las que todos los episodios tienen la misma tipografía de subtítulos, luego los diccionarios se pueden reutilizar:

Podemos ver como el OCR nos pide que introduzcamos el caracter al que se refiere la imagen. Que evidentemente sabemos que es una B. OCR no es capaz de identificarla hasta que al menos la hayamos nosotros identificado antes una vez. Así mismo, como vemos en la imagen, las siguientes letras a ser procesasdas serán la ‘u’ la ‘t’… el programa también nos deja indicar si la letra se encuentra en negrita (bold) cursiva (italic) o subrallada (underline). Es decir, si esta B fuera en realidad una B tendríamos que marcar la casilla Italic:

Después de procesar algunas letras más, vemos que la letra ‘m’ (en mi ejemplo) no nos la pide más. Por qué? porque anteriormente la hemos añadido cuando nos apareción en la palabra ‘more’. Es decir, cada letra la pondremos tan solo una vez, luego en el peor de los casos tendremos que hacer este proceso unas 50 veces mas o menos, 25 por cada letra minúscula y 25 por cada maýuscula, y también si hay números u otros caracteres, no solo letras.

Después de un ratito, no más de 5 minutos se puede tardar, acabaremos con toda la película:

Ahora tan solo nos quedará seleccionar el formato de salida deseado, el juego de caracteres y ajustar el tiempo, tanto de sincronización como su FPS

El formato de archivo deseado es importante, aunque hemos dicho que usaremos TTXT. El framerate permitirá una correcta sincronización, en mi ejemplo el FPS es de 25, por ello está 25 marcado. Por último normalmente no habría que realizar más ajustes, pero en mi ejemplo no es una película completa, sino son los 3 ultimos minutos de ‘Friends’. Esto se debe de especificar, dado que los subtítulos tienen marcadores de tiempo estos indican que pertenecen a los minutos 42 y en adelante, sin embargo para mi deben de comenzar desde 0. Como comenzé el ripeo en el minuto 42, tan solo tengo que restarle 42 minutos a la escala de tiempo, aunque como digo esto tan solo es necesario para mi, dado que es una extracción particular, no completa:

Y es lo que hago. Primero le doy al icono del reloj, segundo marco la casilla minus y lo establezco a 42 mnutos, para que me reste ese tiempo a mis marcadores de tiempo en los subtítulos. Si vemos en la imagen anterior p incluso abajo del todo, el último marcador de tiempo, antes de realizar los ajustes pone que la última frase de los subtítulos aparecería en el minuto 45:35… sin embargo el video no tiene ni 4 minutos de longitud. De ahí la necesidad a ajustar el tiempo. Como digo esto es necesario para mi ejemplo, aunq puede ser necesario en otros proyectos.

En cuanto le demos a Corrected Time, todos los marcadores de tiempo se ajustarán perfectamente al nuevo tiempo.

Ahora podemos ver aquí los diferentes formatos de salida. Como hemos dicho vamos a usar ttxt. Podemos seleccionar tambíen el tipo de fuente e incluso el tamaño de esta. Yo lo suelo dejar por defecto, pero quien quiera puede jugar con los valores:

Al seleccionar un tipo de subtítulos u otro, veremos como nuestra ventana cambia y se adapta al nuevo formato sin problema alguno. Una vez terminemos los ajustes, tan solo tendremos que darle a salvar (el icono del disco). La ventana que se nos mostrará será mu similar, solo que nos pedirá por última vez la letra, el tamaño y la codificación. Por defecto podemos usar Latin I ANSI, que es un juego de caracteres muy usado. Pero tener en cuenta que dependiendo del pais, del idioma… puede ser necesario usar otros sistemas de codificación. Por ejemplo con este juego de caracteres sería imposible tener subtítulos en Japones. Para ello sería necesario usar a lo mejor UNICODE. Cuando acabemos guardaremos el archivo .ttxt donde deseemos. Al cerrar la aplicación nos permitirá si queremos tambien guardar el diccionario generado por OCR como hemos dicho anteriormente.

Ya tenemos generado nuestro archivo de subtítulos. Esta parte en realidad no pertenece a un manual de iPhone o iPod, sino más bien a edición de video. Pero como creo que la mayoría no lo sabía espero que les haya servido. Los problemas en realidad comienzan ahora.

3º. Creación de archivos .MP4 a partir de las pistas .ttxt

Dado que QT a priori no reconoce las pistas ttxt ni siquiera como pistas de texto nos tendremos que apañar con alguna utilidad para hacerlo. Yo soy fan de mp4box.exe Para quienes no les guste la linea de comando que use Yamb.

Ahora bien, la teoría dice que usando yamb por ejemplo, bastaría con crear un archivo mp4 nuevo que incluyese las 6 pistas. Eso sería suficiente para tener un archivo mP4 completamente funcional para el estandar MPEG4. Pero como hemos dicho Apple no hace las cosas tan así. Apple es bastante más estricto, y haciendo eso podemos encontrarnos con algunos problemas. Así que podemos hacer algo similar pero con QT, aunque la mayoría del trabajo podemos hacerlo como he dicho con yamb. (exceptuando la pista de subtítulos). Apple además de modificar ligeramente el formato del contenedor, también tiene una denominación diferente para los identificadores de idiomas, por eso para lo que QT dice que es español, para cualquier otro reproductor dice que es algun idima raro. Pero no nos liemos y continuemos.

Dado que QT no es capaz a priori de leer un archivo .ttxt, la forma más facil es partir de un archivo MP4 que tan solo contenga una pista .ttxt, y esto si es muy facil hacerlo. Desde Yamb o incluso megui podemos hacerlo.

Desde Yamb:

Seleccionamos Creation, Click to create… añadimos tan solo la pista ttxt a la lista, le damos a next y listo. Haciendo esto tendremos ya la pista .ttxt como .mp4 en realidad, de este modo QT sí que la reconocerá (aunque por ahora tan solo como pista de texto y no como pista de subtítulo)

Al darle a Next tendremos creado nuestro archivo VTS_01_0_spanish.mp4 que contendrá tan solo nuestra pista de subtítulos.

Realizaremos el proceso de nuevo si tenemos más de una pista de subtítulos.

Paradógicamente si abriésemos estos archivos desde QT, este nos diría que están vacios, que no tienen ninguna pista de ningún tipo dentro. Pero lo más gracioso aun, es que si renombramos estos archivos .mp4 recien creados a .m4v QT inmediatamente nos reconocerá los archivos y es más, es capaz de reproducirnos la pista de subtítulos, aunque no la reconocerá como tal.

Pues dicho y hecho, lo hacemos. Renombramos los dos archivos de subtítulos (en mi caso son dos) a .m4v. Abrimos el primero con QT, y veremos un recuadro blanco. Tal y como está todo, tan solo le damos a “Guardar como…” archivo nuevo .MOV. Esto hará que nuestro archivo .mp4 (m4v) se guarde con las etiquetas correctas de apple.

Luego con yamb obtenemos los archivos .mp4, los renombramos a .m4v para que los reconozca QT y a continuación los guardamos con QT en formato .mov.

Llegados a este punto ya tendremos preparadas las pistas de subtítulos al menos como pistas de texto. Esto lo podemos comprobar si desde QT hacemos clic en “Mostrar propiedades de la película”, nos aparecerá nuestra pista de texto.

4º. Modificación de los archivos .mov para que QT reconozca las pistas de texto como pistas de subtítulos.

Otra cosa absurda de QT o de Apple, según se mire, es que no es posible marcar una pista como pista de subtítulos. No sé sinceramente si Apple venderá algun programa caro de autoría de DVDs, pero desde luego no pone las cosas muy fáciles que digamos. Más absuro aun es el identificador que hace que la pista sea reconocida como subtítulo en vez de como pista de datos.

Los archivos .MP4 o .MOV Que a fin de cuentas son casi iguales, están estructurados en identificadores llamados ATOMS. Estas partículas o átomos señalan y separan cada bloque de estos archivos, identificando si son pistas de audio, de video, subtítulos, que idiomas, donde empieza una y donde acaban… pues todo el problema de los subtítulos se basa básicamente en un ATOM.

QT es capaz de reconocer un ATOM de subtítulo estandar y lo reproduce, pero internamente no lo marca como subtítulo. Como explicarlo… es capaz de reconocerlo y reproducirlo en pantalla, pero no lo asimila como tal. Para que QT reconozca como legítima una pista de subtítulos, esta tiene que estar precedida por el ATOM ‘sbtl’. Este ATOM no es que sea nuevo, también existe en el estandar, pero no se usa de la misma forma.

Así pues, QT reconocerá a este punto las pistas como pistas de texto. Ellas tienen un ATOM de ‘text’ (los atoms tienen 4 letras). Si editamos bien sea con un editor hexadecimal o un editor de atoms esto, de forma mágica QT reconocerá en vez de la pista de texto, una pista de subtítulos. Yo soy fan de los editores hexadecimales, son la herramienta imprescindible ;), así que lo muestro con ello. Ya sé que para la mayoría no será práctico realizar todo esto, aunque supongo que para otros muchos sí. Pero como he dicho, hasta la fecha no hay ningún programa que lo haga de forma automatizada, y como he dicho no tengo ni ganas ni motivación para ponerme ahora a escribir código. Si alguien se anima que lo haga, no es complicado.

Abrimos en un editor hexadecimal el 1º archivo .mov. Con cualquier editor hexadecimal podemos buscar una cadena de texto, así pues buscamos por “text”. Es la primera que nos encontramos:

Si modificamos ese ‘text’ como hemos dicho por ‘sbtl’:

tendremos suficiente.

Creo que apple tiene por ahí un programa llamado Dumper o algo así que permite la edición de atoms, se puede hacer perfectamente desde él también.

Una vez modificado, guardamos el archivo y listo. Haremos lo mismo para cada archivo de subtítulo que tengamos.

Llegados a este punto, si abrimos el archivo .mov modificado co QT, por arte de magia la pista ya no es una pista de texto, sino de subtítulo. Si le damos igualmente a play, veremos como el texto aparece perfectamente.

5º. Creación de un .MOV con todas las pistas juntas.

Bueno, ya lo que queda es tan solo ensamblar. Llegados a este punto tendremos (en mi ejemplo)

1 pista de video .mp4
2 pistas de audio .mp4
2 pistas de subtítulos .mov
1 pista de capítulos .txt

Abrimos en primer lugar la pista de video en un QT y las dos pistas de audio en otros dos QT, un total de 3 QT abiertos de manera simultanea. El proceso ahora será el mismo para todo:

Vamos a la ventana de QT con la pista de audio en español (por ejemplo). Editar, seleccionar todo, copiar. Vamos a la ventana de QT co la pista de Video. Editar, seleccionar todo, añadir a la película y escalar. Esto nos añadira la pista de audio español a nuestra pista de video. Si reproducimos escucharemos el audio perfectamente.

Vamos a la ventana de QT de la pista de audio en ingles y repetimos el proceso. Vamos a la ventana de QT con la pista de Video y Audio español, seleccionar todo, añadir y escalar. Esto nos añadirá la segunda pista de audio.

Como tan solo hemos añadido, si reproducimos ahora se solaparán ambas pistas. Podemos ir haciendolo poco a poco y entrar en “mostrar propiedades de la película” y poner los idiomas y ajustar estas cosillas o hacerlo todo después una vez tengamos todas las pistas añadidas. Para no repetirlo todo, yo opto por esta segunda opción.

Cerramos las dos ventanas de QT con las pistas de audio y abrimos otras dos ventanas con las pistas de subtítulos.

Igual que hemos realizado antes. Vamos a la ventana de QT con la pista de subtítulo en ingles, seleccionar todo, copiar. Vamos a la vetana de QT con nusetra pista de video + 2 de audio, seleccionar todo, añadir y escalar. Realizamos el mismo proceso con la otra ventana de QT con los subtítulos en español.

Llegados a este punto, en la ventana de QT principal tendremos ya añadido la pista de video, 2 de audio y 2 de subtítulos.

Para acabar añadimos de la misma forma la pista de capítulos.

6º. Ajustanto las diferentes pistas

Una vez tengamos todas las pistas en la misma ventana de QT, ahora lo único que queda es ajustar las propiedades. Vamos a “mostrar propiedades de la película”

Aquí podremos ver cada una de las pistas añadidas, en total 6 en mi caso. Ahora queda ajustar algunas cosas.

Seleccionamos la primera pista de audio, que será la pista de audio en español. Vamos a otros Ajustes y establecemos el idioma. En alternativo pondremos la segunda pista de audio, de este modo cuando seleccionemos una se deseleccionará la otra.

Seleccionamos la segunda pista de audio, que será la pista de audio en inglés. Otros ajustes, y establecemos de nuevo el idioma. Veremos que en alternativa ya está seleccionada la pista de audio primera. Al establecerlo esto en la 1º pista, se establece en la alternativa tb.

A continuación hacemos exactamente lo mismo para las pistas de subtítulos.

Por último queda la pista de capítulos. Esta se trata de manera u pelin diferente. En esta ocasión marcamos la pista de video, Otros Ajustes, y en capítulos marcamos la pista de texto que resta. Hay que acordarse de desactivar la pista capítulos, para que no nos muetre constantemente el capítulo en el que estamos al reproducir el video:

Y se acabó. Cerramos, Guardar Como… Película MOV independiente. Cerramos el video, lo abrimos y listo. tendremos un bonito MOV creado con diferentes pistas de subtítulos, de audio y con capítulos.

—————————————————————-
—————————————————————-