Eu sei que isso pode não ser possível, mas pelo menos gostaria de entender o que está acontecendo.
Tenho um vídeo com quadros-chave forçados a cada 2 segundos. Idealmente, eu esperava conseguir fatias com quadros perfeitos sem precisar recodificar. Por exemplo:
ffmpeg -ss 00:00:00 -i original.mp4 -t 2 -c copy slices_0.mp4
ffmpeg -ss 00:00:02 -i original.mp4 -t 2 -c copy slices_1.mp4
ffmpeg -ss 00:00:04 -i original.mp4 -t 2 -c copy slices_2.mp4
...
Isso não parece funcionar.
Indo mais fundo, parece que a primeira fatia tem precisão de quadro, mas tudo depois disso tem um ligeiro deslocamento (pode haver outros problemas, mas estou apenas focando nisso por enquanto). O primeiro quadro parece ok:
# same output
ffmpeg -ss 00:00:03 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:00 -i slices_1.mp4 -vframes 1 1.png && md5 1.png
Mas tudo depois disso está desligado:
# not the same output
ffmpeg -ss 00:00:04 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:01 -i slices_1.mp4 -vframes 1 1.png && md5 1.png
Faça o que fizer, obtenho o mesmo resultado. Se eu olhar o PTS do original para o quadro 60, obtenho 2,002000 (em vez de 2). Mas, mesmo se eu usar isso para minha fatia, obtenho o mesmo deslocamento.
O que está acontecendo?
(Provavelmente não relacionado, mas também estou curioso para saber por que o primeiro quadro de 0_slices.mp4 tem um deslocamento PST/DST, mesmo que o original não tenha)
Responder1
Se você deseja uma busca precisa de quadros, tente colocar seu -ss
sinalizador após o arquivo de entrada.
Então, algo assim:
ffmpeg -i original.mp4 -ss 00:00:04 -vframes 1 -f image2 0.png
.
Colocar o ss
sinalizador antes do arquivo de entrada será um 'palpite aproximado' em termos de PTS, mas precisa se ajustar a um quadro I para funcionar. Isso acontece muito mais rapidamente do que colocar o ss
sinalizador após o arquivo de entrada, mas ao custo de ser menos preciso.
Quando você coloca o ss
sinalizador após o arquivo de entrada, o FFmpeg irá decodificar desde o início do arquivo até o -ss
início do tempo. Em seguida, ele despeja todas as informações antes do ss
tempo... Portanto, leva muito mais tempo, mas deve ser preciso.