17 mar 2010

Procesado por lotes utilizando Avidemux: Cómo automatizar tus conversiones de vídeos

Avidemux es un potentísimo programa de Código Abierto desarrollado por Mean del que ya hablé anteriormente, y que está disponible también en Windows.

Tengo un Nokia N95 que utilizo muy a menudo para grabar vídeos de mis peques, y éstos tienen un formato 640x480 a 30 imágenes por segundo en formato Mpeg4, y crea unos archivos muy pesados, llenos de ruído, sobre todo cuando hay falta de luz.

Podemos aprovechar las capacidades de Avidemux para funcionar bajo la ventana de comandos de Windows y sus posibilidades de scripting con JavaScript y crear un .bat de proceso por lotes para comprimir todos los archivos que están en una carpeta (y sus subcarpetas) de forma relativamente fácil y sencilla de entender.

Buscando información en la red, encontré un ejemplo en el foro de Avidemux, y adaptándolo, podemos comprimir mejor los vídeos generados por el N95.

Para no complicar a los profanos del JavaScripting, he utilizado éste sólo para establecer los parámetros de compresión siguiendo este pequeño manual (en inglés), y las indicaciones de la página de uso de la línea de comandos con Avidemux.
Tenemos que crear dos archivos, uno con este texto y de extensión .bat:
echo.@echo off >>ScriptMux.bat
for /R %%x in (*.mp4) do (
echo."C:\Archivos de programa\Avidemux 2.4\avidemux2_gtk.exe" --load "%%~dx%%~px%%~nx.mp4" --run "Set_codec.js" --save "%%~dx%%~px%%~nxp.mp4" --quit
) >> ScriptMux.bat
echo
echo.pause >> ScriptMux.bat
exit

Y otro con este texto y de nombre Set_codec.js que nos establecerá la configuración más adecuada para el N95 (consultar esta otra entrada para más detalles):


var app = new Avidemux();
//** Filters **
app.video.addFilter("mphqdenoise3d","param1=4,000000","param2=3,000000","param3=6,000000");
//** Video Codec conf **
app.video.codec("FFMpeg4","CQ=9","160 05 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 1f 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 fe ff ff ff 01 00 00 00 fb ff ff ff cd cc 4c 3d 01 00 00 00 0a d7 23 3c 01 00 00 00 00 00 00 3f 00 00 00 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 40 1f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ");



app.setContainer("MP4");
Y ya lo tendremos listo para trabajar. Copiamos ambos archivos a la ruta donde queramos procesar todos los archivos de la carpeta y subcarpetas, y con ejecutar el bat haciendo doble click, creará otro archivo llamado ScriptMux.bat con el comando necesario para convertir cada archivo, y con ejecutar este otro archivo, empezará a convertir todos los archivos .mp4 al formato que le hayamos indicado, en este caso Mpeg4.


¿Problemas? Si no funciona, revisar si tenéis instalado el Avidemux 2.4; en Windows Vista y 7 es "Program Files" en vez de "Archivos de Programa". También puede ser que la ruta donde lo ejecutamos alguna letra es un carácter especial (como ñ, tildes, etc), que bajo MS-Dos no es reconocido.
Puede que tampoco funcione con las últimas versiones de Avidemux (al cambiar alguna opción de la línea de comandos), puedes descargar Avidemux 2.4.4 en este enlace.
Por otro lado, si queremos procesar archivos AVI, debemos cambiar mp4 por avi en el texto del bat en las dos primeras apariciones.

Cómo he creado el script Set_codec.js con la información del codec compatible con el RealPlayer del N95
En esta página he encontrado la información para crear un script para establecer la configuración por defecto del x264 compatible con el N95.
Como se indica, un proyecto guardado es un pequeño programa javascript; si abrimos un vídeo y establecemos unos parámetros y luego guardamos el proyecto como archivo de texto, éste contendrá las líneas que podremos usar en nuestro ejecutable .js.

Para ello establecemos la configuración Mpeg4 como indico en esta página; podemos optar por x264 si lo que deseamos es la mejor compresión (para archivarlos), hasta un 50% de reducción de tamaño y mejor calidad (pero el N95 sólo es capaz de reproducir archivos de 320x240 pixels por falta de potencia en este formato).
Si queremos conservar la compatibilidad usando Mpeg4 (lavc), pero comprimiendo entre un 10 y un 50% (gracias al filtro de ruído y dependiendo del movimiento del vídeo). He establecido el cuantizador un poco alto (9) ya que se siguen consiguiendo excelentes resultados y sólo se ven "artefactos" con mucho movimiento.


