Jai des images vidéo au format PNG à 1 FPS et jessaye de les convertir en vidéo en utilisant ffmpeg.
Si je fais quelque chose comme ça:
ffmpeg -i data/input-%4d.png data/output.mp4
Jobtiens une vidéo à 25FPS qui est essentiellement un avance très rapide de lentrée (qui est capturée à 1FPS).
Si jessaye:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Jobtiens quelque chose que VLC ne veut pas lire 🙂
Maintenant, si je prends la première vidéo (celle FF) et applique un filtre pour la ralentir (par exemple -filter:v "setpts=24.0*PTS"
), je peux le faire jouer comme une vidéo 1 FPS, mais bien sûr, le prix est la taille du fichier. Cela génère un tas dimages répétées, je suppose.
Donc, la question est de savoir comment créer une vidéo qui a exactement 1 FPS et qui joue réellement à cette vitesse? Le format de sortie, btw, nest pas Cest important pour moi.
Commentaires
Réponse
Si vous voulez un one-liner pour FFMPEG qui génère une vidéo qui joue à 1 image par seconde, ce que vous voulez faire est de spécifier des cadences pour lentrée et la sortie, comme ceci:
ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4
Le -r 1
signifie que la vidéo sera lue à 1 des images originales par seconde.
Le -r 10
signifie que la vidéo sera lue à 10 images par seconde.
(Le -pix_fmt yuv420p
est juste là pour assurer la compatibilité avec une large gamme de programmes de lecture. Il est nécessaire ici, par exemple, pour que la vidéo puisse être lue par Windows Media Player.)
Jai testé de nombreux taux de trame de sortie différents, et 10 semble être le plus petit nombre que vous pouvez utiliser qui produira encore un vidéo que VLC va lire.
Bien sûr, la commande ci-dessus signifie que chaque image originale est multipliée, mais cest une méthode plus simple que celle « ralentir » que vous avez mentionnée, et en fonction du codec, elle peut ne pas produire une vidéo beaucoup plus grande quune vraie vidéo 1-FPS.
Pour tester cela, je viens de produire une vraie vidéo 1-FPS, qui est sortie à 2,24 kio. Jai ensuite produit une vidéo avec les mêmes images dentrée mais une sortie à 24 FPS, et elle est sortie à 5,76 kio. Cest un peu plus du double de la taille, et loin de 24 fois la taille. 🙂
Commentaires
- +1 sur -pix_fmt. Facile à oubliez que certaines personnes insistent pour utiliser WMP 🙂
- pourquoi voudriez-vous que le format de sortie soit de 10 ips alors que lentrée est seulement de 1? ‘ t il créer des trames redondantes à 90% qui sont exactement les mêmes?
- @Herbert il crée des trames redondantes afin que vous puissiez obtenir la fréquence dimages jusquà 10, ce qui est fait juste pour que VLC ne le fasse pas « f113ec452d »>
t se plaindre , et cela ne change pas ‘ visuellement la vidéo. Lencodeur est assez intelligent pour voir que les images sont toutes identiques donc vous n’avez pas ‘ vous retrouver avec un fichier beaucoup plus volumineux
Réponse
Utilisez les deux -framerate
et -r
Par exemple, pour avoir une vidéo finale qui ressemble à 1FPS:
ffmpeg -framerate 1 -pattern_type glob -i "*.png" \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Ceci est similaire à ce que Conversion dimages PNG en vidéo à 1 FPS | Unix & Linux Stack Exchange dit, mais javais besoin de -framerate
au lieu de -r
pour que cela fonctionne.
Ceci est mentionné sur le wiki à: http://trac.ffmpeg.org/wiki/Slideshow#Framerates
Il définit la fréquence dimages de sortie sur 30
, que VLC peut gérer, et copie chaque image 30 fois, de sorte que la vidéo de sortie semble être à 1 FPS. Voir aussi: Problèmes de lecture dans VLC avec une vidéo à faible fps à partir dimages utilisant ffmpeg | Stack Overflow
VLC est alors capable de lire la vidéo normalement.
Testé sur Ubuntu 16.10, VLC 2.2.4, ffmpeg
3.0.5, dans un répertoire avec 10 PNG.
Voir aussi: https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg
Commentaires
- Quelle ‘ est la différence entre
-r
et-framerate
? - @Royi Je ne ‘ Je ne sais vraiment pas, sauf que cest la seule chose qui a fonctionné pour moi 🙂 Mais si vous avez réussi à extrayez-le des pages
man
, faites le moi savoir 😉 Une citation significative est » -r Comme option dentrée, ignorez tout horodatages stockés dans le fichier et à la place génèrent des horodatages en supposant une fréquence dimages constante. Ce nest pas la même chose que loption -framerate utilisée pour certains formats dentrée comme image2 ou v4l2 (cétait la même chose dans les anciennes versions de FFmpeg). En cas de doute, utilisez -framerate au lieu de loption dentrée -r. »
Answer
Que faire si vous augmentez légèrement votre deuxième exemple comme suit:
$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4
Le -r 1
doit venir avant les fichiers .png, pas après.
De la documentation FFmpeg :
En règle générale, les options sont appliquées au fichier spécifié suivant. Par conséquent, lordre est important et vous pouvez avoir la même option sur la ligne de commande plusieurs fois. Chaque occurrence est ensuite appliquée au fichier dentrée ou de sortie suivant.
Commentaires
- Malheureusement, ceci ne marche pas. Cependant, mentionner que la commande est importante ma fait gagner beaucoup de temps. Merci.
Réponse
Il sagit dun bogue dans VLC (qui existe toujours dans la version 3.0.6). Après quelques expériences, jai réalisé que VLC plante pour les vidéos avec un FPS inférieur à 10 . Donc, toutes les vidéos avec 10 FPS ou plus ne devraient pas être un problème. Il ny a donc actuellement aucun moyen propre dobtenir une vidéo avec 1 FPS qui soit lisible dans VLC ( don « t abandonner, continuez à lire ).
Une solution de contournement est -comme indiqué dans la réponse ci-dessus- de simuler leffet de 1 FPS en dupliquant les images (lorsque nous avons en fait un FPS égal à 10 ou plus, ce qui est correct pour VLC).
Exemple: si vous avez un dossier avec 12 images, et que vous souhaitez générer une vidéo avec 1 FPS (qui est jouable dans VLC), alors vous devez dupliquer chaque image plusieurs fois (disons 10 fois), puis dire FFMPEG pour générer une vidéo de 10 FPS. De cette façon, nous obtiendrons une vidéo avec un total de 120 images, où chaque image sera lue pendant 1 seconde (car elle est dupliquée 10 fois), ce qui est simplement un faux pour 1 FPS.
Je préfère utiliser le paramètre fps
plutôt que
(qui est indiqué dans une autre réponse) qui peut dans certains cas être problématique (selon le documentation officielle ).
ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv
Comme lentrée -framerate
est inférieure à la sortie fps
, FFMPEG dupliquera les images pour atteindre la fréquence dimages de sortie souhaitée (qui est de 10 selon la commande ci-dessus).
Cest aussi important de noter que lordre de -framerate
et -vf fps
est important , car cette configuration sera appliquée à la vidéo mentionnée suivante (entrée ou sortie). Cest selon les documents officiels :
les options sont appliquées au prochain spécifié déposer. Par conséquent, lordre est important …
ffmpeg
est suffisamment intelligent pour déterminer le codec vidéo uniquement à partir de lextension de fichier au format conteneur,.mp4
. Essayez dajouter-vcodec libx264 -vpre hq
à la ligne de commande, pour lui indiquer le codec et les paramètres dencodage.-r 1
.