2016-04-13 7 views
10

Je suis en train d'enregistrer une vidéo avec FFmpeg et je voudrais que la fréquence d'images avec laquelle elle est écrite soit au moins correcte. À l'heure actuelle, je prends le taux de trame que mon entrée prétend avoir et l'utiliser pour définir la fréquence d'images (base de temps) pour mon flux vidéo de sortie. Cependant, cela est parfois très différent de la fréquence d'images réelle que je reçois (j'ai vu un flux réclamant 50 fps mais publiant à 9 fps). Ce que je voudrais faire est d'utiliser une minuterie écoulée et de compter les images que j'enregistre pour calculer la fréquence d'image réelle que j'ai enregistrée au moment où j'ai fini d'enregistrer. Je dirais cependant que la fréquence d'images est définie dans mon AVStream est utilisé dans avcodec_open2 avant d'écrire des images. Si je le mets plus tard (comme lorsque j'écris des images) alors que ffplay peut le lire (se plaignant que les bits d'incrément de temps sont 6 et non 4), les autres lecteurs vidéo ne le peuvent pas. Y at-il un moyen de définir la fréquence d'images pour l'ensemble du fichier après l'écriture des cadres? Si ce n'est pas le cas, est-il possible de dire aux trames elles-mêmes une sorte d'horodatage ou de fréquence d'images pendant l'enregistrement, ce qui donnera un fichier enregistré valide?Enregistrer une vidéo avec un framerate inconnu avec FFmpeg

+0

salut, je vais regarder plus, mais je voulais juste poser des questions sur avconv. trouvé après une recherche rapide google, il semble qu'il peut changer la fréquence d'images d'un fichier. peut-être pourriez-vous écrire le fichier à une fréquence d'images arbitraire, puis après avoir détecté le débit réel, terminer l'écriture et exécuter avconv avec le nouveau taux? juste une pensée, pas une vraie réponse;) continuera à regarder bien. faites le moi savoir. – nephi12

+0

avconv est le nom binaire du projet libav. (http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg-or-is-there-even-a-difference) a un assez bon résumé de tous les noms qui avaient Je suis confus depuis pas mal de temps. Tout ce que avconv fait devrait être possible avec les bibliothèques qu'il utilise. – Chris

Répondre

0

L'astuce semble être d'utiliser AVCodecContext time_base et AVFrame pts d'une manière plus intelligente que je l'étais. Si vous enregistrez avec une fréquence d'images fixe, time_base est réglé sur 1/framerate et le pts est juste un nombre incrémenté pour l'image enregistrée. Au lieu de cela, je commence maintenant une minuterie quand je commence mon enregistrement et positionne time_base à 1 sur la granularité de la minuterie (dans mon cas, elle a une précision d'une milliseconde donc 1000). Je définis le nombre de pts de trame sur la durée écoulée avant son encodage. Cette combinaison résulte en un fichier vidéo avec une fréquence d'images variable qui est reproduite correctement.

0

Chris. Vous devez développer un nouveau moteur d'écriture de flux vidéo. Ainsi, si vous réglez la fréquence d'images sur [N], le moteur d'écriture écrit des trames selon le débit.

  • Vérification Horodatage pour chaque image lors de l'écriture
  • Si vous avez moins d'images que N pour une seconde, vous devez faire des cadres en double.
  • Si vous avez plus d'images que N pendant une seconde, vous devez supprimer certaines images.

Avant d'écrire, vous devez spécifier le framerate exact.

Et votre moteur d'écriture de fichiers vidéo doit fonctionner avec un taux de framerate spécifié.

Vous pouvez implémenter ceci en utilisant ffmpeg.

+0

Cela semble être le meilleur que vous puissiez faire avec une fréquence d'images variable, mais que faire si elle était fixe et inconnue? Dans le cas où j'ai présenté le flux revendique 50 fps mais est en fait 9 alors pendant que votre approche fonctionnerait, j'enregistrerais plus de 5 fois plus de trames que j'en aurais besoin. Fondamentalement, pour que cela fonctionne bien, vous devez toujours connaître la fréquence d'images avant de commencer. – Chris