Comment extraire 1 capture d'écran pour une vidéo avec ffmpeg à un moment donné?

109

Il existe de nombreux tutoriels et trucs montrant comment extraire plusieurs captures d'écran d'une vidéo à l'aide de ffmpeg. Vous définissez -r et vous pouvez même commencer un certain montant.

Mais je veux juste 1 capture d'écran à, disons 01:23:45 po. Ou 1 capture d'écran à 86%.

Tout cela est possible avec ffmpegthumbnailer mais c'est une autre dépendance dont je ne veux pas dépendre. Je veux pouvoir le faire avec ffmpeg.

Peter Bengtsson
la source

Réponses:

208

Utilisez l' -ssoption:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • Pour la sortie JPEG, utilisez -q:vpour contrôler la qualité de sortie. La gamme complète est une échelle linéaire de 1 à 31 où une valeur inférieure se traduit par une qualité supérieure. 2-5 est une bonne gamme à essayer.

  • Le filtre de sélection fournit une méthode alternative pour des besoins plus complexes tels que la sélection de certains types de trame uniquement, ou 1 pour 100, etc.

  • Le placement -ssavant l'entrée sera plus rapide. Voir FFmpeg Wiki: Seeking et cet extrait de la ffmpegdocumentation de l'outil cli :

-ss position (entrée / sortie)

Lorsqu'il est utilisé comme option d'entrée (avant -i), cherche dans ce fichier d'entrée à positionner. Notez que dans la plupart des formats, il n'est pas possible de rechercher exactement, donc ffmpegcherchera au point de recherche le plus proche avant la position. Lorsque le transcodage -accurate_seekest activé (par défaut), ce segment supplémentaire entre le point de recherche et la position sera décodé et ignoré. Lorsque vous effectuez une copie de flux ou lorsqu'elle -noaccurate_seekest utilisée, elle sera préservée.

Lorsqu'il est utilisé comme option de sortie (avant un nom de fichier de sortie), décode mais rejette l'entrée jusqu'à ce que les horodatages atteignent la position.

la position peut être exprimée en secondes ou en hh:mm:ss[.xxx]forme.

llogan
la source
2
C'est BEAUCOUP plus rapide. Merci beaucoup. Mettre le -ss en premier fait une énorme différence.
Peter Bengtsson
y a-t-il un moyen d'obtenir la n-ième image après le temps spécifié?
dorien
@GuntherPiez Je ne vois aucune mention d'artefacts possibles.
Stefan Reich
2
Notez que vframesc'est obsolète dans (au moins) la version 4.2.2. Par manuel "[ vframes] est un alias obsolète pour" -frames:v", que vous devriez utiliser à la place."
Synexis
Fonctionne parfaitement et rapidement.
Smeterlink
37

FFMpeg peut le faire en recherchant l'horodatage donné et en extrayant exactement une image en tant qu'image, voir par exemple:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg

Expliquons les options:

-i input file           the path to the input file
-ss 01:23:45            seek the position to the specified timestamp
-vframes 1              only handle one video frame
output.jpg              output filename, should have a well-known extension

Le -ssparamètre accepte une valeur sous la forme HH:MM:SS[.xxx]ou sous la forme d'un nombre en secondes. Si vous avez besoin d'un pourcentage, vous devez au préalable calculer la durée de la vidéo.

SirDarius
la source
Semble fonctionner comme prévu. Je suis actuellement en train de comparer si c'est la même vitesse que l'utilisation de ffmpegthumbnailer.
Peter Bengtsson
Ouais, cette approche est super lente. Voir peterbe.com/plog/fastest-way-to-take-screencaps-out-of-videos
Peter Bengtsson
7
essayez d'utiliser l'option -ss avant -i car elle ignorera la partie décodage du pipeline. Cela pourrait accélérer le processus.
SirDarius
1
Existe-t-il un moyen de sortir au format PNG dans le flux au lieu d'un fichier?
Nicke Manarin
1
@NickeManarin Oui .. ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg. Notez que j'ai également mis l' -ssoption "rechercher" avant le fichier d'entrée sur la ligne de commande, comme d'autres l'ont recommandé.
Glenn Slayden