Как комбинировать и оптимизировать фильтры ffmpeg, чтобы избежать многократного кодирования?

Я никогда раньше не работал с ffmpeg, и мне интересно, какую оптимизацию я могу использовать для моей ситуации.

В цикле у меня есть несколько файлов input.mp4, которые я сначала конвертирую один за другим, чтобы иметь общий масштаб и скорость звука с помощью этой команды:

ffmpeg -i input_01.mp4 -vf 'scale=1280:720,setdar=16/9' -ar 44100 -ac 1 input_01_tmp.mp4

Позже я снова добавляю изображения в каждый файл input.mp4 по одному:

ffmpeg -i input_01_tmp.mp4 -i input_01_logo.png -filter_complex "[0:v][1:v]overlay=10:10:enable='between(t,2,11)',fade=t=in:start_time=1.5:d=0.5:alpha=1,fade=t=out:start_time=10.5:d=0.5:alpha=1[fg];[0][fg]overlay=format=auto,format=yuv420p" -c:a copy input_01_unified.mp4

Наконец, после цикла я объединяю их с помощью mkvmerge:

mkvmerge -o output.mkv \+ input_01_unified.mp4 +\ input_02_unified.mp4 ...

Я уверен, что это не оптимальное решение, и мне интересно, как мне его изменить.

Можно ли сделать все это одной командой? Либо для каждого файла, либо для всего процесса.

Можно сделать одной командой. Поделитесь всей командой для 1-го и 2-го шага
@Gyan спасибо! добавил недостающие части в команды в вопросе

Ответы (1)

Одна команда будет длинной, но вот пример для 3 входов.

ffmpeg -i input_01.mp4 -loop 1 -t 11 -i input_01_logo.png
       -i input_02.mp4 -loop 1 -t 11 -i input_02_logo.png
       -i input_03.mp4 -loop 1 -t 11 -i input_03_logo.png
       -filter_complex
        "[0]scale=1280:720,setsar=1[0v];
         [1]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[0l];
         [2]scale=1280:720,setsar=1[1v];
         [3]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[1l];
         [4]scale=1280:720,setsar=1[2v];
         [5]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[2l];
         [0v][0l]overlay=10:10:format=auto:enable='between(t,2,11)'[0vl];
         [1v][1l]overlay=10:10:format=auto:enable='between(t,2,11)'[1vl];
         [2v][2l]overlay=10:10:format=auto:enable='between(t,2,11)'[2vl];
         [0]pan=1c,aresample=r=44100[0a];
         [2]pan=1c,aresample=r=44100[1a];
         [4]pan=1c,aresample=r=44100[2a];
         [0vl][0a][1vl][1a][2vl][2a]concat=n=2:v=1:a=1[v][a]"
        -map "[v]" -map "[a]" -pix_fmt yuv420p output.mkv

Вам могут понадобиться одинарные кавычки в mapзависимости от вашей оболочки.

Используйте последнюю версию ffmpeg, не ниже 4.0.

Спасибо! Я попробую это сегодня и приму ответ. Помимо экономии времени, повлияло ли это на лучшее качество по сравнению с тем, что я сделал?
Спасибо @Gyan, я не забыл и принял ответ. Очень ценю вашу помощь <3
Для уточнения, полезно ли комбинировать такие фильтры? Гарантирует ли это, что все будет сделано за одно кодирование, или все равно будет кодироваться несколько раз, как если бы каждая операция выполнялась отдельно?
Да, это стандартный метод, который выполняет только одну операцию кодирования после всей фильтрации.
Что, если у нас есть несколько сотен входных файлов и преодолено ограничение на количество символов в командной строке (например, в Windows это 8192 символа). «filter_complex» можно записать в файл и вместо этого использовать «-filter_complex_script». А как насчет команд "-loop"? Есть ли способ как-то "сжать" петли? Или другой способ получить тот же результат с более короткой командной строкой? Я спрашиваю, потому что у меня есть эта конкретная проблема прямо сейчас...