Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 循环连接两个文件的ffmpeg命令_Loops_Ffmpeg_Video Subtitles - Fatal编程技术网

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在这里,我们感谢您的支持而不是“谢谢!”。请点击那个按钮,或者,更好的是,将这个答案标记为已接受。