【问题标题】:Bash while loop wait until task has completedBash while 循环等待任务完成
【发布时间】:2012-12-09 08:42:34
【问题描述】:

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

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

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

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

还有文件 --> $file 是复制/粘贴错字。

【问题讨论】:

  • 也许在ffmpeg 命令末尾使用& 将进程粘贴在后台?
  • 你所拥有的应该等待 ffmpeg 完成。您确定您没有收到来自 ffmpeg 的错误(例如无效参数)吗?
  • 您拥有的循环应该等到每个内部命令运行,除非您在行尾放置了&。您收到任何错误消息吗?尝试在内部命令前加上“echo”并在其后添加 sleep 1,以验证循环本身没有问题。例如,在您提供的命令行中,您使用的是file 而不是$file
  • -nostdin 选项添加到ffmpeg 有帮助吗?它可能正在读取 while 循环的所有其余输入。
  • 谢谢巴马尔。成功了!

标签: bash ffmpeg while-loop


【解决方案1】:

我意识到我不久前发布了这个,但我找到了解决方案。感谢所有的回复。将 -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 的解决方案!

【讨论】:

    【解决方案2】:

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

    ffmpeg -i $file &
    wait $!
    

    感谢 puchu,这里:apply ffmpeg to many files

    【讨论】:

    • 这是一个有趣的方法,我必须尝试一下。谢谢!我发现提供 ffmpeg 参数 -nostdin 可以解决问题。
    【解决方案3】:

    这对你有好处吗?

    find . -type f -name '*.mkv' -exec ffmpeg -i {} \;
    

    【讨论】:

      【解决方案4】:

      我认为这就像您在file 之前缺少$ 一样简单。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多