Selecionando um a cada n quadros de um vídeo usando o ffmpeg

3

Eu estava tentando extrair um a cada N quadros de um vídeo usando o ffmpeg. Eu tentei usar este comando: ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" 1_every_10/img_%03d.jpg

Eu queria verificar se está funcionando conforme o esperado. Então eu extraí todos os frames usando: ffmpeg -i input.mp4 -vf "select = não (mod (n \, 1))" todos / img_% 03d.jpg

E então eu tentei ver se a segunda imagem do primeiro comando corresponde ao número de imagem 20 do segundo comando, e não combinava. Confirmado visualmente e usando o comando diff como

diff all/img_020.jpg 1_every_10/img_002.jpg Binary files all/img_020.jpg and 1_every_10/img_002.jpg differ

Alguém sabe o que poderia estar acontecendo? Obrigado!

    
por Pradheep Elango 06.12.2017 / 03:15

1 resposta

2

O padrão muxer image2 é a taxa de quadros constante. Então, se a entrada for, digamos, 30 fps, e você selecionar cada 10 quadros, ou seja, quadros com timestamp 0s, 0.33s, 0.66s .. então ffmpeg irá duplicar quadros para combinar com a taxa de entrada para duplicar 9 quadros para cada frame de entrada. / p>

O modo de evitar isso é definir o método de sincronização de vídeo como repasse ou taxa de quadros variável

por exemplo,

ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr 1_every_10/img_%03d.jpg

Isso pode afetar a extração completa se a entrada for VFR. Então, use

ffmpeg -i input.mp4 -vf select -vsync vfr all/img_%03d.jpg
    
por 06.12.2017 / 08:23

Tags