Я пытаюсь наложить видео поверх изображения. Проблема, с которой я столкнулся, заключается в том, что продолжительность видео, которое я хочу, больше, чем продолжительность моего входного видео.
Чтобы решить эту проблему, я пытаюсь создать цикл потоковой передачи и жестко запрограммировать желаемую продолжительность, используя параметр «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
Таким образом, команда звучит следующим образом:
Каждый кадр будет проходить через фильтр:
Это должно продолжаться до тех пор, пока не будет создан файл с 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.
Любые советы, пожалуйста?
Большое спасибо!
Зе
Вместо этого попробуйте использовать кинофильтр
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
пользователь361526
Гьян