bash 循环中的 ffmpeg 问题

bash 循环中的 ffmpeg 问题

当运行以下命令行将多个 .mkv 文件转换为 .mp4 文件时,出现问题。就好像脚本试图同时运行所有命令,或者它们以某种方式相互纠缠在一起,并且输出变得混乱。我不太清楚。当我刚才运行这个时,只转换了第一个文件。其他时候,我似乎会得到意想不到的或随机的结果。

ls -1 *.mkv | while read f; do ffmpeg -i "$f" -codec copy "${f%.*}.mp4"; done

但是,如果我执行以下操作,事情就会按预期进行:

ls -1 *.mkv | while read f; do echo ffmpeg -i \"$f\" -codec copy \"${f%.*}.mp4\"; done > script; bash script

但为什么?它与什么有关ffmpeg? bash 循环和其他命令不会发生这种情况ffmpeg。我想用一种简单的方法来做到这一点,而无需转义引号、管道到脚本文件等。

答案1

ffmpeg也从标准输入读取,消耗用于read.将其输入重定向自/dev/null

... | while read f; do ffmpeg -i "$f" -codec copy "${f%.*}.mp4" < /dev/null; done

也就是说,不要像这样读取输出ls。一个简单的 for 循环就足够了(并消除了原来的问题)。

for f in *.mkv; do
    ffmpeg -i "$f" -codec copy "${f%.*}.mp4"
done

相关内容