bash loops ffmpeg stdin

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