9

我创建了一个 bash 脚本,用于处理文件夹及其子文件夹中的视频:

find . -type f -name '*.mkv' | while read file;
do
  ffmpeg -i $file ...
done

问题:而不是等待 ffmpeg 完成的 while 循环,它继续遍历循环。最终结果是,文件没有得到处理。我需要一种方法让当前的 while 循环迭代等到 ffmpeg 完成,然后再继续下一个。或者另一种方式来排队这些项目。

编辑:所以迭代一组文件时的解决方案是将 -nostdin 参数传递给 ffmpeg。希望这可以帮助其他可能遇到类似问题的人。

文件 --> $file 也是一个复制/粘贴错字。

4

4 回答 4

8

我意识到我不久前发布了这个,但我找到了解决方案。感谢所有的回复。将 -nostdin 参数提供给 ffmpeg 就可以了。在移动到下一个文件进行处理之前,它将只处理当前文件。

ffmpeg 的 -nostdin 选项可避免尝试从标准输入读取用户输入,否则会解释视频文件本身。

ffmpeg -i <filename> ... -nostdin

使用上面的最好的部分是你可以继续使用详细程度,以防输出中抛出错误:

ffmpeg -i <filename> ... -nostdin -loglevel panic 

或者,如果您希望将输出报告到文件中,请这样做:

# Custom log name (optional). Helpful when multiple files are involved.
# FFREPORT=./${filename}-$(date +%h.%m.%s).log
ffmpeg -i <filename> ... -nostdin -report

您也可以将两者结合使用。还要感谢@Barmar 的解决方案!

于 2015-07-30T20:42:08.557 回答
3

这对你有好处吗?

find . -type f -name '*.mkv' -exec ffmpeg -i {} \;
于 2012-12-21T19:24:39.200 回答
3

我认为这就像你错过$之前一样简单file

find . -type f -name '*.mkv' | while read file;
do
    ffmpeg -i $file ...
done
于 2012-12-21T19:15:16.630 回答
3

我是一个恶毒的答案抢夺者。我找到了一个:

ffmpeg -i $file &
wait $!

感谢puchu,在这里:将ffmpeg应用于许多文件

于 2013-06-04T15:12:10.097 回答