Comment extraire une image d'une vidéo toutes les N secondes pour une image?

71

Comment convertir un fichier vidéo en séquence d'images, par exemple une image toutes les N secondes. Mplayer ou ffmpeg peuvent-ils le faire? J'ai utilisé MPlayer pour récupérer des captures d'écran manuellement, mais j'aimerais automatiser cela pour une longue vidéo.

Liam
la source
Consultez la question connexe concernant le choix de la qualité des images: stackoverflow.com/questions/10225403/…
Pierz

Réponses:

70

C'est très simple avec ffmpeg, et il peut sortir une image toutes les N secondes sans script supplémentaire. Pour exporter en tant que séquence d'images, utilisez simplement myimage_%04d.pngou similaire en tant que sortie. Le %0xdbit est converti en un nombre entier avec zéro-padded x- l’exemple que j’ai donné est obtenu sous forme de

  • myimage_0000.png,
  • myimage_0001.png,
  • myimage_0002.png

    etc..

Vous pouvez utiliser de nombreux formats d'images fixes, png, jpeg, tga, peu importe (voir la ffmpeg -formatsliste complète).

Ok, nous savons maintenant comment exporter le film sous la forme d'une séquence d'images, mais ne voulons-nous pas exporter chaque image?

L'astuce consiste simplement à changer la cadence de la sortie en tout ce que nous voulons en utilisant l' -r noption où nest le nombre d'images par seconde. Une image par seconde serait -r 1, une image toutes les quatre secondes -r 0.25, une image toutes les dix secondes -r 0.1et ainsi de suite.

Donc pour résumer, voici comment il serait possible d’économiser une image input.movtoutes les quatre secondes output_0000.png, output_0001.pngetc.:

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

Notez que l' -r 0.25option va après la -i input.movpartie, car elle contrôle le taux de trame de la sortie . Si vous le mettez avant l'entrée, le fichier d'entrée sera traité comme s'il avait la fréquence d'images spécifiée.

Remplacez le% xd par le nombre de chiffres requis, par exemple si la commande crée plus de 10 000 images, changez le %04den %05d. Cela fonctionne également pour les fichiers d'entrée qui sont une séquence d'images. Lire la suite ici .

Utilisateurs Windows : utilisation en ligne de commande%

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

Dans les scripts CMD et BAT, utilisez %%

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

Donc, double %%dans les scripts, et simple %sur la ligne de commande interactive. Se tromper dans les deux cas générera une erreur.

stib
la source
Que dois-je mettre dans -rsi je veux exporter chaque image? Si je connais le FPS de la vidéo, je suppose que je le sais, mais si je ne le savais pas?
Tomáš Zato
4
N'utilisez pas du tout le drapeau -r. Ensuite, FFMPEG utilisera la fréquence d'images du fichier d'entrée.
Stib
2
Notez que vous voudrez vraiment l' utiliser jpegspour cela, à moins que vous ne soyez sûr pngde ce que vous voulez. Dans mon cas, jpegs mesuraient environ 50 kb chacun, et pngs environ 2 Mo.
mlissner
5
L'avantage de pngs est la compression sans perte, donc si vous utilisez la séquence d'images comme intermédiaire et que la taille supplémentaire ne vous gêne pas, vous pouvez utiliser png.
Stib
Il vaut la peine d'ajouter que -q:v 1c'est une option très utile ici, comme dans superuser.com/questions/318845/…
Nikolay Shmyrev le
27
mplayer -vo jpeg -sstep 5 file.avi

enregistrera une image au format jpeg toutes les 5 secondes.

Cependant, il ne s’arrêtera pas à la fin du fichier, il continuera à produire des copies de la dernière image. Pour éviter cela, recherchez la durée de la vidéo en secondes, en utilisant un autre lecteur ou avec mplayer:

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

et cherchez une ligne du type "ID_LENGTH = 147.00".

Soustrayez 2 de la longueur et utilisez cette valeur pour l' -endposoption. Par exemple, pour une vidéo de 147 secondes:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
Liam
la source
cela ressemble à un bogue mplayer. belle solution de contournement.
Quack Quotote
Pourriez-vous au moins indiquer sur quel système d'exploitation utilisez-vous cette commande?
Tomáš Zato
C'était il y a 5 ans, mais c'était probablement le dernier bureau Ubuntu de l'époque, Ubuntu 10.4.
Liam
Comment puis-je choisir des étapes plus courtes que 1s. Il n'accepte que les entiers.
Fcpenha
De nos jours, mpv --vo=image --sstep=5 movie.mkvfonctionne très bien sans le bogue susmentionné ( mpv est un fork de mplayer) utilisant mpv 0.27.0 sur Debian.
Adam Katz
11

