2012-12-21 61 views
8

我有我创建处理从文件夹中的录像的bash脚本,它的子文件夹:猛砸while循环等待,直到任务完成

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

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

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

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

+0

可能会在'ffmpeg'命令末尾使用'&'在后台粘贴进程? – squiguy

+0

你有什么应该等待ffmpeg完成。你确定你没有从ffmpeg得到一个错误(如无效的参数)吗? – Mat

+3

循环就像你一样,应该等到每个内部命令运行,除非你在行尾加上了&。你有没有收到任何错误信息?尝试使用“echo”预处理内部命令并在其后添加睡眠1,以验证该循环本身没有问题。例如,在你给的命令行中,你使用'file'而不是'$ file' – user295691

回答

3

我意识到我前一段时间发布的,但我找到了解决办法。感谢所有的答复。将-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的解决方案!

3

我认为这很简单,因为您在file之前错过了$

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

这对你有好处吗?

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

我是一个恶毒的回答抢劫犯。我发现一个:

ffmpeg -i $file & 
wait $! 

由于赵朴初,在这里:apply ffmpeg to many files

+0

这是一个有趣的方法,我将不得不尝试这个。谢谢!我发现提供ffmpeg param -nostdin做了诀窍。 – mac2017