Наложение видео после установленного смещения времени с помощью FFmpeg

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

Основной способ добавления наложения:

ffmpeg -i in.avi -vf "movie=overlay.avi [ovl]; [in][ovl] overlay" out.avi

Но это добавляет оверлейное видео (или изображение) с начала входного видео до тех пор, пока не закончится одно из видео.

Я знаю, как компенсировать оверлейное видео с помощью movie=overlay.avi:seek_point=1.4, но как насчет смещения на входном видео?

Я всегда мог закрепить видео в нужную точку, добавить наложение на второй клип, а затем сшить два, но это не очень эффективно.

Ответ 1

Расширяясь проницательный, но спекулятивный ответ , видео действительно может быть легко перекрыто с помощью флага -itsoffset.

Флаг -itsoffset работает следующим образом:

-этофисное смещение (ввод)

Установите смещение времени ввода в секундах. Синтаксис [-] hh: mm: ss [.xxx] также поддерживается. Смещение добавляется к отметкам времени входных файлов. Задание положительного смещения означает, что соответствующие потоки задерживаются на сдвиговые секунды.

(NB: Несмотря на фразу "входной файл s", флаг действует только на вход, следующий за ним. Примечание: эта ошибка о смещениях, не применяемых к аудиопотокам. H/T attronics.)

Таким образом, наложение со смещением так же просто, как:

ffmpeg -i bg.avi -itsoffset 2 -i over.avi -filter_complex overlay out.avi

Это работает независимо от типа контейнера.

Ответ 2

В соответствии с ограниченной документацией наложения FFmpeg процесс ожидает, что как видео имеют то же значение timestamp (например, 0: 00: 00: 00), чтобы синхронизировать ситуацию, а предупреждает, если не выполнено, то avi.out будет иметь нежелательное смещение из видеофайла overlay.avi.

Однако вы можете использовать этот факт и воспользоваться им!

Тогда можно предположить, что если видео overlay.avi имеет начальный timestamp с желаемым смещением, который требуется на входном видео in.avi, тогда overlay.avi видео будет срабатывать в том же timestamp (предоставленном in.avi), чтобы создать ожидаемый результат для видео out.avi.

Единственная плохая новость: контейнер .avi не имеет временных меток, в отличие от форматов файлов .mp4 или .mkv. Вам нужно будет перейти к файловому формату, поддерживающему *timestamps* для этого (например, overlay.mp4 или overlay.mkv) для создания окончательного выходного видеофайла.