![объединение с кроссфейдом нескольких видео (со звуком)](https://rvso.com/image/1568491/%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BA%D1%80%D0%BE%D1%81%D1%81%D1%84%D0%B5%D0%B9%D0%B4%D0%BE%D0%BC%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%20(%D1%81%D0%BE%20%D0%B7%D0%B2%D1%83%D0%BA%D0%BE%D0%BC).png)
У меня есть 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-го видео на тот, который имеет альфа-канал - обратите внимание на a
in 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