Comment extraire toutes les images clés d'un clip vidéo?

10

J'essaie d'extraire des images clés d'un clip vidéo. J'ai essayé la commande suivante, mais elle extrait toutes les images.

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
la source

Réponses:

20

Vous pouvez rendre cela plus simple à utiliser -skip_framesans avoir besoin de selectfiltre vidéo:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
radoh
la source
2
Incroyable, prend moins de 10 secondes sur une vidéo de 20 minutes contre plus de 3 minutes avec un filtre de sélection!
fou
Assurez-vous d'utiliser -threads 1, par rapport à la valeur par défaut, -threads autoil fait un cropdetectgraphique de filtre ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) 2x plus rapide sur mon système (60s à 30s)!
genpfault
Je n'utiliserais pas skip_frame nokey. Avez-vous même vérifié la sortie? Sur mes fichiers et build (août 2019), j'obtiens des horodatages incorrects, car dans nokey me donne l'image précédente avant l'image I, tandis que les images non filtrées / toutes les images montrent l'image I à un horodatage ultérieur.
JasonXA
La raison pour laquelle @genpfault suggère d'utiliser -threads 1est que sinon la séquence des images clés de sortie peut être émise dans le désordre . Si vous disposez d'une méthode post-hoc pour résoudre ce problème, vous pouvez conserver le multithread. En outre, il semble qu'il soit toujours possible d'obtenir des images clés hors service, même lors de l'utilisation -threads 1 , mais maintenant dans ce cas, toutes ces occurrences semblent être accompagnées / signalées par une erreur de décodeur h264 illegal short term buffer state detected.
Glenn Slayden
12

Exemple d'utilisation des filtres selectet scale:

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

Quelques conseils:

  • Les filtres ne doivent pas précéder l' -ioption, car ils sont une option de sortie. Je ne sais pas d'où vous venez exactement la commande, mais elle PICT_TYPE_In'existe pas - elle devrait l'être I.

  • Dans le scalefiltre, vous pouvez remplacer 73ou 41faire en sorte que le filtre calcule automatiquement la largeur ou la hauteur pour conserver les proportions: comme scale=73:-1ou scale=-1:41. Cela empêche l'étirement ou l'écrasement qui peuvent résulter d'une mise à l'échelle "forcée".

  • La qualité de sortie peut être contrôlée avec -qscale:v(ou l'alias -q:v). La plage efficace est une échelle linéaire de 2 à 31 et une valeur inférieure est une qualité supérieure.

  • Que votre ffmpegautorise un filtre avant l'entrée me dit qu'il pourrait être obsolète. Téléchargez une version statique récente de votre système d'exploitation, ou créez-la vous-même selon les guides de compilation si ce qui précède ne fonctionne pas.

slhck
la source
1
Si votre objectif est d'extraire les images clés sans perte, vous pouvez essayer ce qui suit:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Peltier
0

si cette erreur:

L'option vf (définir les filtres vidéo) ne peut pas être appliquée à l'URL d'entrée 1508.mp4 - vous essayez d'appliquer une option d'entrée à un fichier de sortie ou vice versa. Déplacez cette option avant le fichier auquel elle appartient. Erreur d'analyse des options pour le fichier d'entrée 1508.mp4. Erreur lors de l'ouverture des fichiers d'entrée: argument non valide

tu peux le faire:

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

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

Paramètres «-i» à l'avance

À M
la source