Precisão do quadro de cópia do fluxo ffmpeg

Precisão do quadro de cópia do fluxo ffmpeg

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 -sssinalizador 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 sssinalizador 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 sssinalizador após o arquivo de entrada, mas ao custo de ser menos preciso.

Quando você coloca o sssinalizador após o arquivo de entrada, o FFmpeg irá decodificar desde o início do arquivo até o -ssinício do tempo. Em seguida, ele despeja todas as informações antes do sstempo... Portanto, leva muito mais tempo, mas deve ser preciso.

informação relacionada