如何使用Windows批处理脚本连接所有ffmpeg输入而不将它们映射到过滤器中?

时间:2019-05-31 15:38:07

标签: batch-file ffmpeg

我正在使用Windows批处理文件脚本对多个文件运行ffmpeg concat筛选器的多次运行。我并不总是知道确切需要连接多少个文件,问题是ffmpeg不会自动连接输入,除非您将它们全部映射。例如,如果我必须加入八个文件,则使用以下过滤器映射方案:

 -filter_complex "[0][1][2][3][4][5][6][7]concat=n=8:v=1:a=0"

如果以后在脚本中仅需加入4个文件,则必须将其更改为:

 -filter_complex "[0][1][2][3]concat=n=4:v=1:a=0"

我希望不输入任何映射将自动按顺序输入所有输入。我很失望地发现它只占用前两个,而忽略其余的。我简单地尝试过:

 -filter_complex "concat"

并根据警告“猜测”映射,但在第二次之后完全忽略了所有输入。

没有办法单独使用ffmpeg来执行此操作,因此我正在寻找一种使用Windows批处理脚本来执行此操作的方法。


完整而有效的命令示例如下:

set commands=-filter_complex "[0][1][2][3][4][5][6][7]concat=n=8:v=1:a=0","crop=1064:800" /
-crf 30 -an -movflags +faststart -loglevel quiet -stats

ffmpeg -ss 00:00:36.737 -t 00:13:33.630 -i 1201.avi /
-ss 00:00:00.000 -t 00:13:51.397 -i 1202.avi /
-ss 00:00:00.033 -t 00:13:06.052 -i 1203.avi /
-ss 00:00:00.000 -t 00:17:31.617 -i 1204.avi /
-ss 00:17:31.551 -t 00:00:00.067 -i 1204.avi /
-ss 00:00:00.000 -t 00:15:07.907 -i 1205.avi /
-ss 00:15:07.840 -t 00:00:00.067 -i 1205.avi /
-ss 00:00:00.000 -t 00:02:36.990 -i 1206.avi /
%commands% 12-concat.mp4

我的目标是在脚本中设置一次commands(和/或其他变量),而不必每次命令输入或多或少都需要更改它。

1 个答案:

答案 0 :(得分:0)

@echo off
setlocal enabledelayedexpansion

if not exist "inputs.txt" (
    >&2 echo File inputs.txt not found.
    exit /b 1
)

set /p "savefile=Save file: "

set "inputs="

for /f "tokens=1-3" %%A in (inputs.txt) do (
    set "inputs=!inputs!-ss %%~A -t %%~B -i %%~C "
)

call :buildcommands 8 1064:800 30

echo ffmpeg %inputs% %commands% %savefile%
exit /b 0


:buildcommands  maps  [width:height]  [crf]
setlocal enabledelayedexpansion
set /a "ubound=%~1-1"
set "crop=%~2"
set "crf=%~3"
set "maps="

rem Set defaults if not defined.
if not defined crop set "crop=1280:720"
if not defined crf set "crf=23"

rem Build maps string.
for /l %%A in (0 1 %ubound%) do set "maps=!maps![%%~A]"

rem Build entire string.
set commands=-filter_complex "%maps%concat=n=%~1:v=1:a=0","crop=%crop%"^
 -crf %crf% -an -movflags +faststart -loglevel quiet -stats

rem Set global commands.
endlocal & set commands=%commands%
exit /b 0

这将从文件和命令中构建输入 call个参数。

您可以通过以下方式使用预设的默认值:

call :buildcommands 8

因此作物为1280:720,恒定比率因子为23

input.txt就像:

00:00:36.737 00:13:33.630 1201.avi
00:00:00.000 00:13:51.397 1202.avi
00:00:00.033 00:13:06.052 1203.avi
00:00:00.000 00:17:31.617 1204.avi
00:17:31.551 00:00:00.067 1204.avi
00:00:00.000 00:15:07.907 1205.avi
00:15:07.840 00:00:00.067 1205.avi
00:00:00.000 00:02:36.990 1206.avi

主要是数据,所以我不知道你如何 可以改善脚本的输入。

删除ffmpeg前面的回声以使其起作用,而不仅仅是回声。