Preparando los .vob para Adobe Premiere CS3 con bash

2007/09/05

Bueno, el otro día comenté sobre como separar archivos .vob (de formato DvD) en capítulos sueltos para editar los videos más comodamente.

La verdad es que me sirvió bastante bien para editar con el Pinnacle 9. ¿Qué es lo que pasó? Que el Pinnacle Studio 9 fallaba más que una escopeta de caña, ya que se colgaba cada dos por tres haciéndome repetir trabajo. Además, una vez conseguí terminar el video, no me dejaba exportarlo a avi, mpg o mp4 ya que petaba en el proceso.

Ojo, no digo que el Pinnacle Studio 9 sea una mierda, ya que la interfaz es super sencilla y cómoda, y además, después de parchearlo a la versión 9.3.4 funcionaba sin problema ninguno. Pero por todos es conocido que el Premiere es más potente que el Studio, y quiero probarlo.

Total, que después de que me «prestasen» el Adobe Premiere CS3 y lo echase a andar, me topé con el primer problema (problema que por cierto también me encontré en el Pinnacle Studio 10, y que debería de ver si esta solución para el Premiere sirve también para este otro programa).

El problema es que, al importar los archivos .mpg que creé de la manera que describí en el otro post, tenía archivos .mpg sin sonido, y claro, como que no tiene gracia…

El problema estaba en la importación del formato de archivo, ya que el Adobe Premiere funciona bien y por otro lado, el video se veía y se escuchaba en el mplayer. ¿Cómo solucionarlo? Pues exportándolo de otra manera distinta. Es fácil, la verdad, simplemente hay que indicarle al mencoder, que al exportar el capítulo, el audio lo pase por libavcodec y codifique en mp2. Es decir, que lo que vimos el otro día quedaría así:

mencoder dvd:// -dvd-device <carpeta_donde_tengas_el_DvD> -of mpeg -oac lavc -ovc copy -lavcopts acodec=mp2 -o <archivo_de_salida.mpg> -chapter inicio-fin

Y ya está. Es un post un poco corto, así que podemos expandirlo con otro tema que me preocupaba un poco la verdad…

Teniendo en cuenta que tengo unos 27 ó 28 días grabados de video, que cada día hay entre 1 y 4 discos, y que cada disco tiene entre 15 y 40 capítulos (la cámara crea un capítulo cada vez que se pulsa el botón record – útil la verdad xD), pues puede haber miles de capítulos, por lo que habrá que escribir ese comando unos cuantos cientos de veces y estar pendiente del ordenador de una manera innecesaria.

Así que me dije… ¿por qué no hacer un script en bash para que lo haga solito casi todo?

Manos a la obra: Hagamos un script que tome tres argumentos: la carpeta origen, la carpeta destino y el número del capítulo por el que vamos. Así por ejemplo llamaríamos al siguiente script:

carpeta_donde_se_guarda/separar_capitulos 2006-08-10/1 2006-08-10 1

Esto cogería el DvD de la carpeta ruta_origen/2006-08-10/1 ruta_destino/2006-08-10 y guardaría los capítulos de ese DvD numerados a partir del archivo 1.mpg

Empecemos con el código:

La primera línea debería de ser algo tal que así, para que sepa con que interpretar el script:
#!/bin/bash

