有人可以向我解释一下这里发生了什么吗?这就是我将我的情况简化为:
# 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