113 votes

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

Comment puis-je convertir un fichier vidéo en une séquence d'images, par exemple une image toutes les N secondes. Est-ce que mplayer ou ffmpeg peuvent faire cela? J'ai utilisé MPlayer pour capturer des captures d'écran manuellement mais j'aimerais automatiser cela pour une longue vidéo.

0 votes

Voir cette question connexe sur le choix de la qualité des images: stackoverflow.com/questions/10225403/…

125voto

stib Points 3975

C'est très simple avec ffmpeg, et il peut produire une image toutes les N secondes sans script supplémentaire. Pour exporter comme une séquence d'images, il suffit d'utiliser myimage_%04d.png ou similaire en tant que sortie. Le bit %0xd est converti en un entier avec des zéros x chiffres de long - l'exemple que j'ai donné produit en sortie

  • 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 ffmpeg -formats pour une liste complète).

D'accord donc maintenant nous savons comment exporter le film en une séquence d'images, mais disons que nous ne voulons pas exporter chaque image?

La astuce est simplement de changer le débit d'images de la sortie à ce que nous voulons en utilisant l'option -r nn est le nombre d'images par seconde. 1 image par seconde serait -r 1, une image toutes les quatre secondes serait -r 0.25, une image toutes les dix secondes serait -r 0.1 et ainsi de suite.

Donc pour mettre tout cela ensemble, voici à quoi cela ressemblerait pour enregistrer une image de input.mov toutes les quatre secondes en output_0000.png, output_0001.png etc.:

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

Remarquez que l'option -r 0.25 va après la partie -i input.mov, car elle contrôle le débit d'images de la sortie. Si vous la mettez avant l'entrée, elle traitera le fichier d'entrée comme s'il avait le débit d'images spécifié.

Changez le %xd en fonction du nombre de chiffres dont vous avez besoin, par exemple si la commande crée plus de 10 000 images, changez %04d en %05d. Cela fonctionne également pour les fichiers d'entrée qui sont une séquence d'images. Lisez plus ici.

Utilisateurs de Windows: En ligne de commande utilisez %

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 l'une ou l'autre des situations générera une erreur.

Éditer Il est intéressant de consulter la discussion sur les types de fichiers dans les commentaires ci-dessous. Il y a des avantages et des inconvénients avec chacun:

  • jpeg beaucoup plus petits tailles de fichiers, perte de qualité, seulement 8-bit couleur, pas d'alpha.
  • png sans perte, fichiers volumineux, lent. 8-bit couleur prend en charge l'alpha.
  • tiff sans perte, fichiers encore plus volumineux, rapide, prend en charge jusqu'à 16 couleurs et alpha.

Pour spécifier le format de fichier, utilisez simplement l'extension requise dans le fichier de sortie, par exemple myimage_%04d.jpg, myimage_%04d.png ou myimage_%04d.tiff

1 votes

Que dois-je mettre dans -r si je veux exporter chaque image ? Si je connais les images par seconde de la vidéo, je suppose que je les entre, mais que faire si je ne les connais pas ?

7 votes

Ne pas utiliser le drapeau -r du tout. Ensuite, FFMPEG utilisera la fréquence d'images du fichier d'entrée.

3 votes

Notez que vous voudrez vraiment utiliser des jpegs pour cela, sauf si vous êtes sûr que les png sont ce que vous voulez. Dans mon cas, les jpeg pesaient environ 50ko chacun, et les png pesaient environ 2Mo.

35voto

Chris Tybur Points 1269
mplayer -vo jpeg -sstep 5 file.avi

enregistrera une image sous forme de fichier 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, trouvez 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 comme "ID_LENGTH=147.00".

Soustrayez 2 de la durée, et utilisez cette valeur pour l'option -endpos. Par exemple, pour une vidéo de 147 secondes :

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi

0 votes

Il semble que ce soit un bug de mplayer. Belle solution de contournement.

0 votes

Pouvez-vous au moins mentionner sur quel système d'exploitation vous utilisez cette commande?

0 votes

Il y a 5 ans, c'était probablement la dernière version d'Ubuntu Desktop à l'époque, Ubuntu 10.4.

19voto

user2013 Points 2301

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 vignette JPG de taille 320×240 à la 4ème seconde de la vidéo. Mettez cela dans un script qui modifie le temps et le nom du fichier et vous avez terminé.

Plus d'informations : Créer une image miniature toutes les X secondes de la vidéo

2 votes

Cela semble faire ce que je veux, mais avec un problème. Il traitera le fichier à partir du début à chaque itération, devenant exponentiellement lent.

0 votes

@Liam - Est-ce que cela vous aide si vous laissez le temps de décalage tel quel (définissez-le à 1) et utilisez le drapeau -ss position pour rechercher plus loin dans le fichier à la place ? -ss Recherche à la position donnée dans le temps en secondes. La syntaxe hh:mm:ss[.xxx] est également supportée

1 votes

@liam : placez le -ss avant le -i afin que la recherche se fasse avant que la vidéo d'entrée ne soit décodée. Cela devrait accélérer le processus. source

9voto

mpy Points 24817

Si vous recherchez un type de feuille de contacts et que vous travaillez avec un OS de type Unix, vous pouvez utiliser ce script élaboré, appelé à juste titre Feuille de contacts vidéo *NIX, abrégé vcs.

En arrière-plan, il utilise également ffmpeg (par défaut) ou mplayer, ce qui lui permet de gérer de nombreux formats vidéo. Il automatise le processus de capture d'images fixes à partir du film et de les composer pour en faire une image avec un en-tête et un pied de page. Vous pouvez choisir par exemple le nombre de captures que vous souhaitez ou encore les écarts de temps entre elles.

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 ajustements.

Voici un exemple de feuille de contacts, prise sur la page d'accueil :

entrer la description de l'image ici

7voto

Michael Points 1733

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

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

Le code ci-dessus enregistre 1 image sur 24 (--scene-ratio=24), à partir de 00:00:10 et se terminant à 00:00:11.

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

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X