Как добавить мой логотип за последние 60 секунд в видео с ffmpeg?

0

Я искал несколько дней, чтобы найти это решение. Все, что я нашел, это способы добавить логотип в первые секунды или через несколько секунд или только между определенными частями (например, между 30 и 210 секундами).

Итак, главный вопрос: Как добавить мой логотип за последние 60 секунд в видео с ffmpeg? У меня много видеороликов различной длины, и я просто хочу, чтобы последние 60 секунд накладывались на логотип .png (в данном случае также в левой нижней части экрана).

В настоящее время я использую то, что вы видите ниже, которое работает отлично (показывает логотип всегда, кроме как между 30-210 секундами видео), но, как я уже упоминал в заголовке, это не делает именно то, что я хочу.

-i video.mp4 -vf "movie=/logo.png [watermark]; [in][watermark] overlay=1:main_h-overlay_h-1:enable=not(between'(t,30,210)') [out]"
razz
источник

Ответы:

2

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

Основной шаблон

ffmpeg -i in.mp4 -sseof -60 -copyts -i in.mp4 -loop 1 -i logo.png -filter_complex "[1][2]overlay=shortest=1[logo];[0][logo]overlay" out.mp4

Видео вводится дважды. На втором входе sseof установлена ​​опция, которая позволяет искать, используя интервал времени, измеренный с конца. Конечно, если не указано иное, FFmpeg будет сбрасывать входные метки времени, поэтому copyts настроен на сохранение входного TS.

Сначала логотип накладывается на обрезанное видео, и этот результат накладывается на первый вход. Поскольку временные метки сохраняются, кадры выровнены, и цель достигнута.

Gyan
источник
Это довольно милый трюк!
Ouroborus
Это сработало, как талисман, спасибо :) Единственная проблема, которая у меня осталась, - это работать в пакете с cms, с которой я работаю, но это никак не связано с вашим ответом, который просто работает!
razz
1

overlay а также enable не имеют возможности ссылаться на конец или продолжительность видео. Вам нужно будет использовать дополнительную команду (возможно, ffprobe а также grep, такие как описано в этом ответе ), чтобы извлечь продолжительность, а затем использовать это для генерации ffmpeg команда с правом between ценности.

Ouroborus
источник
Просто интересно, возможно ли все это в одной команде? Допустим, у меня есть 2000 видео и я хочу запустить их одной командой
razz
Нет необходимости grep: ты можешь использовать ffprobe в одиночестве. Увидеть один из другие ответы в ссылке, которую вы предоставили.
llogan
@razz Вы должны сделать это двумя командами. Как упоминал Уроборус, выполните одну команду, используя ffprobe определить длину, а затем ffmpeg Команда с использованием продолжительности вы получили от ffprobe,
llogan