2017-08-29 13 views
0

私はこれを探していて、見つけられないようです。私はffmpegを使用して、私が引き出しているRTSPストリームを持っています。私の処分するオブジェクトには、AVPacket、AVFrame、AVCodecContext、およびAVFormatContextが含まれます。フレームを撮った絶対時間を取得したいと思います。 (理想的には、ミリセカンド単位の粒度で、完全には必要ではありませんが)。FFmpeg C++フレームが取得された時から秒単位でタイムスタンプを取得する方法

ffmpegライブラリを使用してこれを行う簡単な方法はありますか?私はav_frame_get_best_effort_timestampと同様にcodec_context->time_baseを見ましたが、それはビデオの開始から数秒で答えを出すようですが、ビデオがいつ開始したのか必ずしもわかりません。

+0

で表現されている間start_time_realtimeは、ミリ秒単位で表現されていることを考慮に入れるには、あなたがストリームからタイムスタンプを取得することができますと仮定します。それはローカルコンピュータの時計とは何の関係もないリモートコンピュータ上のクロックに縛られます。なぜ、最初のビデオフレームが受信された時刻を保存し、抽出したav_frame_get_best_effort_timestampごとにオフセットとして使用しないのはなぜですか? –

+0

@Artemy私はビデオが私に与える時間と同期するために私のアプリケーションが必要なので。このストリームをすべて使用する複数のアプリケーションが存在する可能性があり、私のプログラムをそれらのストリームと同期させたいと思います。私が最初のパケットを受け取った時間は、フレームが私のアプリケーションのために撮られた時から30秒遅れ、別のアプリケーションのために10秒遅れることがありました。そして、私のタイミングは20秒遅れです。ストリームからの絶対時間はすべてのアプリケーションからアクセスできますが、 –

答えて

1

int64_t AVFormatContext::start_time_realtimeを使用し、ストリームの先頭からフレーム時間を追加します。

[EDIT]

またAVFrame::best_effort_timestampAVStream->time_base units

+0

best_effort_timestampとtime_baseを使用して取得した時間は、ビデオの開始からですか? また、これはストリーミングのstart_time、またはビデオのstart_timeを教えてくれますか? –

+0

@DerekHaldenはリアルタイムでストリーミングのstart_timeであり、一貫性を持たせるために 'int64_t AVFrame :: best_effort_timestamp'を使用します。 – Rama

+0

これはマイクロ秒単位であり、best_effort_timestampが与える時間は秒単位であることに注意してください。 –

関連する問題