我在一个目录中有多个视频和子文件。
我的目标是将字幕嵌入到每个视频中。
我在目录中的实例:
A.mp4
A.ass
B.mp4
B.ass
C.mp4
C.ass
.
.
Z.mp4
Z.ass
我的脚本:
for f in *.mp4; do base=$(basename ${$f%.mp4}) ffmpeg -i $base.mp4 \
-vf "ass=$base.ass" 222$base.mp4; done;
它仅适用于第一个文件,当进程完成时,它会要求我覆盖输出文件。你能解释一下为什么会这样吗?
最佳答案
base
被解释为 $(basename ${$f%.mp4}) ffmpeg -i $base.mp4
(至少),而不仅仅是 $(basename ${$f%.mp4})
.
懒惰的解决方案
添加分号:
for f in *.mp4; do base=$(basename "$f" .mp4); ffmpeg -i "$base.mp4" -vf "ass=$base.ass" "222$base.mp4"; done
或者,将命令分成多行以分隔
base
从命令。我还做了一些与主要问题无关的额外小改动(正确引用,更正 baseline
用法,流复制音频而不是重新编码)。使用 shellcheck 检查您的原始命令/脚本以获得更深入的解释和解决方案。
更好的解决方案
消除无关的
basename
加工使用parameter expansion反而:for f in *.mp4; do ffmpeg -i "$f" -vf "ass=${f%.*}.ass" -c:a copy "222${f%.*}.mp4"; done
这更有效,更短。
关于bash - FFmpeg 脚本不循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50189072/