Comprobamos que se hayan introducido tres parámetros (destino, origen, offset):
if [ $# -ne 3 ]; then
echo "Uso: $0 carpeta_origen carpeta_destino archivo.mpg"
echo "Ej: $0 2006-08-10/4 2006-08-10 69"
exit 1
fi

Cogemos el número de capítulos que tiene ese DvD (para despues hacer un bucle). Queda un poco guarrillo porque se ve algo de la salida del mplayer, pero como es un script que solo voy a usar para esto, es simplemente para ahorrarme comandos, y funciona 🙂

Para ello llamamos al mplayer, diciéndole que ejecute el capítulo 1000 del DvD que especificamos. Esto dará un error porque el DvD no tiene capítulo 1000, pero entre su salida, nos dará también el número de capítulos que tiene en total ese DvD. Esa salida la cogeremos y nos quedaremos (con grep) solo con la linea en la que aparece la palabra «chapters», y de esa linea, con la tercera palabra (con cut), que es el número que nos interesa:

NCHAP=`mplayer dvd:// -dvd-device <carpeta_origen>/"$1" -chapter 100-100 | grep chapters | cut -d" " -f3`

Para coger la salida del comando anterior, recordad que a NCHAP se le asigna la salida de la ejecución del comando que está entre las comillas simples antiguas (en un teclado español, la que está en la tecla del [ o del ^, a la derecha de la P).

Para terminar, una vez tenemos el número de capítulos que hay, los vamos procesando uno a uno, copiando su video y pasando su audio a mp2:

Asignamos dos variables, el capítulo de entrada, que empezará por el primer capítulo del DvD, y el capítulo de salida, que empezará por el offset que hemos especificado en el tercer parámetro al llamar a nuestro script:

CAP_IN=1
CAP_OUT=$3

Para cada capítulo del DvD, vemos si existe. Si existe nos lo saltamos para no sobreescribir el archivo de salida. Además, lo notificamos para luego ver que era lo que había…

while (($CAP_IN <= $NCHAP)); do
if [ -e "<carpeta_destino>/$2/$CAP_OUT.mpg" ]; then
echo $CAP_OUT existe! saltandoselo...

Si no existía, lo procesamos, indicando que es lo que estamos haciendo:

else
echo "<carpeta_origen>/$1[$CAP_IN] => <carpeta_destino>/$2/$CAP_OUT.mpg"
`mencoder -msglevel all=-1 dvd:// -of mpeg -oac lavc -ovc copy -lavcopts acodec=mp2 -dvd-device <carpeta_origen>/"$1" -o <carpeta_destino>/"$2"/"$CAP_OUT".mpg -chapter "$CAP_IN"-"$CAP_IN"`
fi

Y aumentamos las variables del bucle, para no liarla ^^’

((CAP_IN++))
((CAP_OUT++))
done

Y con esto acaba nuestro script. Si queremos luego podemos hacer que si no existe /$2 se cree automaticamente, o cualquier otra cosilla que veais, pero bueno, a mi esto me quita todo el trabajo gordo, por lo que estoy satisfecho con el script ^_^

Además, si no queremos estar escribiendo la ruta completa del script cada vez, podemos hacer lo siguiente:

crear una carpeta ~/bin donde guardaremos nuestros scripts:
mkdir ~/bin

añadir esa carpeta al path, modificando el archivo ~/.bash_rc, añadiendo la siguiente linea:
PATH=export $PATH:~/bin

Así por ejemplo para procesar un día con cuatro DvDs, solo habría que escribir 4 comandos:

separar_capitulos 2006-08-10/1 2006-08-10 1
separar_capitulos 2006-08-10/2 2006-08-10 21
separar_capitulos 2006-08-10/3 2006-08-10 38
separar_capitulos 2006-08-10/4 2006-08-10 61

Con esos cuatro comandos suponemos que el primer DvD tenía 20 capítulos (archivos 1.mpg – 20.mpg), el 2º Dvd generaría los capítulos del 21 al 37, el 3º del 38 al 60, y el 4º del 61 en adelante… y nos hemos ahorrado unos 80 comandos aproximadamente 🙂 (y el tiempo que hay que estar pendiente para ir poniéndolos uno detrás de otro claro está).

Todo esto se podía haber hecho en Windows también, ya que tiene su propio lenguaje de shell script (distinto), pero me parecía bastante más interesante hacerlo en Linux, ya que en Windows poca gente usa la consola, y aprender a hacerlo en Linux es mucho más pedagógico 😛 (además de que es el sistema operativo que normalmente uso).

Ahora ya bien, depende de lo que se necesite, pues se puede usar el Studio de Pinnacle o el Premiere de Adobe, pero tendremos nuestro DvD separado por capítulos en archivos mpeg para una edición cómoda y que sirvan para ambos programas ^_^