ffmpeg problema de duração da sobreposição

1

Estou ficando desesperado tentando descobrir por que o filtro de sobreposição do ffmpeg se comporta mal

Eu tenho o seguinte comando 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

(é preenchido para melhor visibilidade)

O que estou tentando fazer?

  1. mostra a 1ª imagem por 5 segundos (número arbitrário)
  2. deslize a segunda imagem sobre a primeira imagem da esquerda para a direita por 5 segundos (número arbitrário, pode ser 1, pode ser 10 - não deve depender da duração da primeira e da segunda entrada)
  3. mostra a segunda imagem por 2 segundos (número arbitrário)

O que eu ganho?

Eu tentei várias soluções, com esta segunda imagem se move acima da primeira imagem apenas para o primeiro segundo e depois pára abruptamente pelos próximos 4 segundos, após o que instantaneamente pula para o final da animação

enquanto o ffmpeg envia muitos avisos

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

Eu suspeito que há algum problema com cronogramas de quadros, mas até agora não tive sucesso Se eu adicionar o filtro setpts 5 * PTS - ele funciona perfeitamente, mas eu observo 5x frame drop (de 60 fps para 12 fps) retirado de: link (câmera lenta)

Por algum motivo, o filtro de sobreposição funciona apenas no primeiro segundo do vídeo - não importa o que eu esteja tentando fazer

Eu também tentei combinar o filtro fps e setpts como uma espécie de hack estranho - sem sucesso

versão 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)

Provavelmente estou sentindo falta de algo óbvio! Por favor ajude ...

    
por let4be 18.11.2015 / 10:59

1 resposta

0

Após ~ 8 horas de bater minha cabeça contra a parede do ffmpeg, google e docs eu finalmente encontrei o que fazer (funciona com qualquer duração de deslizamento):

  1. setpts filter PTS*5-STARTPTS
  2. fps filter para corrigir fps para o valor desejado após "alongar" o fluxo com setpts filter
  3. transmite os dois fluxos para o filtro fifo , isso impede que o ffmpeg elimine quadros

por algum motivo, o ffmpeg descarta QUALQUER quadro acima de FRAME_RATE dado ao filtro overlay , a menos que você os passe manualmente através do fifo ... ou seja, no máximo você pode passar 60 quadros por segundo (se o seu fps for 60) ou 12 quadros no segundo por 5 segundos (60 quadros no total = o mesmo que fps do vídeo)

bleh ... Eu gostaria que os docs fossem melhores em relação a essas coisas

    
por 18.11.2015 / 12:43