Avec ffmpeg, vous pouvez faire ce qui suit:

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

Cette commande génère une miniature JPG de taille 320 × 240 à la 4e seconde de la vidéo. Mettez ceci dans un script qui change l'heure et le nom du fichier et vous avez terminé.

Plus d'infos: Créer une vignette toutes les X secondes de la vidéo

Fusil
la source
Cela semble faire ce que je veux, mais avec un problème. Il traitera le fichier dès le début à chaque itération, devenant de plus en plus lent.
Liam
@Liam - Est-il utile de laisser le décalage décalé (définissez-le sur 1) et d'utiliser le -ss positiondrapeau pour rechercher davantage dans le fichier? -ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
Nifle
1
@liam: mettez le -ssavant le -ipour que la recherche se produise avant que la vidéo d'entrée soit décodée. cela devrait accélérer. source
Quack Quichotte
2
Il existe un meilleur moyen, beaucoup plus rapide, de le faire avec ffmpeg. Voir ma réponse ci-dessous.
Stib
La solution de stib est la meilleure OMI.
Griffin
8

Si vous recherchez une sorte de feuille de contact et si vous utilisez un système d'exploitation de type Unix, vous pouvez utiliser ce script élaboré, appelé Point de contact vidéo * NIX , short vcs .

En arrière-plan, il utilise également ffmpeg(par défaut) ou mplayerpeut donc gérer de nombreux formats vidéo. Il automatise le processus de capture des images fixes du film et les compose en une image avec un en-tête et un pied de page. Vous pouvez par exemple choisir le nombre de captures que vous souhaitez ou les différences de temps qui les séparent.

Pour un intervalle de 10 minutes, l'invocation est la suivante:

vcs -i 10m input.avi

Consultez la liste complète des options en ligne de commande pour d’autres réglages.

Voici un exemple de fiche de contact tiré de la page d'accueil :

entrez la description de l'image ici

mpy
la source
7

Avec VLC 1.1.0 et les versions ultérieures, vous pouvez utiliser le filtre de scènes vidéo:

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

Ce qui précède enregistre 1 image sur 24 (--scene-ratio = 24), commençant à 00:00:10 et se terminant à 00:00:11.

Je viens de tester et de confirmer que cela fonctionne avec VLC 2.0.3 sur une nouvelle installation de Windows 8 (je n’ai aucun plugin vidéo ou logiciel supplémentaire).

Documentation complète: http://wiki.videolan.org/How_to_create_thumbnails

Michael
la source
2

VirtualDub peut le faire pour vous

File-> Export->Image sequence

entrez la description de l'image ici

Shevek
la source
Est-ce que cela sauvera chaque image sous forme d'image?
Liam
oui, chaque image.
Shevek
Je dois ignorer la plupart des images, la sortie de toutes les images occupera trop d'espace de stockage. Je n'ai besoin que d'une image toutes les quelques secondes.
Liam
1

Vous pouvez aussi essayer ceci

à partir de la ligne de commande VLC ...

vlc "C: \ VOTRE \ fichier \ chemin \ fichier.avi" -V image --image-out-prefix = capname --image-out-ratio = 60

fichier.avi est la vidéo à partir de laquelle vous voulez capturer, capname est le préfixe des images enregistrées; vous pouvez également jouer avec le rapport (60 signifie qu'une image sur 60 est capturée). Vous pouvez ajouter d'autres commandes, par exemple --image-out-format jpeg enregistrera vos majuscules au format jpeg au lieu de pngs, --snapshot-path vous permet de choisir où sauvegarder vos majuscules.

Source de ci-dessus

Fusil
la source
J'ai eu ce message: Les options de ligne de commande ne pouvaient pas être chargées, vérifiez qu'elles sont valides.
Liam
Sur Ubuntu, j’ai reçu ce message: option inconnue ou argument obligatoire manquant `--image-out-prefix = capname '
Liam le
1

Vous pouvez ignorer des images dans VirtualDub. Il suffit d’utiliser l’option "Decimate By" située dans le menu Video -> Frame Rate. Par exemple, si vous définissez "Décimer par 100" puis utilisez Fichier -> Exporter -> Séquence d'images, cela n'enregistrera que toutes les 100 images.

Alex
la source