2

Это мой сценарий:

Я хочу добавить видео с водяными знаками в другое видео, но хочу, чтобы он появлялся при его появлении.

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

Это команда, которую я использую:

ffmpeg -y -i big_buck_bunny.mp4 -i alpha.mov -filter_complex "[1:v] fade = out:st = 30:d = 1:alpha = 1 [ov]; [0:v] [ov] оверлей = 10:main_h-overlay_h-10:enable = между (t\, 3\, 5) [v] "-map" [v] "-map 0:a -c:v libx264 -c: копия out.mp4

Любая помощь будет оценена. Спасибо

1 ответ1

5

Используйте -itsoffset непосредственно перед наложенным вводом с тем же количеством секунд, которое вы используете в начале фильтра (3 в вашем случае)

Это поддерживает фильтр fade out который у вас был, но этот фильтр не дает видимых результатов:

ffmpeg -y -i big_buck_bunny.mp4 -itsoffset 3 -i alpha.mov -filter_complex "[1:v] fade=out:st=30:d=1:alpha=1 [ov]; [0:v][ov] overlay=10:main_h-overlay_h-10:enable=between(t\,3\,5) [v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy out.mp4

Это с 3 входами (2 оверлея и база) и без этого другого фильтра:

ffmpeg -y -i basevideo.mp4 -itsoffset 3 -i overlay1.mp4 -itsoffset 8 -i overlay2.mp4 -filter_complex "[0:v][1:v] overlay=0:0:enable=between(t\,3\,5) [oa]; [oa][2:v] overlay=0:0:enable=between(t\,8\,10) [ob]"  -map "[ob]" -map 0:a -c:v libx264 -c:a copy output.mp4

Чтобы продолжать добавлять наложенные видео:

  • добавьте -itsoffset **X** -i newinput.mp4 после последнего входного файла.
    • Порядок входных файлов важен
    • **X** - время начала воспроизведения оверлейного видео (оно не будет отображать оверлей, просто начните внутреннее воспроизведение видео). Настройте его как необходимый (возможно, совпадая со значением **X** на следующем шаге)
  • вставить другой [**previous_output**][**Y**:v] overlay=0:0:enable=between(t\,**X**\,**Z**) [**new_output**] после последнего блока.
    • **Y** - это Y -й входной файл, начинающийся с 0 (в моем примере basevideo - 0, overlay1 - 1, overlay2 - 2 и т.д.).
    • **X** - время, когда наложение будет отображаться в выходном видео.
    • **Z** - время, которое оверлей будет скрывать в выходном видео.
    • Время отсчитывается как для начала основного видео, а не для длины наложенного видео, так что делайте ваши расчеты по продолжительности: если наложение видео длится 2 секунды, **Z** будет **X** + 2.
  • Отрегулируйте -map "[**XX**] в конце команды, чтобы соответствовать **new_output** , или вы будете писать в файл предыдущего шага!

ПРИМЕЧАНИЕ звук берется прямо из basevideo. Аудио из других источников игнорируются и не воспроизводятся вообще.

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