2017-08-29 3 views
0

J'ai regardé autour pour cela, et je n'arrive pas à le trouver. J'ai un flux RTSP que je tire de l'utilisation de ffmpeg. Les objets à ma disposition incluent un AVPacket, un AVFrame, un AVCodecContext et un AVFormatContext. Je voudrais avoir l'heure absolue à laquelle un cadre a été pris. (idéalement avec une granularité aussi petite que quelques millisecondes, bien que ce ne soit pas complètement nécessaire).FFmpeg C++ comment obtenir l'horodatage, en secondes depuis l'époque où une image a été prise à

Y at-il un moyen facile de le faire en utilisant les bibliothèques ffmpeg? J'ai regardé av_frame_get_best_effort_timestamp ainsi que codec_context->time_base, mais cela semble donner les réponses en quelques secondes depuis le début de la vidéo, et je ne sais pas nécessairement quand la vidéo a commencé.

+0

Supposons que vous serez en mesure d'obtenir l'horodatage du flux. Il serait lié à l'horloge de l'ordinateur distant - qui n'a rien à voir avec l'horloge locale. Alors pourquoi ne pas stocker l'heure à laquelle la première trame vidéo a été reçue et l'utiliser comme offset pour chaque av_frame_get_best_effort_timestamp que vous avez extraite? –

+0

@Artemy Parce que j'ai besoin de synchroniser mon application avec le temps que la vidéo me donne. Il pourrait y avoir plusieurs applications qui utilisent toutes ce flux, et j'aimerais que mon programme soit synchronisé avec celles-ci. L'heure à laquelle j'ai reçu le premier paquet peut être retardée de 30 secondes à partir du moment où la trame a été prise pour mon application, et 10 secondes de retard pour une autre application. Et puis mon timing est de 20 secondes. Alors que le temps absolu à partir du flux est accessible à toutes les applications –

Répondre

1

Utilisez int64_t AVFormatContext::start_time_realtime, puis ajoutez le temps d'affichage depuis le début du flux.

[EDIT]

prennent également en compte le fait que start_time_realtime est exprimé en millisecondes, alors que AVFrame::best_effort_timestamp est exprimé dans AVStream->time_base units

+0

Est-ce que le temps écoulé depuis le début de la vidéo est le temps que j'obtiens en utilisant best_effort_timestamp et time_base? Aussi, cela me donne-t-il l'heure de début du streaming, ou le start_time de la vidéo? –

+0

@DerekHalden est l'heure de début du streaming en temps réel, utilisez 'int64_t AVFrame :: best_effort_timestamp' pour être cohérent. – Rama

+0

À noter que le temps que cela donne est en microsecondes, et le temps que donne best_effort_timestamp est en secondes. –