Consegui consertar meu arquivo. Encontrei o filtro mpdecimate
, que elimina quadros duplicados ou quase duplicados de um fluxo de vídeo. Primeiro eu tentei:
ffmpeg -loglevel debug -i orig.mp4 -an -vf "mpdecimate" test.mp4
Adicionei -loglevel debug
para obter mais informações durante a transcodificação. As informações mostravam o que o mpdecimate
estava fazendo com os quadros, o que era muito e muito desse padrão:
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44032 pts_time:3.44 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44544 pts_time:3.48 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45056 pts_time:3.52 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45568 pts_time:3.56 drop_count:4
781>=hi keep pts:46080 pts_time:3.6 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:46592 pts_time:3.64 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47104 pts_time:3.68 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47616 pts_time:3.72 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:48128 pts_time:3.76 drop_count:4
821>=hi keep pts:48640 pts_time:3.8 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49152 pts_time:3.84 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49664 pts_time:3.88 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50176 pts_time:3.92 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50688 pts_time:3.96 drop_count:4
793>=hi keep pts:51200 pts_time:4 drop_count:-1
Ou seja, ele consistentemente descartava 4 quadros seguidos como duplicados e mantinha a cada 5. Isso mostrou que a taxa de quadros original era 1/5 do que era agora. Tive sorte! Como os 25 fps atuais do vídeo eram um múltiplo da taxa de quadros original, não deveria haver um problema com o desalinhamento temporal dos quadros mantidos e descartados. Por isso, retranscrevo o vídeo original com nada mais complexo que -vf "fps=5"
, e a saída parece estar bem. Só para ter certeza, eu canalizei a saída através do filtro mpdecimate
, e detectei todos os quadros restantes como um "keep". Então o arquivo original não foi tão confuso como eu pensava.