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 executar:
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?
O FFmpeg não é um processo em segundo plano aqui. Ele apenas lê seu arquivo
stdin
. Pode não ser, mas é. Isso consome caracteres que deveriam ir pararead
. Na verdade, você pode enfrentar problemas como este:'while read' percorre as linhas no arquivo de texto perdendo caracteres no script Bash. a linha FFmpeg é a culpada?
A documentação menciona processos em segundo plano porque geralmente você não deseja que eles leiam arquivos
stdin
. No seu caso, você não deseja que o FFmpeg em primeiro plano leia seus arquivosstdin
.A diferença entre o loop de trabalho e o não-funcional é o | que cria um sub shell.
Se bem me lembro, resolvi simplesmente usando
echo "" | ffmpeg ...
echo "" | ffmpeg
é o mesmo queffmpeg ... < /dev/null