gpt4 book ai didi

bash - FFmpeg 脚本不循环

转载 作者:行者123 更新时间:2023-12-04 23:25:35 24 4
gpt4 key购买 nike

我在一个目录中有多个视频和子文件。
我的目标是将字幕嵌入到每个视频中。
我在目录中的实例:

   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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com