![Por que o FFmpeg requer nostdin no loop while?](https://rvso.com/image/1606673/Por%20que%20o%20FFmpeg%20requer%20nostdin%20no%20loop%20while%3F.png)
Se eu tiver:
for i in *.mov;
do
ffmpeg -y -i $i -c:v copy -c:a copy ${i%%.mov}.mp4
done
Isso funciona bem. Mas se eu correr:
find . -name "*.ts" -print0 | while read -d $'\0' file;
do
ffmpeg -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done
Isso falha. Eu preciso colocar -nostdin.
find . -name "*.ts" -print0 | while read -d $'\0' file;
do
ffmpeg -nostdin -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done
A documentação explica que isso desativa a interação na entrada padrão e é útil para processos em segundo plano.
Por que o FFmpeg é um processo em segundo plano no segundo caso? Ou há algum outro problema?
Responder1
FFmpeg não é um processo em segundo plano aqui. Ele apenas lê seu arquivo stdin
. Pode não ser, mas acontece. Isso consome caracteres que deveriam ir para read
. Na verdade, você pode enfrentar problemas como este:
A documentação menciona processos em segundo plano porque normalmente você não quereles em particularler stdin
. No seu caso, você não quer que o FFmpeg em primeiro plano leia seu arquivo stdin
.
Responder2
A diferença entre o loop funcional e o não funcional é | que cria um subshell.
Se bem me lembro, resolvi isso simplesmente usandoecho "" | ffmpeg ...
Do ffmpeg man: -stdin Habilite a interação na entrada padrão. Ativado por padrão, a menos que a entrada padrão seja usada como entrada. Para desabilitar explicitamente a interação você precisa 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
é o mesmo queffmpeg ... < /dev/null