Comment extraire les horodatages associés aux images ffmpeg extraits d'une vidéo avec l'option -r?

12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

Est la commande que j'utilise pour extraire les images et fonctionne comme prévu. Cependant, je voudrais également regarder les horodatages des images. Quelle que soit la précision. 100 millisecondes me suffisent. Ffmpeg peut-il faire cela?

Fournir des détails supplémentaires,

Lorsque j'exécute la commande ci-dessus, j'obtiens environ 100 JPEG, je suppose qu'il y a une correspondance 1 à 1 (ou plusieurs à 1) entre ces JPEG et les images de la vidéo. Je voudrais connaître l'horodatage de l'image qui a été sortie en tant qu'image JPEG «i».

De plus, j'ai essayé ffprobe mais je trouve qu'il rapporte même la durée de la vidéo de manière inexacte :(

Srini
la source
Comme quoi? AFAIK jpeg n'a pas de telles métadonnées. L'horodatage EXIF ​​est pour le capturetemps.
Rajib
Bien sûr, le JPEG n'a pas les métadonnées, mais le mp4 pourrait. Puis-je demander à ffmpeg de le tirer avec les images qu'il encode plus tard au format JPEGS et de sauvegarder les horodatages dans un fichier?
Srini
Veuillez inclure la ffmpegsortie console complète de votre commande.
llogan
ffprobe peut vous fournir les informations d'horodatage du flux vidéo mp4. Vous demandez-vous si des images peuvent être dupliquées ou supprimées, alors quelle est la correspondance avec les horodatages mp4 d'origine? Dans ce cas, j'explorerais l'augmentation des paramètres de verbosité pour voir si vous pouvez obtenir l'image image par image pendant l'exécution. Pourriez-vous développer ce que vous entendez par «horodatages associés aux images».
dstob
@dstob Les horodatages associés aux images sont les horodateurs de présentation de la vidéo d'entrée, c'est-à-dire quand chaque image doit être affichée, par rapport au début de la vidéo.
slhck

Réponses:

13

Ce que vous pouvez faire est de "simuler" le processus d'écriture d'image en filtrant avec le fpsfiltre, puis en utilisant ffprobepour afficher les horodatages des images générées. Cela signifie qu'à 25 ips, la 50e image (comme votre 50e image) aura un PTS de 2,00 secondes.

Vous le faites comme ceci:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

Sortira:

0
0.04
0.08
0.12
0.16
...

Ce sont les horodatages de chaque image de sortie. Vous pouvez réellement combiner la liste des images et les horodatages:

ls -1 image - *. jpeg> images.txt
ffprobe -f lavfi -i "movie = input.mp4, fps = fps = 25 [out0]" -show_frames -show_entries frame = pkt_pts_time -of csv = p = 0> frames.txt
coller images.txt frames.txt> combiné.txt

Va créer un fichier avec:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

Notez que cela peut entraîner des lignes superflues s'il y a trop de trames ou trop de lignes d'informations en sortie. Cela semble un peu inexact là-bas.

slhck
la source
S'agit-il de l'horodatage par rapport à une fréquence d'images constante placée sur la sortie ou de la correspondance des jpeg sortis avec les horodatages mp4 d'origine qui pourraient être n'importe quelle fréquence d'images et avoir des valeurs d'horodatage?
dstob
Cet horodatage est basé sur la fréquence d'images de sortie demandée. Elle concerne à la fois les images de sortie ainsi que les images vidéo d'entrée d'origine dont ces images proviennent - il n'y a qu'une seule base de temps. Cela fonctionne car lors du changement de la fréquence d'images, ffmpeg ne lira pas (bien sûr) la vidéo plus rapidement, mais "allongera" le temps de présentation de chaque image et supprimera les images inutiles.
slhck
Pourquoi ne doit-il y avoir qu'une seule base de temps lorsque vous créez manuellement la base de temps de sortie? Ce ne sera pas toujours le cas, bien sûr, mais sur la première vidéo à 60 ips que j'ai lancée, ffmpeg vient de créer sa propre base de temps en ignorant les horodatages de l'entrée.
dstob
Je ne suis pas sûr de comprendre exactement où vous voulez en venir. ffmpeg sélectionne comme base de temps d'entrée tout ce qu'il analyse comme base de temps du premier fichier d'entrée . Vous pouvez bien sûr également demander à ffmpeg de supprimer les horodatages d'entrée avec -vsync drop, mais cela se produit après le filtrage, IIRC.
slhck