Maneira rápida de extrair imagens de vídeo usando FFmpeg

Maneira rápida de extrair imagens de vídeo usando FFmpeg

Estou usando o FFmpeg para extrair imagens de vídeo, 1 quadro a cada 6 segundos:

Normal command on Dos ( Windows 8 OS) >  ffmpeg -i in.mkv -r 1/6 %4d.png

Demora muito porque a velocidade é muito baixa, em torno de 15-20.

Então eu useiskip_frame nokey

ffmpeg -skip_frame nokey -i "in.mkv" -vsync 0 -frame_pts true -r 1/6 %4d.png

Extrai em velocidade maior, cerca de 200 (dez vezes mais rápido).
Mas o problema é que ele pula muitas imagens e gera um erro:

o aplicativo forneceu dts inválidos e não monotonicamente crescentes para o muxer no stream

Então usei este comando:

ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png

(Fornecido aqui -Como capturar os primeiros X frames a cada X segundos em um PNG com FFmpeg?)

Isso me dá velocidade de 25-30.

Existe alguma maneira com a qual posso obter velocidade mais alta -skip_frame?

Responder1

Ok, o código que postei acima na postagem original é a única solução que encontrei até agora para uma extração mais rápida de imagens. Às vezes me dá velocidade de até 50.

ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png

Se você estiver interessado na extração aleatória de imagens (com base no quadro-chave) para obter maior velocidade, use -skip_frame nokey.

informação relacionada