J'ai des images vidéo au format PNG à 1 FPS et j'essaie 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
J'obtiens une vidéo à 25FPS qui est fondamentalement une avance très rapide de l'entrée (qui est capturée à 1FPS).
Si j'essaye:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Je reçois quelque chose que VLC ne veut pas jouer :)
Maintenant, si je prends la première vidéo (celle de FF) et applique un filtre pour la ralentir (par exemple -filter:v 'setpts=24.0*PTS'
), je peux la 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 d'images répétées, je suppose.
Donc, la question est de savoir comment créer une vidéo qui a exactement 1 FPS et joue réellement à cette vitesse? Le format de sortie, btw, n'est pas si important pour moi.
la source
ffmpeg
est assez intelligent pour le codec vidéo seulement de l'extension de fichier de format conteneur,.mp4
. Essayez d'ajouter-vcodec libx264 -vpre hq
à la ligne de commande, pour lui dire le codec et les paramètres d'encodage.-r 1
.Réponses:
Si vous voulez une doublure 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 fréquences d'images pour l'entrée et la sortie, comme ceci:
Cela
-r 1
signifie que la vidéo sera lue à 1 des images originales par seconde.Cela
-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 soit lisible par Windows Media Player.)J'ai testé de nombreuses fréquences de sortie différentes, et 10 semble être le nombre le plus bas que vous pouvez utiliser qui produira toujours une vidéo que VLC jouera.
Bien sûr, la commande ci-dessus signifie que chaque image d'origine est multipliée, mais c'est une méthode plus simple que celle de "ralentir" que vous avez mentionnée, et selon le codec, elle peut ne pas produire une vidéo beaucoup plus grande qu'un vrai 1-FPS vidéo.
Pour tester cela, je viens de produire une vraie vidéo 1-FPS, qui est sortie à 2,24 kiB. J'ai ensuite produit une vidéo avec les mêmes images d'entrée mais une sortie à 24 FPS, et elle est sortie à 5,76 koB. C'est un peu plus du double de la taille, et nulle part près de 24 fois la taille. :)
la source
Utilisez les deux
-framerate
et-r
Par exemple, pour avoir une vidéo finale qui ressemble à 1FPS:
Ceci est similaire à ce que la conversion d'images PNG en vidéo à 1 FPS | Unix et Linux Stack Exchange dit, mais j'avais besoin
-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 d'images de sortie sur
30
laquelle 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 d'images utilisant ffmpeg | Débordement de pileVLC peut alors 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 également: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg
la source
-r
et-framerate
?man
pages, faites le moi savoir ;-) Une citation significative est "-r Comme option d'entrée, ignorez tous les horodatages stockés dans le fichier et générez à la place des horodatages en supposant une cadence d'images par seconde constante. Ce n'est pas la même chose que l'option -framerate utilisée pour certains formats d'entrée comme image2 ou v4l2 (elle était la même dans les anciennes versions de FFmpeg). En cas de doute, utilisez -framerate au lieu de l'option d'entrée -r. "Et si vous augmentez légèrement votre deuxième exemple comme suit:
Les
-r 1
besoins doivent venir avant les fichiers .png, pas après.De la documentation FFmpeg :
la source
Il s'agit d'un bogue dans VLC (qui existe toujours dans la version 3.0.6). Après quelques expériences, j'ai réalisé que VLC se bloque pour les vidéos avec FPS inférieur à 10 . Donc, toutes les vidéos avec 10 FPS ou plus ne devraient pas être un problème. Il n'y a donc actuellement aucun moyen propre d'obtenir une vidéo avec 1 FPS qui est jouable en VLC ( n'abandonnez pas, continuez à lire ).
Une solution de contournement consiste, comme indiqué dans la réponse ci-dessus, à simuler l'effet 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 peut être lu dans VLC), 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 tout simplement un faux pour 1 FPS.
Je préfère utiliser un
fps
paramètre plutôt que-r
(ce qui est indiqué dans une autre réponse) qui peut dans certains cas être problématique (selon la documentation officielle ).Comme l'entrée
-framerate
est inférieure à la sortiefps
, FFMPEG dupliquera les images pour atteindre la fréquence d'images de sortie souhaitée (qui est de 10 selon la commande ci-dessus).Il est également important de noter que l'ordre de
-framerate
et-vf fps
est important , car cette configuration sera appliquée à la vidéo suivante (entrée ou sortie). C'est selon les documents officiels :la source