Como converter vídeo em imagens?

62

Como posso converter um arquivo de vídeo em uma sequência de imagens, por exemplo, um quadro a cada N segundos. O mplayer ou o ffmpeg podem fazer isso? Eu usei o MPlayer para capturar screenshots manualmente, mas eu gostaria de automatizar isso para um longo vídeo.

    
por Liam 27.04.2010 / 12:05

8 respostas

27
mplayer -vo jpeg -sstep 5 file.avi

salvará um quadro como um arquivo jpeg a cada 5 segundos.

No entanto, ele não irá parar no final do arquivo, ele continuará produzindo cópias do último quadro. Para evitar isso, encontre a duração do vídeo em segundos, usando outro player ou com o mplayer:

mplayer -vo null -ao null -frames 0 -identify file.avi

e procure por uma linha como "ID_LENGTH = 147.00".

Subtraia 2 do comprimento e use esse valor para a opção -endpos . Por exemplo, para um vídeo de 147 segundos:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
    
por 28.04.2010 / 12:08
58

É muito simples com o ffmpeg, e pode produzir um quadro a cada N segundos sem scripting extra. Para exportar como uma sequência de imagens, use apenas myimage_%04d.png ou similar como a saída. O bit %0xd é convertido em um inteiro preenchido com zero x dígitos longos - o exemplo que eu dei obtém a saída como myimage_0000.png myimage_0001.png etc. Você pode usar muitos formatos de imagem estática, png, jpeg, tga, whatever (veja ffmpeg -formats para uma lista completa).

Ok, para exportar como sequência de imagem, podemos usar um formato de imagem como saída com um nome de arquivo seqüencial, mas não queremos exportar todos os quadros. Então, simplesmente altere a taxa de quadros da saída para o que quisermos usando a opção -r n , em que n é o número de quadros por segundo. 1 frame por segundo seria -r 1 , um quadro a cada quatro segundos seria -r 0.25 , um quadro a cada dez segundos seria -r 0.1 e assim por diante.

Então, para colocar tudo junto, é assim que se olha para salvar um quadro de input.mov a cada quatro segundos para output_0000.png, output_0001.png etc. .:

ffmpeg -i input.mov -r 0.25 output_%04d.png

Altere o% xd para quantos dígitos você precisar, por exemplo, se o comando criar mais de 10.000 quadros, altere o %04d para %05d . Isso também funciona para arquivos de entrada que são seqüência de imagens. Leia mais aqui .

Usuários do Windows: Na linha de comando, use %

exemplo: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

Nos scripts CMD e BAT, use %%

exemplo: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

Não use apenas um % em scripts e não use %% na linha de comando. Ambas as situações geram um erro.

    
por 15.03.2014 / 10:47
11

Com ffmpeg , você pode fazer o seguinte:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

Este comando gera uma miniatura JPG de 320 × 240 no quarto segundo do vídeo. Coloque isso em um script que mude o horário e o nome do arquivo e pronto.

Mais informações: Crie uma imagem em miniatura a cada X segundos do vídeo

    
por 27.04.2010 / 13:41
8

Se você está atrás de uma planilha de contato e se você está trabalhando com um sistema operacional similar ao Unix, você pode usar este script elaborado, chamado para o ponto Folha de contato de vídeo * NIX , curta vcs .

No plano de fundo, ele também usa ffmpeg (por padrão) ou mplayer , portanto, pode lidar com muitos formatos de vídeo. Ele automatiza o processo de captura de imagens estáticas do filme e as compõe para uma imagem com algum cabeçalho e rodapé. Você pode escolher por exemplo quantas capturas você deseja ou, alternativamente, as diferenças de tempo entre elas.

Por um intervalo de 10 minutos, a invocação é assim:

vcs -i 10m input.avi

Verifique a lista completa de opções de linha de comando para alguns outros ajustes.

Aqui está um exemplo de folha de contato, retirado da página inicial :

    
por 04.06.2013 / 10:15
7

Com o VLC 1.1.0 e superior, você pode usar o filtro de vídeo scene:

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

O acima salva 1 de cada 24 frames (--scene-ratio = 24), começando às 00:00:10 e terminando às 00:00:11.

Apenas testei e confirmei que isso funciona com o VLC 2.0.3 em uma nova instalação do Windows 8 (não tenho nenhum plug-in de vídeo ou software adicional).

Documentação completa: link

    
por 11.09.2012 / 05:17
2

VirtualDub pode fazer isso por você

File - > Export - > Image sequence

    
por 27.04.2010 / 12:13
1

Você também pode tentar isso

from the VLC command line...

vlc "C:\YOUR\file\path\file.avi" -V image --image-out-prefix=capname --image-out-ratio=60

file.avi is the video you want to capture from, capname is the prefix of the saved images, you might want to play around with the ratio (60 means that 1 out of 60 images is captured) You can add more commands, for example --image-out-format jpeg will save your caps as jpegs instead of of pngs, --snapshot-path lets you choose where to save your caps.

Fonte acima

    
por 27.04.2010 / 18:22
1

Você pode pular quadros no VirtualDub. Basta usar a opção "Decimar por" localizada em Vídeo - > Menu Taxa de quadros. Por exemplo, se você definir "Decimate By 100", use File - > Exportar - > Seqüência de imagens, ele salvará apenas a cada 100 quadros.

    
por 30.11.2011 / 23:06