如何解决循环连接两个文件的ffmpeg命令
命令ffmpeg -i file-1.mp4 -vf ass=file-1a.ass burned-1.mp4
但是每次我必须对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,我进行了以下更改:
- 删除作业中的引号,因为作业不受单词拆分的影响(bash手册页中也有说明)。
- 使用
${f%.*}
删除扩展名。这会去除一个点,然后从末尾去除任何字符序列。它会寻找最短的匹配项,因此它实际上是在寻找一个点,最后是任何非点字符序列。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。