
Мои требования следующие:
- Входное видео — MP4
- Наложение может быть в формате gif или png.
Наложение должно появляться поверх входного видео с временной меткой. Оно должно длиться 5 секунд. Если это gif, оно должно воспроизводиться в течение этих 5 секунд по кругу. В течение этих 5 секунд, когда появляется наложение, фоновое видео должно быть приостановлено (и аудио, и видео), а затем возобновлено после исчезновения наложения. Наложение может происходить в любом месте от 0-го до последнего кадра.
Я пробовал вставлять изображение в отметку времени, вычислять кадр в этой отметке времени, затем использовать , loop
но я сталкиваюсь с одной или другой проблемой, либо с аудио, либо с видео. Я также пробовал разделять видео на две части во время наложения, применять к одной, а затем объединять их.
Я занимаюсь этим уже 3 дня и надеюсь, что кто-нибудь поможет с командой, так как на данном этапе это выше моих сил.
решение1
Уфф, мне потребовалось несколько часов, чтобы сделать это правильно. Комментарий от @Баяр Гончикжапов и ответ из этой темы помогли:https://stackoverflow.com/questions/43414641/repeat-last-frame-in-video-using-ffmpeg
Вам нужно использовать фильтр tpad на части перед наложением, таким образом вы можете приостановить последний кадр этой части на столько, сколько захотите. Затем вы добавляете аудио части 1, чтобы компенсировать дополнительное время, пока видео приостановлено и показывается наложение с помощью фильтра apad.
Продолжая, вы связываете видеочасти + аудиочасти и на полученное видео накладываете наложение.
В качестве примера я собираюсь использовать часть 1 продолжительностью 30 секунд, затем паузу с наложением на 5 секунд и часть 2 также продолжительностью 30 секунд.
Для изображения png:
ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -i apple.png -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_png.mp4"
Для изображения в формате GIF:
ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -stream_loop -1 -i horse.gif -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_gif.mp4"