Loops 循环连接两个文件的ffmpeg命令
命令Loops 循环连接两个文件的ffmpeg命令,loops,ffmpeg,video-subtitles,Loops,Ffmpeg,Video Subtitles,命令ffmpeg-i file-1.mp4-vf ass=file-1a.ass-1.mp4 用于在file-1.mp4视频中刻录file-1a.ass字幕 但每次我都要在40多个不同的视频和字幕上重复相同的命令,每次我都要等待渲染输出 因此,也许有一种方法可以自动在所有文件上重复相同的命令 查找答复时,找到了loop命令 用于f in*;不要忘记$f 但我不知道如何将它与2个文件一起使用,即.mp4和.ass文件,以及应该具有相同编号的输出文件 我想应该在每两个文件上使用相同的名称,例如: 1
ffmpeg-i file-1.mp4-vf ass=file-1a.ass-1.mp4
用于在file-1.mp4视频中刻录file-1a.ass字幕
但每次我都要在40多个不同的视频和字幕上重复相同的命令,每次我都要等待渲染输出
因此,也许有一种方法可以自动在所有文件上重复相同的命令
查找答复时,找到了loop命令
用于f in*;不要忘记$f代码>
但我不知道如何将它与2个文件一起使用,即.mp4和.ass文件,以及应该具有相同编号的输出文件
我想应该在每两个文件上使用相同的名称,例如:
1.mp4 1.ass
2.mp4.2.ass
3.mp4.3.ass
等
然后
用于f in*;do ffmpeg-i$f.mp4-vf ass=$f.ass$f-output.mp4
但是我不清楚你的想法是对的。但是如果循环以f==1.mp4
执行,然后再次以f==1.ass
执行,那么它将不起作用
因此,您希望修改循环以仅迭代.mp4文件。然后您想从f
的值中去掉.mp4
扩展名,也就是说,使用${f:0:-4}
从f
的值中去掉最后4个字符(这意味着“获取f
的子字符串,从字符0开始,在结尾前5个字符结束”)
显然,您希望使用done
终止循环。我还建议将参数用引号括起来,以防止分词(也就是说,如果文件名包含某些字符,它们可能会被拆分为ffmpeg的多个参数)
总而言之:
用于*.mp4中的f;dof=${f%.*};ffmpeg-i“$f.mp4”-vf ass=“$f.ass”“$f-output.mp4”;完成
当然,一旦您运行了它,您需要在再次运行它之前除去所有的输出文件。或者,您可以将输出文件放在不同的目录中开始
编辑:另一个用户发布了一个答案,该答案似乎已被删除。这是一个很好的回答,但缺乏解释。它与我的答案基本相同,只是它使用了${f%.mp4}
来剥离.mp4
扩展名。我的答案可能稍微复杂一点,但效率稍高一点,所以这基本上是个人偏好的问题
编辑2:基于,我做了以下更改:
删除赋值中的引号,因为赋值不会进行分词(bash手册页中也有说明)
使用${f%.*}
删除扩展名。这将从结尾处去除一个点,后跟任意字符序列。它寻找尽可能短的匹配,所以它实际上是在寻找一个点,然后在结尾处寻找任何非点字符序列
您可以通过添加-c:copy
输出选项来提高效率,从而复制音频,而不是不必要地重新编码。可惜另一个答案被删除了。它是用来处理扩展的,在一般意义上更健壮,然后切掉一定数量的字符。非常感谢。llogan评论-c:副本:如何判断它是否工作?@user3428634请参阅控制台输出。查找流映射:Stream#0:0->#0:0(h264(本机)->h264(libx264))Stream#0:1->#0:1(副本)
@user3428634在这里,我们感谢您的支持而不是“谢谢!”。请点击那个按钮,或者,更好的是,将这个答案标记为已接受。