Batch file 有没有一种更有效的方法可以通过ffmpeg对大量视频进行水印和连接?

Batch file 有没有一种更有效的方法可以通过ffmpeg对大量视频进行水印和连接?,batch-file,cmd,ffmpeg,Batch File,Cmd,Ffmpeg,我有一个批处理文件,它使用ffmpeg在我的视频中添加一个徽标,然后添加一个介绍,但这需要10个小时到一天的时间,这取决于我需要添加多少水印,有没有更有效的方法来实现这一点?视频有时有不同的分辨率,所以我无法删除到1280*720大小的转换 for %%I in ("C:\Users\Administrator\Desktop\work\*.mp4") do ffmpeg.exe -y -i "%%I" -i white.png -filter_complex "[0:v]scale=iw:ih

我有一个批处理文件,它使用ffmpeg在我的视频中添加一个徽标,然后添加一个介绍,但这需要10个小时到一天的时间,这取决于我需要添加多少水印,有没有更有效的方法来实现这一点?视频有时有不同的分辨率,所以我无法删除到1280*720大小的转换

for %%I in ("C:\Users\Administrator\Desktop\work\*.mp4") do ffmpeg.exe -y -i "%%I" -i white.png -filter_complex "[0:v]scale=iw:ih[v0];[1:v][v0]scale2ref=iw/6:ih/18[logo][0v];[0v][logo]overlay=W-w-3:H-h-1[v]" -map "[v]" -map 0:a -codec:v libx264 -preset ultrafast -crf 23 -codec:a copy "C:\Users\Administrator\Desktop\Complete-videos\%%~nI.mp4"

for %%I in ("C:\Users\Administrator\Desktop\work\*.mp4") do ffmpeg -y -i %%I -c copy -vbsf h264_mp4toannexb -f mpegts -s 1280*720 %%I.ts && ffmpeg -y -i "concat:out1.ts|%%I.ts|out1.ts" -c:v libx264 -strict experimental -bsf:a aac_adtstoasc -ar 48000 -r 20 "C:\Users\Administrator\Desktop\Complete-videos\%%~nI.mp4"
pause
单一命令:

ffmpeg -i main.mp4 -i white.png -i out1.ts -filter_complex
  "[1][0]scale2ref=iw/6:ih/18[logo][0v];[0v][logo]overlay=W-w-3:H-h-1,scale=hd720[vid];
   [2][2:a][vid][0:a][2][2:a]concat=n=3:v=1:a=1[v][a]"
-map "[v]" -map "[a]" -r 20 -preset fast -ar 48000 out.mp4
@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
::做一个临时工
:maketemp
设置“tempdir=%temp%\%random%”
如果存在“%tempdir%”(转到maketemp)ELSE(MD“%tempdir%”)
::从源和进程读取每个文件名
对于“%sourcedir%\*.txt”中的%%I,请执行以下操作(
标题处理%%I
启动“%%I”Q4300025S“%%I”
电话:等10分钟
)
电话:等等1
RD“%tempdir%”
后藤:EOF
::监视临时目录中的文件数,如果少于%1,则返回
:等等
::等一秒钟
超时/t1>num
对于/f%%c IN('dir/b/a-d”%tempdir%\*“2^>num^ find/c/v”“),如果%%c geq%1转到等待,请执行此操作
后藤:eof
您需要更改
sourcedir
的设置以适应您的环境。我使用了一些虚拟
.txt
文件进行测试

时间要求可能是因为您正在连续处理文件而造成的。解决方案是利用现代PC中多核的能力并行处理文件

这里的想法是创建一个包含控制文件的临时目录,然后使用一个子过程批处理每个文件(
q43060025s.bat

子过程继承调用过程的环境,因此将建立
tempdir

@ECHO关闭
SETLOCAL
::对作为%1传递的文件名执行一些操作
标题处理%1
回显%time%>%tempdir%\%~n1
::4到21秒延迟
设置/a延迟=%RANDOM%%%18+4
超时/t%延迟%>NUL
删除“%tempdir%\%~n1”
CLS
出口
这里的子过程是一个用于演示的虚拟过程。它使用
tempdir
并在该目录中创建一个文件,文件名为要处理的文件,其中包含一些内容-我刚刚用过时间

然后,我的子过程简单地延迟4到21秒,模拟具有可变处理时间的某个进程

然后删除它创建的文件并终止

同时,主程序监视临时目录中的文件数,即正在运行的子进程数。只需对文件进行计数,如果计数大于或等于传递的参数,请等待1秒,然后重试

当子过程完成其工作时,计数将减少,并且
:wait
例程将退出。选择下一个文件,将其发送到子进程,然后我们再次等待

当最后一个文件被发送时,我们继续等待,直到子进程的计数为零(即小于1)时,我们才能删除临时目录


因此-您需要做的就是使用作为
%1
传递的文件名来构造处理程序,以代替
q43060025s
中的延迟例程,您的问题应该得到解决。

应该询问一个关于改进已在工作的代码的问题。在您的第一个命令中,为什么要使用第一个缩放过滤器?在第二个命令中,在复制流时,“大小”选项无效。您可以在一个命令中完成所有这一切,并跳过一个视频编码步骤。您的最终编码步骤可以使用快速预设。质量没有太大差别。第一个命令的结果不会被第二个命令覆盖吗?是的,我希望它用更新的版本覆盖自己,第一个缩放过滤器是将水印缩放到视频,然后将其放置在右下角。@Mulvya你说我可以用一个命令来完成,我同意,但是,我该怎么做?我试着在那里打了一个&&这样它就可以在视频中添加水印,并立即将介绍添加到视频中,但它没有正常工作。回答得很好!我没有想到要并行实现它,我将看看我是否可以调整我的代码以这样的方式工作。