当逐行读取文件时,我只能在第一行执行ffmpeg

时间:2016-04-12 21:28:30

标签: bash video ffmpeg

我正在写一个Bash脚本,我在其中逐行读取文件(确切地说,<(find /home/user/ -iname "*.MP4")),对于我执行ffmpeg的每一行,我正在做某事像这样:

while read -r line; do
    ffmpeg -i "$line" [ MORE OPTIONS ... ]
done < <(find /home/user/ -iname "*.MP4")

虽然由于某种原因,只有第一行正在成功处理。

知道为什么我的代码会忽略所有其他行吗?

1 个答案:

答案 0 :(得分:5)

这是ffmpeg的特殊行为导致的常见问题(也发生在ssh)。

引自Bash FAQ 89处理你的案件几乎完全

  

这里发生了什么?我们来看第一个例子。 read从标准输入(FD 0)读取一行,将其放入file参数,然后执行ffmpeg。 与从BASH执行的任何程序一样,ffmpeg继承标准输入 ,由于某种原因它会读取。我不知道为什么。但无论如何,当ffmpeg读取stdin时, 会从find命令中吸取所有输入,使循环不足

TL; DR:

有两个主要选项:

  • </dev/null行(即ffmpeg)末尾添加ffmpeg -i "$line" [ MORE OPTIONS ] ... </dev/null将解决问题,并使ffmpeg按预期行事。< / p>

  • readFile Descriptor读取一个随机程序不太可能使用的内容:

       while IFS= read -r line <&3; do
           # Here read is reading from FD 3, to which 'file' is redirected.
       done 3<file