![¿Por qué FFmpeg requiere nostdin en el bucle while?](https://rvso.com/image/1606673/%C2%BFPor%20qu%C3%A9%20FFmpeg%20requiere%20nostdin%20en%20el%20bucle%20while%3F.png)
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:
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 "" | ffmpeg
es lo mismo queffmpeg ... < /dev/null