Finalmente, para quitar el ruído típico de las cámaras digitales (pequeños cambios en la imagen entre fotograma y fotograma debido a los cambios en la sensibilidad de la luz del sensor CMOS). Abrimos un vídeo, pulsamos sobre "filters" en el apartado de Video a la izda.:


Agregamos los filtros que nos interesen; en este caso para quitar el ruído y así poder comprimir mejor los videos, he agregado el Mplayer hqdn3d de la pestaña de ruído (noise). Como el N95 crea archivos con mucho ruído, podemos subir un poco los valores.




Una vez hecho esto, guardamos el proyecto con extensión .txt. Al abrirlo, veremos que tiene este formato, cogemos lo que nos interese (la primera línea en negrita es indispensable), y podremos crear nuestros propios scripts con ello:

//AD <- Needed to identify//
//--automatically built--
//--Project: D:\Mis documentos\Avidemux pruebas\Proyecto.txt

var app = new Avidemux();

//** Video **
// 01 videos source
app.load("D:/Mis documentos/Avidemux pruebas/200908/200908A0/28082009388.mp4");
//01 segments
app.clearSegments();
app.addSegment(0,0,3786);
app.markerA=0;
app.markerB=3785;

//** Postproc **
app.video.setPostProc(3,3,0);

app.video.setFps1000(28993);

//** Filters ** (esto es un comentario)
app.video.addFilter("mphqdenoise3d","param1=4,000000","param2=3,000000","param3=6,000000");


//** Video Codec conf **
app.video.codec("FFMpeg4","CQ=9","160 05 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 1f 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 fe ff ff ff 01 00 00 00 fb ff ff ff cd cc 4c 3d 01 00 00 00 0a d7 23 3c 01 00 00 00 00 00 00 3f 00 00 00 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 40 1f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ");


//** Audio **
app.audio.reset();
app.audio.codec("copy",128,0,"");
app.audio.normalizeMode=0;
app.audio.normalizeValue=0;
app.audio.delay=0;
app.audio.mixer("NONE");
app.setContainer("MP4");
setSuccess(1);
//app.Exit();

//End of script

Entendiendo el .bat
La clave de las opciones de procesado está en esta parte del script:


"C:\Archivos de programa\Avidemux 2.4\avidemux2_gtk.exe" --load "%%~dx%%~px%%~nx.mp4" --run "Set_codec.js" --save "%%~dx%%~px%%~nxp.mp4" --quit


Si examinamos el código, vemos que carga un archivo .mp4 (load), luego carga ejecuta el script, se indica que el formato de salida es mp4 (--output-format), se guarda el archivo añadiendo "p" al nombre del original (--save) y finalmente se sale del programa (--quit).
En este caso no me interesa recomprimir el sonido; la calidad es suficiente (AAC a 128 bits) y no se obtiene apenas reducción de tamaño.

Basándonos en lo aprendido, podemos procesar cualquier tipo de vídeo y crear nuestros propios scripts básicos.

Batch processing de videos a los mejores formatos
Si tenemos varias películas en .avi y queremos convertirlas todas a los formatos actuales con mejor calidad y ratio de compresión (H264 para video y AAC para sonido) podemos usar esta configuración:

set_codec.js

var app = new Avidemux();
//** Video Codec conf **
app.video.codec("X264","AQ=26","188 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 1e 00 00 00 3c 00 00 00 0a 00 00 00 33 00 00 00 04 00 00 00 01 00 00 00 28 00 00 00 19 00 00 00 fa 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 04 00 00 00 10 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5a 00 00 00 ");
X264_conv.bat

echo.@echo off >>ScriptMux.bat
for /R %%x in (*.avi) do (
echo."C:\Archivos de programa\Avidemux 2.4\avidemux2_gtk.exe" --load "%%~dx%%~px%%~nx.avi" --run "Set_codec.js" --save "%%~dx%%~px%%~nxp.avi" --quit
) >> ScriptMux.bat
echo
echo.pause >> ScriptMux.bat

Hay otras formas de crear scripts para su uso directamente en Avidemux, pero para los que no controlamos de JavaScript (que es el lenguaje que entiende Avidemux), estos limitados pero útiles archivos de proceso por lotes nos pueden servir.

Como veis puede ser muy entretenido tratar nuestra colección de vídeos, mejorar su calidad y de paso reducir su tamaño. Si te ha resultado útil este tutorial, ¿a qué esperas para dejar un comentario?

Enlaces relacionados:
Comparativa entre diferentes codecs de sonido
Comparativa entre codecs de video (inglés)

7 comentarios:

  1. Hola, David:

    Estes es uno de tus sesudos, artículos, sólo válidos para alguien de tu inteligencia... Para mí todo ésto escapa a la comprensión y me temo que tardaría años en llegar a enterarme.

    Sin duda alguna llevas años, manejándote con Linux, mi nivel con Ubuntu, es ridículo...jajajja

    Llevo liado con un amigo, dos días (ayer y hoy) buscando en internet, algo para linux, y no hay manera... :(

    Muchas gracias, por tus artículos, algo lioso, para alguien de escaso nivel de linux (y nivel intelectual, en general..jajajja) como soy yo.

    Te sigo leyendo.

    ResponderEliminar
  2. jajajaa, tampoco es para tanto! Lo entenderías si hubieras usado Avidemux, y en este caso hablo del proceso por lotes bajo windows. No hay nada de Linux en este artículo (bueno sí, Avidemux ha sido desarrollado bajo Linux ;-) ).

    Un saludo, y gracias a tí por comentar! Que tengas una buena semana.

    ResponderEliminar
  3. David: Como eres mi gran experto, en todo...Particular...Con tu permiso, quiero hacerte una pregunta off-topic.

    Verás, tengo un amigo que tiene Ubuntu, y ha comprado, una tarjeta para televisión digital "huppuge 1100 HD" y lo que quería es ver la tele en ubuntu...Nos llevamos el otro día probando con de todo...Todo lo que se puede encontrar en un día en internet...Pero que va, no lo hemos logrado...

    Si conoces algún programa, y puedes decírmelo, o mejor aún hacernos un review de cómo se usa...Te estaría más agradecido si cabe.

    Muchas gracias, David.

    ResponderEliminar
  4. Aupa Miguel. Experto... como dijo Chaplin, todos somos aficionados, porque la vida no llega para más ;-)

    En cuanto a la tarjeta, ¿no será Hauppauge 1100 HD?, jeje. Yo tuve una de la misma marca alemana de aquellas que de decodificaban el C+ ;-)

    Y estoy tan verde como tú con esta tarjeta. De todas formas, ¿ya habéis mirado bien? Googlea por "Hauppauge 1100 HD linux" y te salen varios buenos resultados. Uno de ellos es de una WinTV-HVR-1100, de nuestro amigo SuperCoco.

    Suerte.

    ResponderEliminar
  5. Hey!! David, muchísimas gracias por ser siempre tan atento... La verdad es que ya estábamos un tanto mareados de buscar y rebuscar en google,no se cuantas veces, y con cuántas fórmulaciones distintas en español, en inglés...jajajaa y todo para terminar en una especie de bucle hacia las mismas aplicaciones. Que parecen no dar resultado a mi amigo, Charly.

    Lo he dejado ahí, entusiasmado, mirando el blog de "supercoco". Evidentemente le ha encantado, y se ha puesto a probar como loco... Y te da las gracias como no.

    La verdad es que Supercoco, es ahí otro "hombre del renacimiento" como tú...Sabéis hacer de todo...Alucino!!!

    Una vez más gracias...No por ésto de esta vez, sino por todo.

    Ya no te digo que te sigo...Ya te digo me hago FAN!!!

    Gracias!!!

    ResponderEliminar
  6. Hola
    Buenísimo el tutorial... pero si uso ubuntu ¿cómo lo hago?
    Gracias
    Pablo

    ResponderEliminar
    Respuestas
    1. Hola Pablo, pues creo que es prácticamente lo mismo, pero en vez de un .bat Linux es mucho más potente y la ventana de comandos Bash te admite crear un script ejecutable con mucha más variedad de comandos (mírate este manual: http://es.wikibooks.org/wiki/Manual_de_consola_Bash_de_Linux o éste http://es.wikipedia.org/wiki/Comandos_Bash y cómo se hace ejecutable: http://blog.desdelinux.net/bash-como-hacer-un-script-ejecutable/).

      Eliminar

Puede dejar su comentario, que tratará de ser moderado en los días siguientes. En caso de ser algo importante/urgente, por favor utilicen el formulario de arriba a la derecha para contactar.