script bash para la conversión ffmpeg no bucle
loops stdin (2)
Tengo este script bash para una conversión por lotes de algunos archivos mp4:
#!/bin/bash
ls dr*.mp4 | grep -v -E "/.[^/.]+/." | sed "s/.mp4//g" | while read f
do
TARGET="$f.ffmpeg.mp4"
if ! [ -f $TARGET ]
then
echo $TARGET
ffmpeg -nostdin -i $f.mp4 -s 320x180 -vc h264 -acodec copy -f mp4 -y $TARGET
fi
TARGET="$f.ffmpeg.flv"
if ! [ -f $TARGET ]
then
echo $TARGET
ffmpeg -nostdin -i $f.mp4 -s 320x180 -acodec copy -y $TARGET
fi
TARGET="$f.jpg"
if ! [ -f $TARGET ]
then
echo $TARGET
ffmpeg -nostdin -i $f.ffmpeg.mp4 -ss 0 -vframes 1 -f image2 $TARGET
fi
TARGET="$f.ffmpeg.ogv"
if ! [ -f $TARGET ]
then
echo $TARGET
ffmpeg -nostdin -i $f.mp4 -s 320x176 -ar 11025 -acodec libvorbis -y $TARGET
fi
done
Se ejecuta una vez pero lo hace y convierte el nombre del archivo de entrada a 4 formatos diferentes, pero no hace un bucle al siguiente nombre de archivo de entrada. Traté de barajar el orden de las distintas conversiones, pero aún así la secuencia de comandos se ejecuta exactamente una vez para un nombre de archivo. Intenté ejecutar ffmpeg con la bandera -nostdin, pero dice
"Unrecognized option ''nostdin''"
La versión de ffmpeg es ffmpeg versión 0.10.6-6: 0.10.6-0ubuntu0jon1 ~ lucid2 - Acabo de actualizar el paquete ffmpeg de http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntu y no puedo encontrar una versión más nueva . El sistema base es
Distributor ID: Ubuntu
Description: Ubuntu 10.04.1 LTS
Release: 10.04
Codename: lucid
Me encontré con el mismo problema con un ciclo while y fue porque me faltaba el indicador -nostdin
en uno de mis comandos ffmpeg. Creo que porque read
lee de entrada estándar que tener un comando ffmpeg allí estaba comiendo algunos de los datos. En mi caso, mi ciclo while fue como:
find /tmp/dir -name ''*-video'' | while read -r file; do
# note: I forgot -nostdin on the ffmpeg command
ffmpeg -i "$file" -filter:v "amazing_filtergraph" out.mp4
done
Y obtendría un error sobre tmp/dir/1-video
no encontrado (observe que la barra inclinada inicial no estaba en la ruta). Tan pronto como agregué -nostdin
el problema se resolvió.
También tenga en cuenta que, en su ciclo while, casi siempre desea utilizar el indicador -r
, de lo contrario, pueden producirse algunas continuaciones inesperadas de línea nueva.
No analice la salida de ls
, puede usar glob
bing en su lugar. También debe citar las variables para tener en cuenta posibles espacios en blanco en los nombres de archivo:
for input in dr*.mp4; do
output=${input%.mp4}.ffmpeg.mp4
[ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -vc h264 -acodec copy -f mp4 -y "${output}"
output=${input%.mp4}.ffmpeg.flv
[ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -acodec copy -y "${output}"
[...]
done
En cuanto al error que obtienes, según ChangeLog la opción -nostdin
se agregó en ffmpeg 1.0
, por lo que necesitas actualizar tu instalación de ffmpeg
de 0.1x
a 0.1x