如果我有:
for i in *.mov;
do
ffmpeg -y -i $i -c:v copy -c:a copy ${i%%.mov}.mp4
done
这运行良好。但是如果我运行:
find . -name "*.ts" -print0 | while read -d $'\0' file;
do
ffmpeg -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done
这失败了。我需要输入-nostdin。
find . -name "*.ts" -print0 | while read -d $'\0' file;
do
ffmpeg -nostdin -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done
文档解释说这会禁用标准输入上的交互,并且对后台进程很有帮助。
为什么FFmpeg在第二种情况下是后台进程?还是有其他问题?
FFmpeg 在这里不是后台进程。它只是读取它的
stdin
. 可能不是,但确实如此。这会消耗应该去的字符read
。实际上,您可能会遇到这样的问题:'while read' 循环遍历 Bash 脚本中丢失字符的文本文件中的行。FFmpeg 线是罪魁祸首吗?
该文档提到了后台进程,因为通常您不希望它们特别阅读
stdin
. 在您的情况下,您不希望前台 FFmpeg 读取其stdin
.工作循环和非工作循环之间的区别是 | 它创建了一个子外壳。
如果我没记错的话,我已经通过简单地使用来解决它
echo "" | ffmpeg ...
echo "" | ffmpeg
是相同的ffmpeg ... < /dev/null