有没有更有效的方法通过ffmpeg批量水印和加入视频?

时间:2017-03-28 03:13:38

标签: 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[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

2 个答案:

答案 0 :(得分:1)

单一命令:

s=10;
vec=0.6;
i=0; x=0; y=0; z=0; x1=0; y1=0; z1=0;
for i=1:s
     x(i)=0;
     z(i)=i;
     y(i)=0;
end
angle=60;
j=0;
for j=1:s
if j<vec*s
     x1(j)=0;
     z1(j)=j;
     y1(j)=0;
end
if j>=vec*s
     x1(j)=x(j);
     y1(j)=(z(j)-vec*s)*sind(angle)+y(i)*cosd(angle);
     z1(j)=(z(j)-vec*s)*cosd(angle)-y(i)*sind(angle)+vec*s;
end
end
plot3(x1,y1,z1); xlabel('X axis'); ylabel('Y axis'); zlabel('Z axis');

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
:: make a tempdir
:maketemp
SET "tempdir=%temp%\%random%"
IF EXIST "%tempdir%\" (GOTO maketemp) ELSE (MD "%tempdir%")

:: read each filename from source and process

for %%I in ("%sourcedir%\*.txt") DO (
  TITLE Processing %%I
  START "%%I" q43060025s "%%I"
  CALL :wait 10
)
CALL :wait 1
RD "%tempdir%"

GOTO :EOF

:: monitor number of files in temp directory and return if fewer than %1
:wait
:: wait 1 second
timeout /t 1 >NUL
FOR /f %%c IN ('dir /b /a-d "%tempdir%\*" 2^>nul ^| find /c /v "" ') DO IF %%c geq %1 GOTO wait
GOTO :eof

您需要更改sourcedir的设置以适合您的具体情况。我使用了一些虚拟.txt文件进行测试。

可能是因为您正在连续处理文件而导致时间要求。解决方案是使用现代PC中多核的强大功能并行处理文件。

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

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

@ECHO OFF
SETLOCAL
:: do some operation on the filename passed as %1
title processing %~1
ECHO %time%>"%tempdir%\%~n1"
:: 4 to 21-second delay
SET /a delay=%RANDOM% %% 18 + 4
timeout /t %delay% >NUL
DEL "%tempdir%\%~n1"
CLS
exit

所以 - 这里的子程序是一个虚拟的演示。它使用tempdir并在该目录中创建一个文件,其中包含待处理文件的名称,其中包含某些内容 - 我只是使用了时间。

我的子程序只是延迟了4到21秒,模拟了一个具有可变处理时间的过程。

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

同时,主要程序是监视临时目录中的文件数,即运行的子进程数。只需计算文件数,如果计数大于或等于传递的参数,则等待1秒钟再试一次。

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

当最后一个文件发送完毕后,我们会继续等待,直到我们可以删除临时目录时,子进程的数量为零(即小于1)。

所以 - 您需要做的就是使用q43060025s传递的文件名代替%1中的延迟例程构建您的处理,并解决您的问题。