ffmpeg stream precisão do quadro de cópia

2

Eu sei que isso pode não ser possível, mas eu gostaria de entender o que está acontecendo.

Eu tenho um vídeo com keyframes forçados a cada 2 segundos. Idealmente, eu estava esperando que eu fosse capaz de obter fatias perfeitas de quadro sem ter que 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.

Chegando mais perto, parece que a primeira fatia é precisa de frames, mas depois disso tudo tem um pequeno offset (pode ter outros problemas, mas estou focando nisso por enquanto). O primeiro quadro aparece 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á desativado:

# 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

Qualquer coisa que eu faça, eu obtenho o mesmo resultado. Se eu olhar para o PTS para o original para o quadro 60, recebo 2,002000 (em vez de 2). Mas, mesmo se eu usar isso para minha fatia, eu obtenho o mesmo offset.

O que está acontecendo?

(Provavelmente não realted, mas também estou curioso porque o primeiro quadro de 0_slices.mp4 tem um deslocamento PST / DST, mesmo que o original não)

    
por cparker 31.05.2015 / 23:15

1 resposta

0

Se você deseja procurar com precisão de quadros, tente colocar seu sinal -ss 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 sinalizador ss antes do arquivo de entrada será uma "estimativa aproximada" em termos de PTS, mas tem que se ajustar a um quadro I para funcionar. Isso acontece muito mais rapidamente do que colocar o ss após seu arquivo de entrada, mas com um custo menor.

Quando você colocar o sinalizador ss após o arquivo de entrada, o FFmpeg decodificará desde o início do arquivo até o início do tempo -ss . Em seguida, ele despeja todas as informações antes do tempo de ss ... Por isso, leva muito mais tempo, mas deve ser preciso.

    
por 01.06.2015 / 19:26

Tags