Проблемы с зацикливанием потока с помощью FFMpeg

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

Чтобы решить эту проблему, я пытаюсь создать цикл потоковой передачи и жестко запрограммировать желаемую продолжительность, используя параметр «t».

Я использую фильтр setpts, чтобы убедиться, что мой формат контейнера (.mp4) принимает прошлые кадры, переписывая их временные метки:

ffmpeg -loop 1 -i image.jpg -stream_loop -1 -i video.mov  -filter_complex "[1:v]setpts=N/(FRAME_RATE*TB)[1v];[0:v][1v]overlay=x=main_w*0.44:y=main_h*0.33[out]" -map [out] -t 00:00:15  out.mp4

Таким образом, команда звучит следующим образом:

  1. возьмите один бесконечный вход, где каждый кадр - это image.jpg
  2. взять еще один бесконечный ввод (video.mov), зациклив (-stream_loop -1)

Каждый кадр будет проходить через фильтр:

  • setpts перезапишет метки времени для источника 1 (video.mov)
  • оверлей поместит каждый кадр с параметрами из video.mov поверх каждого кадра из исходного ввода (image.jpg - 0:v)

Это должно продолжаться до тех пор, пока не будет создан файл с 00:00:15 секундами.

Эта команда создает этот файл, но video.mov не зацикливается, как только первый цикл завершается, последний кадр повторяется до тех пор, пока не закончится выходной фильм.

К вашему сведению: я сделал еще пару тестов:

ffmpeg -stream_loop -1 -i movie.mov -filter_complex "[0:v]setpts=N/(FRAME_RATE*TB)[out]" -map [out] -t 00:00:30 output.mp4

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

с другой стороны, если я добавлю еще один входной файл:

ffmpeg -stream_loop -1 -i movie.mov -loop 1 -i image.jpg -filter_complex "[0:v]setpts=N/(FRAME_RATE*TB)[out]" -map [out] -t 00:00:30 output.mp4

Это не создаст фильм с 30 секундами, хотя один из входных данных никогда не используется, ffmpeg создает файл фильма только с одним циклом movie.mov и такой же длиной movie.mov.

Любые советы, пожалуйста?

Большое спасибо!

Зе

Ответы (1)

Вместо этого попробуйте использовать кинофильтр

ffmpeg -loop 1 -i image.jpg -filter_complex \
        "movie=video.mov:loop=999,setpts=N/(FRAME_RATE*TB)[1v]; \
        [0:v][1v]overlay=x=main_w*0.44:y=main_h*0.33[out]" \
       -map [out] -t 00:00:15  out.mp4
Работает как шарм! Есть идеи, почему не работает stream_loop?
Я размышляю здесь, но значение stream_loop будет зарегистрировано в той же общей переменной, что и аргумент цикла демультиплексора изображений, и на самом деле не будет успешно зарегистрировано. Кинофильтр создает свой собственный локальный контекст. Но это всего лишь предположение.