1

У меня есть 7 коротких видеоклипов одинакового размера, частоты кадров и т.д. Я хочу объединить их один за другим с 2-х секундным кроссфейдом, и не потерять звук. Взятый из более раннего поста здесь, я попытался просто объединить / смешать первые два, используя:

ffmpeg -i *clip1.mp4 -i *clip2.mp4  \
-filter_complex "[0]fade=t=out:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va0]; \
[1]fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va1];  \
[va0][va1]overlay[outv];[0][1]amix[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4

Однако при этом получается видео, которое сразу же затухает в первом видео и заканчивается точно такой же продолжительностью, что и второе видео (что составляет 40 секунд). Я предполагаю, что это из-за "st = 0" для первого видео [0]? Однако, если я изменю это значение на «st = 18» (первое видео имеет длительность 20 секунд), полученное объединенное видео (out.mp4) по-прежнему будет сразу же исчезать с первым видео (а вместо этого все видео будет всего 40 секунд). из 58). Тем не менее, аудио для первого теперь длится 18 секунд (но теперь оно накладывается на второе видео и его аудио на 18 секунд). Есть предложения, что попробовать?

1 ответ1

1

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

В этом случае ваше первое видео - 20 с, ваше второе видео - 40 с, и вам нужно 2 с перекрестным затуханием. При выполнении перекрестных переходов с использованием оверлейного фильтра нам нужно только применить постепенные изменения к входящему видео. Применение затухания к исходящему видео приведет к падению яркости - иногда желательно, но я этого избегаю.

Итак, во-первых, мы применяем эффект 2s в начале второго видео.

[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];

Поскольку затухание применяется только к альфа-каналу, видео должно иметь альфа-канал. Как правило, для видео это не так, поэтому перед преобразованием применяется фильтр преобразования формата пикселей, чтобы изменить формат пикселя 2-го видео на формат с альфа- каналом - обратите внимание на a в yuva444p . Замирание типа in используется , начиная с времени 0 и длительности 2s к альфа - канал только то цвет пикселей видео - ролика, не затрагиваются.

Теперь второе видео должно быть отложено. Так как 1-е видео имеет длину 20 с и требуется 2-секундное кроссфейдирование, 2-е видео должно начинаться в 18 с внутри сборки. Таким образом, фильтр setpts применяется

setpts=PTS-STARTPTS+18/TB

TB относится к временной базе и является единицей, в которой временные метки хранятся для потока.

Для аудио кроссфейдов есть фильтр кроссфейдеров

[0][1]acrossfade=d=2

Это устанавливает кроссфейд на 2 секунды.

Теперь мы можем собрать два клипа,

ffmpeg -i *clip1.mp4 -i *clip2.mp4  \
-filter_complex \
 "[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];  \
 [0][va1]overlay[outv];[0][1]acrossfade=d=2[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .