0

命令ffmpeg -i file-1.mp4 -vf ass=file-1a.ass burned-1.mp4

用于在 file-1.mp4 视频上刻录 file-1a.ass 字幕。

但是每次我都必须对 40 多个不同的视频和字幕重复相同的命令,并且每次我都必须等待渲染输出。

因此,也许有一种方法可以自动对所有文件重复相同的命令。

找回复发现loop命令 for f in *; do ffmpeg $f;

但我很困惑如何将它与 2 个文件一起使用,.mp4 和 .ass 文件,以及应该具有相同编号的输出文件

我想应该在每对文件上放相同的名称,例如:1.mp4 1.ass 2.mp4 2.ass 3.mp4 3.ass 等

接着 for f in *; do ffmpeg -i $f.mp4 -vf ass=$f.ass $f-output.mp4

但我没有明确的想法

4

1 回答 1

1

你有正确的想法。f == 1.mp4但是如果循环使用 执行,然后再使用执行,则它将不起作用f == 1.ass,依此类推。

因此,您想修改循环以仅迭代 .mp4 文件。然后,您想从 的值中去除.mp4扩展名f,即从 的值中去除最后 4 个字符f,使用${f:0: -4}(这意味着“获取 的子字符串f,从字符 0 开始,在结束前的 5 个字符处结束”)。

您显然想用done. 我还建议将参数括在引号中,以防止分词(也就是说,如果文件名包含某些字符,它们可能会被拆分为 ffmpeg 的多个参数)。

把它们放在一起:

for f in *.mp4; do f=${f%.*}; ffmpeg -i "$f.mp4" -vf ass="$f.ass" "$f-output.mp4"; done

当然,一旦你运行了它,你需要删除所有的输出文件,然后才能再次运行它。或者您可以将输出文件放在不同的目录中开始。


编辑:另一位用户发布了一个答案,该答案似乎已被删除。这是一个很好的答案,但缺乏解释。它与我的答案基本相同,只是它用于${f%.mp4}剥离.mp4扩展名。我的答案可能稍微复杂一些,但效率更高一些,所以这基本上是个人喜好问题。


编辑2:根据洛根评论提供的链接,我做了以下更改:

  1. 删除作业中的引号,因为作业不受分词的影响(这在 bash 手册页中也有说明)。
  2. 用于${f%.*}剥离扩展。这会从末尾删除一个点,后跟任何字符序列。它寻找可能的最短匹配,因此它实际上是在寻找一个点,然后是任何末尾的非点字符序列。
于 2020-10-26T14:00:58.070 回答