Por que o FFmpeg requer nostdin no loop while?

Por que o FFmpeg requer nostdin no loop while?

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:

'while read' percorre linhas no arquivo de texto, perdendo caracteres no script Bash. a linha FFmpeg é a culpada?


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

informação relacionada