¿Por qué FFmpeg requiere nostdin en el bucle while?

¿Por qué FFmpeg requiere nostdin en el bucle while?

Si tengo:

for i in *.mov;
do
ffmpeg -y -i $i -c:v copy -c:a copy ${i%%.mov}.mp4
done

Esto funciona bien. Pero si ejecuto:

find . -name "*.ts" -print0 | while read -d $'\0' file;
do
  ffmpeg -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done

Esto falla. Necesito poner -nostdin.

find . -name "*.ts" -print0 | while read -d $'\0' file;
do
  ffmpeg -nostdin -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done

La documentación explica que esto deshabilita la interacción en la entrada estándar y es útil para procesos en segundo plano.

¿Por qué FFmpeg es un proceso en segundo plano en el segundo caso? ¿O hay algún otro problema?

Respuesta1

FFmpeg no es un proceso en segundo plano aquí. Simplemente lee su stdin. Puede que no, pero lo hace. Esto consume caracteres que deberían ir a read. De hecho, puedes experimentar problemas como este:

'mientras se lee' recorre líneas en un archivo de texto perdiendo caracteres en el script Bash. ¿Es la línea FFmpeg la culpable?


La documentación menciona procesos en segundo plano porque generalmente no deseaellos en particularleer stdin. En su caso, no desea que FFmpeg en primer plano lea su archivo stdin.

Respuesta2

La diferencia entre el bucle de trabajo y el que no funciona es el | lo que crea una subcapa.

Si no recuerdo mal, lo he solucionado simplemente usandoecho "" | ffmpeg ...

De ffmpeg man: -stdin Habilita la interacción en la entrada estándar. Activado de forma predeterminada a menos que se utilice una entrada estándar como entrada. Para deshabilitar explícitamente la interacción, debe especificar "-nostdin".

       Disabling interaction on standard input is useful, for example, if ffmpeg is in the background process
       group. Roughly the same result can be achieved with "ffmpeg ... < /dev/null" but it requires a shell.

echo "" | ffmpeges lo mismo queffmpeg ... < /dev/null

información relacionada