ffmpeg 在 while 循环内使用 find 无意中改变了迭代变量

ffmpeg 在 while 循环内使用 find 无意中改变了迭代变量

有人可以向我解释一下这里发生了什么吗?这就是我将我的情况简化为:

# make 20 test gifs out of the same source file.
for i in {1..20}; do cp -p ../some-random-source-file.gif "${i}.gif"; done

# grab, then process them.
while read f; do echo "→ $f"; ffmpeg -i "$f"  -y  -loglevel quiet  "same.mp4"; done < <(find .  -maxdepth 1  -type f  -iname "*.gif"  -printf "%f\n")
→ 11.gif
→ .gif
→ 9.gif
→ .gif
→ 14.gif
→ 9.gif
→ 0.gif
→ 13.gif
→ 7.gif
→ 5.gif
→ 2.gif
→ .gif
→ 3.gif
→ 0.gif
→ 16.gif
→ .gif
→ 8.gif
→ 8.gif
→ .gif
→ 4.gif

我正在尝试处理目录中包含混合文件(gif 和非 gif)的所有 gif。但由于某种原因,当我添加该ffmpeg步骤时,变量的内容$f有时会在开始时被切断。


额外信息:

  • 我正在使用进程替换,因为我还记录了不起作用的文件。if ! ffmpeg …; then FAILED+=("$f"); fi
  • 我还通过字符串替换生成新的文件名${f%.gif}.mp4,但是......事实证明:该部分甚至与问题的发生无关。
  • bash 版本 5.1.16

我理解流程替换可能会导致计时问题– 但为什么它会随机切断变量一开始而不是最后?如果这个结构如此不可靠,怎么会有人使用它呢?我还能怎样做呢?

答案1

ffmpeg默认读取 stdin,因此会消耗一些字符。您应该添加标志-nostdin

ffmpeg -nostdin -i "$f"  -y  -loglevel quiet

相关内容