объединение с кроссфейдом нескольких видео (со звуком)

объединение с кроссфейдом нескольких видео (со звуком)

У меня есть 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

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

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

Итак, сначала мы применяем 2-секундное затуханиевв начале второго видео.

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

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

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

setpts=PTS-STARTPTS+18/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

Связанный контент