SGCG

…esto no es un subtítulo…

Ir a: contenido categorías calendario archivo suscripción

Volver arriba

Ajustando vídeo

2009-07-23

Sigo con *nix en casos prácticos. Hoy vamos a corregir varios problemas de unos ficheros de vídeo. Aprovecharemos para cambiar el formato contenedor. Este ejemplo es muy elemental, pero servirá para que algún usuario poco experimentado pueda mejorar su nivel de autosuficiencia informática.

El problema

Tenemos un directorio, $HOME/documentalazo/escenas, que contiene un montón de ficheros de vídeo, *avi, con las escenas de nuestro nuevo gran documental. Estos ficheros no están muy bien hechos, siendo incorrecta la información de relación de aspecto y de las imágnenes por segundo de la pista de vídeo. La información incorrecta es:

Relación de aspecto
4:3
Imágenes por segundo
50

La imagen aparece estirada y se mueve muy deprisa. La información correcta es:

Relación de aspecto
16:9
Imágenes por segundo
24

Además de esto, el formato contenedor, AVI (artículo de la Wikipedia en español fechado el 5 de mayo de 2009 a las 00:41), no nos resulta del todo satisfactorio. Queremos usar otro formato contenedor como Matroska (artículo de la Wikipedia en español fechado el 17 de junio de 2009 a las 13:12), más versátil, sin problemas de sincronización y con la capacidad de dar ficheros menos pesados.

Los codecs de audio y vídeo nos resultan aceptables por el momento.

La solución

Vamos a usar, como siempre, una versátil shell POSIX, sed (enlace a un artículo de la Wikipedia en español fechado el 23 de mayo de 2009 a las 21:27) y FFmpeg.

Trabajaremos en el propio directorio con los ficheros de vídeo:
cd $HOME/documentalazo/escenas

Una vez en el directorio de trabajo, queremos recorrer con un bucle todos los ficheros *avi y procesarlos con ffmpeg. Esto es sencillo:
for avi_file in *avi; do mkv_file=$(echo "$avi_file" | sed 's/avi$/mkv/') ffmpeg -i "$avi_file" \ -acodec copy \ -vcodec copy \ -aspect 16:9 \ -r 24 \ "$mkv_file" done

Ahora sólo queda esperar. Vamos a aprovechar mientras el ordenador hace el trabajo pesado para repasar qué hemos hecho:

for avi_file in *avi; do
Recorremos en un bucle todos los ficheros que cumplen el patrón *avi. El nombre del fichero actual de cada iteración es almacenado en la variable avi_file.
mkv_file=$(echo "$avi_file" | sed 's/avi$/mkv/')
Creamos la variable mkv_file cuyo valor es el de avi_file cambiando la extensión avi (AVI) por mkv (Matrioska). Para ello, modificamos el nombre con sed, capturando la salida al hacer una sustitución de orden (command substitution), que es lo que indica el código encerrado en $(…). Es posible hacer esto de otras formas, pero quería introducir la sustitución de órdenes, con la que podemos usar la salida de un programa para, por ejemplo, generar opciones para otros programas.
ffmpeg -i "$avi_file" \ -acodec copy \ -vcodec copy \ -aspect 16:9 \ -r 24 \ "$mkv_file"
Aquí llamamos a ffmpeg para hacer el trabajo sucio. Indicamos el fichero de entrada con -i "$avi_file", que las pistas de audio han de ser copiadas directamente con -acodec copy, que las pistas de vídeo han de ser copiadas directamente con -vcodec copy, que la relación de aspectos ha de ser 16:9 con -aspect 16:9, que el número de imágenes por segundo ha de ser 24 con -r 24 y que el fichero de salida ha de ser el registrado en la variable mkv_file con "$mkv_file". El manual de ffmpeg contiene la información sobre estas opciones y muchas más.
done
Aquí marcamos el fin del bucle.

¡Ya está! Ha sido fácil.


Categorías: Informática

Permalink: http://sgcg.es/articulos/2009/07/23/ajustando-video/