Conversion d'images PNG en vidéo à 1 FPS

21

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.

Assaf Lavie
la source
Je ne suis pas sûr ffmpegest 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.
Warren Young
En fait, cela s'est bien passé, et comme je l'ai mentionné, cela a bien fonctionné et n'a produit des résultats étranges que lorsque j'ai ajouté -r 1.
Assaf Lavie
Je pense que vous aurez peut-être plus de chance à une réponse ffmpeg sur stackoverflow.com ou superuser.com .
Damien

Réponses:

19

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:

ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4

Cela -r 1signifie que la vidéo sera lue à 1 des images originales par seconde.
Cela -r 10signifie que la vidéo sera lue à 10 images par seconde.

(Le -pix_fmt yuv420pest 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. :)

UN M
la source
+1 sur -pix_fmt. Facile à oublier, certaines personnes insistent pour utiliser WMP :-)
Smalltown2k
pourquoi voudriez-vous que le format de sortie soit de 10 ips alors que l'entrée n'est que de 1? Cela ne créerait-il pas 90% de trames redondantes qui sont exactement les mêmes?
Herbert
@Herbert, il crée des images redondantes afin que vous puissiez obtenir la fréquence d'images jusqu'à 10, ce qui est fait juste pour que VLC ne se plaint pas et ne change pas visuellement la vidéo. L'encodeur est assez intelligent pour voir que les images sont toutes identiques, donc vous ne vous retrouvez pas avec un fichier beaucoup plus volumineux
chiliNUT
@chiliNUT clear, l'image clé, ce qui n'est pas le cas de tous les formats, mais de la plupart des formats sensés. Merci!
Herbert
5

Utilisez les deux -framerateet-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 la conversion d'images PNG en vidéo à 1 FPS | Unix et Linux Stack Exchange dit, mais j'avais besoin -framerateau lieu de -rpour 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 30laquelle 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 pile

VLC peut alors lire la vidéo normalement.

Testé sur Ubuntu 16.10, VLC 2.2.4, ffmpeg3.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

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source
Quelle est la différence entre -ret -framerate?
Royi
@Royi Je ne sais pas vraiment, sauf que c'est la seule chose qui a fonctionné pour moi :-) Mais si vous avez réussi à l'extraire des manpages, 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. "
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
3

Et 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

Les -r 1besoins doivent 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, l'ordre est important et vous pouvez avoir la même option plusieurs fois sur la ligne de commande. Chaque occurrence est ensuite appliquée au fichier d'entrée ou de sortie suivant.

slm
la source
Malheureusement ça ne fonctionne pas. Cependant, mentionner que la commande est importante m'a fait gagner beaucoup de temps. Merci.
Mohammed Noureldin
0

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 fpsparamè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 ).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

Comme l'entrée -framerateest inférieure à la sortie fps, 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 -framerateet -vf fpsest important , car cette configuration sera appliquée à la vidéo suivante (entrée ou sortie). C'est selon les documents officiels :

les options sont appliquées au fichier spécifié suivant. Par conséquent, l'ordre est important ...

Mohammed Noureldin
la source