bash - FFmpeg 脚本不循环

标签 bash ffmpeg

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

   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/

相关文章:

iphone - ffmpeg avformat_open_input 在设备中不工作

linux - centos强制使用特定版本的JAVA

Bash:变量的所有组合

bash - inotifywait 没有被 supervisorctl stop 杀死

FFmpeg 命令仅适用于 root (centos 6.10)

从 GIF 转换为 MP4 时的 FFmpeg 帧速率

bash - CMP 如何将比较值传递到 bash 脚本中的下一行?

linux - 带有否定条件的 if 语句

linux - 向 BASH 脚本添加本地化语言支持

laravel - 我无法在我的 laravel 项目上安装 ffmpeg 二进制驱动程序