Extraindo “um de cada 10 quadros” em um vídeo usando VLC ou FFmpeg

10

Estou tentando extrair "exatamente 1 quadro de cada 10" quadros de um vídeo (ou seja, extrair 1, deixar 9 e depois repetir) para fins científicos. O vídeo é de 105 quadros, 3,5 segundos, 29,97 fps (h.264, .mov, produzido pela Nikon D3100).

Eu fiz o upload aqui .

VLC

Abaixo o comando deve produzir 10 quadros, mas produz apenas 6 imagens. Tentei diferentes proporções de cena e nenhuma delas produziu o número correto de quadros (nem perto de corrigir).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

Alguém poderia me dizer qual é o problema?

FFmpeg

O FFmpeg não parece ter um comando exatamente para o meu propósito. O comando abaixo extrai 3 quadros de cada segundo, mas como o FPS não é exatamente 30 (em vez disso, 2.97), isso não produzirá resultados corretos para mim.

Além disso, mesmo o FFmpeg não distribui o número correto de quadros mesmo com este comando. Por 3,5 segundos de vídeo eu espero no máximo 10 frames, mas o que eu ganho são 12 frames!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

Como posso conseguir o que quero?

    
por wmac 18.02.2012 / 05:18

3 respostas

17

Selecione um quadro de cada 10 quadros

Você pode usar o filtro de vídeo select em ffmpeg para fazer isso:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • Para a saída JPG, você pode variar a qualidade com -q:v . O alcance efetivo é 2 (melhor qualidade) a 31 (pior qualidade). Você não precisa desta opção se quiser imprimir em PNG.

  • Isso produzirá img_001.jpg , img_002.jpg , img_003.jpg , etc.

por 19.02.2012 / 22:20
4

O aspecto mais importante em sua pergunta é o fato de que o vídeo usa 29,97 quadros por segundo, não 30. NTSC.

De qualquer forma, acho que seria mais fácil simplesmente extrair todos os quadros e remover os que você não precisa:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Em seguida, remova os que você não precisa. Já que cada décimo frame terminará com um 1.jpg , podemos apenas pegar todos os outros…

find . -maxdepth 1 -not -iname "*1.jpg"

... e assim que tiver certeza de que essas são as que você deseja remover:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Se você puder usar mencoder , poderá tentar a opção framestep , conforme explicado na documentação , como framestep=10 no seu caso. Eu pessoalmente não consegui instalar / experimentar embora.

    
por 18.02.2012 / 12:03
0

Se você primeiro converter o vídeo em uma série de imagens raw rgb24 ou rgb32, talvez consiga obter o número correto de quadros, pois na forma original parece haver tipos de quadros incomuns que podem não ser imagens em tudo ???

Nos discos a laser originais, o vídeo inteiro era composto de uma série de imagens com números individuais de quadros de 1 a 100.000 ou mais, e assim é realmente a maneira correta de estabelecer uma linha de base para futuras conversões ou manipulações.

O setor mudou para essa estranha ideia de compactação simplesmente para reduzir o dinheiro investido e para corromper as verdadeiras formas científicas de lidar com números.

Você deve primeiro extrair qualquer áudio como um arquivo wave para não perder totalmente o áudio. Parece que o FFMPEG coloca informações de identificação em cada imagem extraída, porque se você tentar juntar imagens de outras extraídas, e você misturar outras imagens de outras fontes com a mesma extensão, o ffmpeg irá ignorar as imagens que você tentou colocar no meio de tudo .

Com o formato de disco laser, a taxa de quadros é simplesmente ditada por qualquer taxa que você apresente as imagens seqüenciais e não seja controlada de forma alguma pelas próprias imagens.

O FFMPEG pode aprender com a ciência, em vez da arte, para o manuseio e exibição de imagens de qualquer tipo. Ou possivelmente toda a indústria de AV. A indústria realmente precisa melhorar os recursos do hardware e usar dados brutos que exigem muita memória / armazenamento. Nada supera dados brutos para precisão e precisão.

    
por 21.04.2014 / 19:01