Объединение видео с помощью ffmpeg с использованием кроссфейдов и простых нарезок

Я пишу скрипт для объединения/нарезки произвольных видеофайлов из S3 в одно выходное видео. До сих пор я делал это, сначала обрезая видео до нужной длины, используя ffmpeg -i input-X.mp4 -ss start -t duration slice-X.mp4, и рекомбинируя полученные фрагменты с помощью фильтра ffmpeg concat.

Я хочу иметь возможность плавно переходить между видео. concat не поддерживает переходы. Как лучше всего комбинировать видео с переходами и переходами в командной строке Linux? Является ли ffmpeg лучшим инструментом для работы?

Мой вопрос похож на "Как сделать вы создаете плавный переход между несколькими видео в FFMPEG?" но мне не обязательно использовать ffmpeg. Кроме того, я хочу иметь возможность переходить между некоторыми фрагментами и резать между другими.


person Zach Bloomquist    schedule 07.03.2016    source источник


Ответы (2)


Ниже приведен шаблон одношаговой команды, предполагающий пять срезов.

ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 \
-filter_complex \
"[0:v]trim=0.5:4.5,setpts=PTS-STARTPTS[1]; \
 [1:v]trim=12:17,setpts=PTS-STARTPTS+(3/TB),format=yuva420p,fade=in:st=3:d=1:alpha=1[2]; \
 [2:v]trim=34.1:36,setpts=PTS-STARTPTS+(7/TB),format=yuva420p,fade=in:st=7:d=1:alpha=1[3]; \
 [3:v]trim=21:25,setpts=PTS-STARTPTS[4]; \
 [4:v]trim=27:31,setpts=PTS-STARTPTS+(3/TB),format=yuva420p,fade=in:st=0:d=1:alpha=1[5]; \
 [0:a]atrim=0.5:4.5,asetpts=PTS-STARTPTS[1a]; \
 [1:a]atrim=12:17,asetpts=PTS-STARTPTS[2a]; \
 [2:a]atrim=34.1:36,asetpts=PTS-STARTPTS[3a]; \
 [3:a]atrim=21:25,asetpts=PTS-STARTPTS[4a]; \
 [4:a]atrim=27:31,asetpts=PTS-STARTPTS[5a]; \
 [1][2]overlay,format=yuv420p[12]; \
 [12][3]overlay,format=yuv420p[123]; \
 [4][5]overlay,format=yuv420p[45]; \
 [1a][2a]acrossfade=d=1[12a]; \
 [12a][3a]acrossfade=d=1[123a]; \
 [4a][5a]acrossfade=d=1[45a]; \
 [123][123a][45][45a]concat=n=2:v=1:a=1[v][a]" \
-map [v] -map [a] SingleStepOutput.mp4

Я ввел видео несколько раз, по одному разу для каждого фрагмента, потому что использование одной панели ввода (даже с split/asplit) приводит к переполнению буфера.

Фильтры setpts/asetpts используются, потому что trim/atrim переносят исходные метки времени. Фильтры setpts смещены для фрагментов, которые должны постепенно появляться. Значением смещения является preceding slide duration - crossfade duration. yuva420p необходим для создания альфа-канала, значение которого фактически модулируется фильтром затухания.

person Gyan    schedule 09.03.2016

В итоге я сделал это, повторяя каждый фрагмент и добавляя каждый во временный выходной файл.

[вывод] ‹-- копировать фрагмент 1
[вывод] ‹-- вырезать фрагмент 2 на выходе
[выход][слайс 2] ‹-- добавить фрагмент 3 на выход
[вывод][ срез 2][кроссфейд][срез 3] ‹-- переход слайса 4 на выход и т. д.

Таким образом, это n инструкций ffmpeg для нарезки входных видео до нужной длины, а затем n-1 инструкций ffmpeg для объединения их всех с соответствующими переходами.

person Zach Bloomquist    schedule 08.03.2016
comment
Вы часто перекодируете видео. Сделать это можно было одной, пусть и длинной, командой. Если интересно, напишу в ближайшие дни. - person Gyan; 08.03.2016
comment
@Mulvya Мне было бы интересно увидеть эту мерзость, да - person Zach Bloomquist; 08.03.2016