Como pano de fundo para a questão, eu uso um filtro complexo gerado programaticamente para compor um vídeo a partir de muitas entradas. Pequenos erros se acumulam e, portanto, preciso de cortes precisos (recodificação é bom).
Por exemplo, preciso de 44 quadros do vídeo vinculado (FPS=30) começando em um determinado quadro.
Aqui estão duas tentativas (com ffmpeg
a versão 6.1.1):
Tentativa 1:
ffmpeg -i input.mp4 -vf "trim=start=3.2666666666666666:end=4.7333,setpts=PTS-STARTPTS" -an output.mp4
Tentativa 2:
ffmpeg -i input.mp4 -vf "trim=start=3.2666666666666666:end=4.7334,setpts=PTS-STARTPTS" -an output.mp4
Enquanto a diferença no end
timestamp é de apenas 0,0001, a primeira tentativa resulta em 43 frames (duração de 1,433333 segundos), enquanto a segunda dá 45 frames (duração de 1,50 segundos). Não importa o que eu coloque no end
timestamp, não consigo obter 44 frames...
Eu obtenho o número de quadros por:
ffprobe -show_frames output.mp4 | grep FRAME | wc -l
(dividindo esse número por dois, pois ele conta ambos [FRAME]
e [/FRAME]
)
Qual é a explicação para esse comportamento e como posso aparar previsivelmente os quadros que preciso?
ATUALIZAÇÃO O mesmo comportamento é observado se eu usar start_frame
e end_frame
. Para o intervalo de 98 a 141, obtenho 43 quadros. Para o intervalo de 98 a 142, obtenho 45 quadros. Não consigo obter 44...
Seu segundo comando gera 44 quadros com ffmpeg 7.1 (45 quadros com ffmpeg 4.4.5) a partir desse input.mp4 (verificado via Invisor).
Isso também gera 44 quadros com ffmpeg 7 (45 quadros com ffmpeg 4):
Adicionar
-fps_mode passthrough
parece resolver o problema.ffmpeg -y -i input.mp4 -fps_mode passthrough -vf "trim=start=3.2666666666666666:end=4.7334,setpts=PTS-STARTPTS" -an output.mp4
Após adicionar,
-fps_mode passthrough
há 44 quadros de saída.Parece um bug no
trim
filtro (ou no mecanismo de filtros do FFmpeg).Não sei por que adicionar
-fps_mode passthrough
ajuda, mas acho que o bug está de alguma forma relacionado aos registros de data e hora dos quadros passados para o filtro de corte.Nota: A solução parece funcionar com o FFmpeg versão 6.1.1, mas não funciona com o FFmpeg versão 7.1