1

Я отчаянно пытаюсь понять, почему фильтр наложения 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. показать 1-е изображение в течение 5 секунд (произвольное число)
  2. передвиньте 2-е изображение поверх 1-го изображения слева направо в течение 5 секунд (произвольное число, может быть 1, может быть 10 - не должно зависеть от длины 1-го и 2-го входных потоков)
  3. показать 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#Examples-88 (замедленная съемка )

По какой-то причине фильтр наложения работает только с 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 ответ1

0

После ~ 8 часов удара головой о стену ffmpeg, google и docs я наконец нашел, что делать (работает с любой продолжительностью скольжения):

  1. Фильтр setpts PTS*5-STARTPTS
  2. fps фильтр для корректировки fps до желаемого значения после "растягивания" потока с помощью фильтра setpts
  3. передать оба потока в фильтр fifo , это предотвращает сброс кадров ffmpeg

По какой-то причине ffmpeg сбрасывает ЛЮБЫЕ кадры выше FRAME_RATE, переданные overlay фильтру, если вы не передадите их вручную через fifo ... т.е. при максимальной скорости вы можете передавать 60 кадров в секунду (если ваш fps равен 60) или 12 кадров в секунду в течение 5 секунд (всего 60 кадров = столько же, сколько кадров в секунду)

BLEH ... Я хотел бы, чтобы документы были лучше в отношении таких вещей

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .