微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

循环连接两个文件的ffmpeg命令

如何解决循环连接两个文件的ffmpeg命令

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

可以在文件1.mp4视频上刻录文件1a.ass字幕。

但是每次我必须对40多种不同的视频和字幕重复相同的命令,并且每次必须等待呈现输出时。

所以也许有一种方法可以自动在所有文件上重复相同的命令。

寻找答复发现了循环命令 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

但是我没有明确的想法

解决方法

您有正确的想法。但是,如果循环使用f == 1.mp4,然后再次使用f == 1.ass,依此类推,则无法正常工作。

因此,您想修改循环以仅遍历.mp4文件。然后,您想从.mp4的值中去除f扩展名,即使用f${f:0: -4}的值中去除后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:基于the link provided by llogan’s comment,我进行了以下更改:

  1. 删除作业中的引号,因为作业不受单词拆分的影响(bash手册页中也有说明)。
  2. 使用${f%.*}删除扩展名。这会去除一个点,然后从末尾去除任何字符序列。它会寻找最短的匹配项,因此它实际上是在寻找一个点,最后是任何非点字符序列。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。