ffmpeg проблема продолжительности наложения
Я отчаянно пытаюсь понять, почему фильтр наложения ffmpeg плохо себя ведет
У меня есть следующая команда ffmpeg
ffmpeg -loop 1 -r 60 -i ./tmp/tmp0.jpg -loop 1 -r 60 -i ./tmp/tmp1.jpg -y -filter_complex
[0]trim=duration=5[0_trim0];
[0_trim0]scale=width=1280:height=-1[0_scale1];
[0_scale1]setsar=sar=1[0_setsar2];
[0_setsar2]crop=out_w=1280:out_h=720:x=0:y=(in_h - 720) / 2[0_setsar2_crop0];
[0_setsar2_crop0]setsar=sar=1[0_setsar3];
[0_setsar3]split=2[fl0_r0][fl0_r1];
[1]trim=duration=2[1_trim0];
[1_trim0]scale=width=1280:height=-1[1_scale1];
[1_scale1]setsar=sar=1[1_setsar2];
[1_setsar2]crop=out_w=1280:out_h=720:x=0:y=(in_h - 720) / 2[1_setsar2_crop0];
[1_setsar2_crop0]setsar=sar=1[1_setsar3];
[1_setsar3]split=2[fl1_r0][fl1_r1];
[fl0_r0]setpts=PTS-STARTPTS[fl0_r0_];
[fl1_r0]setpts=PTS-STARTPTS[fl1_r0_];
[fl0_r0_][fl1_r0_]overlay=x='if(lte(x, (main_w - overlay_w) / 2), -overlay_w + t / 5 * (overlay_w + (main_w - overlay_w) / 2), (main_w - overlay_w) / 2)'[tr0_overlay];
[tr0_overlay]trim=duration=5[tr0];
[fl0_r1][tr0][fl1_r1]concat=n=3:v=1[vt]
-map [vt] -acodec libmp3lame -r 60 -vcodec libx264 -f mp4 -pix_fmt yuv420p -preset fast -crf 20 ./tmp/output.mp4
(Это дополнено для лучшей видимости)
Что я пытаюсь сделать?
- показать 1-е изображение в течение 5 секунд (произвольное число)
- передвиньте 2-е изображение поверх 1-го изображения слева направо в течение 5 секунд (произвольное число, может быть 1, может быть 10 - не должно зависеть от длины 1-го и 2-го входных потоков)
- показать 2-е изображение в течение 2 секунд (произвольное число)
Что я получу?
Я пробовал различные решения, с этим 2-е изображение перемещается над 1-м изображением только на 1-ю секунду, а затем резко останавливается в течение следующих 4-х секунд, после чего мгновенно переходит к концу анимации.
пока ffmpeg спамит много предупреждений
frame= 98 fps=8.1 q=28.0 size= 144kB time=00:00:01.08 bitrate=1087.8kbits/
[Parsed_overlay_14 @ 0x30d6400] [framesync @ 0x30d64e8] Buffer queue overflow, d ropping
Я подозреваю, что есть некоторые проблемы с временными рамками кадров, но пока что я не добился успеха. Если я добавлю setpts filter 5*PTS - он работает отлично, но я наблюдаю падение 5x кадров (с 60 кадров в секунду до 12 кадров в секунду), взятых из: https://ffmpeg.org/ffmpeg-filters.html (замедленная съемка)
По какой-то причине фильтр наложения работает только с 1-й секундой видео - независимо от того, что я пытаюсь сделать
Я также попытался объединить fps и setpts filter как что-то странное, но безуспешно
версия ffmpeg:
ffmpeg version N-76045-g97be5d4 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04)
Вероятно, я упускаю что-то очевидное! Пожалуйста помоги...
1 ответ
После ~8 часов удара головой о стену ffmpeg, google и docs я наконец нашел, что делать (работает с любой продолжительностью скольжения):
setpts
фильтрPTS*5-STARTPTS
fps
фильтр, чтобы скорректировать частоту кадров до желаемого значения после "растяжения" потока сsetpts
фильтр- передать оба потока в
fifo
фильтр, это предотвращает сброс кадров ffmpeg
по какой-то причине ffmpeg отбрасывает ЛЮБЫЕ кадры выше FRAME_RATE, переданного overlay
фильтр, если вы не передадите их вручную через fifo
... т.е. при максимальной скорости вы можете пропускать 60 кадров в секунду (если ваш fps равен 60) или 12 кадров в секунду в течение 5 секунд (всего 60 кадров = столько же, сколько кадров в секунду)
блеф... хотелось бы, чтобы документы были лучше в таких вещах
Итак, если я правильно вас понял.. Вы хотите, чтобы изображения скользили по предыдущему изображению через некоторое время.
Вот как вы можете это сделать:
ffmpeg -loop 1 -i img01.png -loop 1 -i img02.png -loop 1 -i img03.png -loop 1 -i img04.png -i watermark_logo.png -filter_complex \ "[0: v] scale = 412x684, setpts = PTS-STARTPTS [v0];\ [0: v] trim = duration = 3, масштаб =412x684,setpts=PTS-STARTPTS,split[v1a][v1b];\ [1:v]trim=duration=3, масштаб =412x684,setpts=PTS-STARTPTS,split[v2a][v2b];\ [2:v]trim= длительность = 3, масштаб =412x684,setpts=PTS-STARTPTS,split[v3a][v3b];\ [3:v]trim=duration=3, масштаб =412x684,setpts=PTS-STARTPTS[v4];\ [4:v]setpts=PTS-STARTPTS[v5];\ [v0][v1a] оверлей =x='0': кратчайший =1[vv0];\ [v1b][v2a] оверлей = x = 'max (w- (tw / 0.5), 0)': кратчайший = 1 [vv1];\ [v2b] [v3a] overlay = x = 'max (w- (t w / 0.5), 0)': кратчайший =1[vv2];\ [v3b][v4] overlay=x='max(w-(t*w) /0.5),0)':shorttest=1[vv3];\ [vv0][vv1][vv2][vv3] concat=n=4:v=1:a=0 [видео];\ [видео][v5] overlay=main_w-80:main_h-80 [finalvid]" -i audio.mp3 -map "[finalvid]" -map 5:0 -t 20 output.mp4
поломка фильтра:
- создать v0, v1a, v1b... из входных изображений
- наложение v1a на v0, v2a на v1b.. и так далее
- объединить все наложения и генерировать видео
- наложить видео с водяным знаком
- отобразить аудио с помощью finalVid