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...