Как объединить все входные данные ffmpeg, не отображая их в фильтре, используя пакетный скрипт Windows? - PullRequest
0 голосов
/ 31 мая 2019

Я запускаю несколько запусков фильтра ffmpeg concat для нескольких файлов, используя сценарий пакетного файла Windows.Я не всегда знаю, сколько именно файлов нужно объединить, и проблема в том, что 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 голосов
/ 01 июня 2019
@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, чтобы оно заработало, а не просто эхо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...