…esto no es un subtítulo…
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.
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:
La imagen aparece estirada y se mueve muy deprisa. La información correcta es:
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.
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
*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/')
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"
-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
¡Ya está! Ha sido fácil.
Categorías: Informática
Permalink: https://sgcg.es/articulos/2009/07/23/ajustando-video/