Como extrair todos os quadros-chave de um videoclipe?

10

Estou tentando extrair quadros-chave de um videoclipe. Eu tentei o seguinte comando, mas extrai todos os quadros.

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg
Rashed Mustafa
fonte

Respostas:

20

Você pode simplificar o uso -skip_framesem a necessidade de selectfiltro de vídeo:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
radoh
fonte
2
Incrível, leva menos de 10 segundos em um vídeo de 20 minutos em comparação a mais de 3 minutos com o filtro selecionado!
louco
Certifique-se de usar -threads 1, em comparação com o padrão, -threads autoele cria um cropdetectgráfico de filtro ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) 2x mais rápido no meu sistema (60s a 30s)!
genpfault 9/02/19
Eu não usaria skip_frame nokey. Você já verificou a saída? Nos meus arquivos e compilação (agosto de 2019), recebo carimbos de data e hora incorretos, pois nokey me fornece o quadro anterior antes do quadro I, enquanto os quadros não filtrados / todos mostram o quadro I em um carimbo de hora posterior.
JasonXA
O motivo que @genpfault sugere usar -threads 1é que, caso contrário, a sequência dos quadros-chave de saída pode ser emitida fora de ordem. Se você tiver algum tipo de maneira post-hoc de lidar com esse problema, poderá reter vários threads. Além disso, parece que ainda é possível obter quadros-chave fora de ordem, mesmo durante o uso -threads 1 , mas agora neste caso todas essas ocorrências parecem ser acompanhadas / sinalizadas por um erro do decodificador h264 illegal short term buffer state detected.
Glenn Slayden
12

Exemplo usando os filtros selecte scale:

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg

Algumas dicas:

  • Os filtros não devem vir antes da -iopção, pois são uma opção de saída. Não sei de onde exatamente você obteve o comando, mas PICT_TYPE_Inão existe - deveria estar I.

  • No scalefiltro, você pode substituir 73ou fazer 41com que o filtro calcule automaticamente a largura ou a altura para preservar a proporção: como scale=73:-1ou scale=-1:41. Isso evita o alongamento ou o esmagamento que podem resultar do dimensionamento "forçado".

  • A qualidade da saída pode ser controlada com -qscale:v(ou o alias -q:v). O alcance efetivo é uma escala linear de 2 a 31 e um valor mais baixo é uma qualidade mais alta.

  • Que você ffmpegpermita um filtro antes que a entrada me diga que pode estar desatualizado. Faça o download de uma compilação estática recente para o seu sistema operacional ou crie você mesmo de acordo com os guias de compilação, se o acima não funcionar.

slhck
fonte
11
Se seu objetivo é extrair os quadros-chave sem perdas, você pode tentar o seguinte:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Peltier
0

se este erro:

A opção vf (definir filtros de vídeo) não pode ser aplicada à URL de entrada 1508.mp4 - você está tentando aplicar uma opção de entrada a um arquivo de saída ou vice-versa. Mova esta opção antes do arquivo ao qual pertence. Erro ao analisar as opções do arquivo de entrada 1508.mp4. Erro ao abrir arquivos de entrada: argumento inválido

você consegue fazer isso:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

Parâmetros "-i" antecipadamente

Tom
fonte