Faire une miniature à partir de la vidéo


11

Comment puis-je faire une capture simple à partir d'une vidéo. De préférence depuis la ligne de commande?

Idée: prendre 9 instantanés pour 9 fois placés (sur la chronologie) et les enregistrer en JPG

Exemple:

Movie length = 10 min
T1= snapshot of 1 min
T2= snapshot of 2 min
......
T9= snapshot of 9 min
   |   |
 T1| T2| T3
---+---+---
 T4| T5| T6
---+---+---
 T7| T8| T9
   |   |

Quel est le meilleur programme pour ce faire? Existe-t-il des programmes open source?

Réponses:


5

ffmpeg est un excellent outil open source pour manipuler des vidéos, y compris l'extraction d'images.

Pour extraire une seule image d'un horodatage spécifique, vous pouvez utiliser une commande comme

ffmpeg -i video.avi -r 1  -t 00:01:00 -f image2 image%05d.png

-r est framerate. Vous pouvez également utiliser une commande comme

ffmpeg -i video.avi -r 1/1440 -f image2 image%05d.png

pour obtenir une image toutes les minutes (en supposant une vidéo 24FPS). Le% 05d signifie que le nombre ordinal de chaque image miniature doit être formaté en utilisant 5 chiffres.

Si vous souhaitez combiner des images en tant que montage (votre grille), vous pouvez utiliser imagemagick après avoir extrait des images à l'aide de ffmpeg.



1

vcsi est un outil en ligne de commande écrit en Python qui peut être utilisé pour créer une grille de snapshots 3 x 3 avec la commande suivante:

vcsi -g 3x3 video.mkv -o output.jpg

0

Mon cas d'utilisation n'est qu'une vignette d'une vidéo, un seul fichier à utiliser comme <video>affiche de balise. Alors, quel serait un moyen rapide de faire cela?

Avec ffmpeg, vous pouvez faire ceci:

ffmpeg -ss 123 -y -i video.mp4 -r 1 -updatefirst 1 -frames 1 poster.jpg

Cela vous donnera le cadre près de la seconde 123du video.mp4fichier enregistré sous poster.jpg.

Le problème, comme vous pouvez le voir, est que nous devons savoir quelle seconde est la bonne.

Afin de garder nos dépendances faibles, nous utiliserons ffmpeg lui-même pour cela:

# Get the time as h:m:s (non-padded)
l=$(ffmpeg -i video.mp4 2>&1 | grep Duration: | sed -r 's/\..*//;s/.*: //;s/0([0-9])/\1/g')
# Convert that into seconds
s=$((($(cut -f1 -d: <<< $l) * 60 + $(cut -f2 -d: <<< $l)) * 60 + $(cut -f3 -d: <<< $l)))
# Get frame at 25% as the thumbnail
ffmpeg -ss $((s / 4)) -y -i video.mp4 -r 1 -updatefirst 1 -frames 1 poster.jpg

25% de la vidéo semble être un choix commun, mais vous pouvez aussi la faire à 33% ou 50%.

Voici un script qui fait cela .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.