2012-01-26 30 views
6

私はffmpegを使用してCでビデオファイルをデコードしています。私はデコードしている現在のフレームのカウントまたはフレームのタイムスタンプを取得しようとしています。私はfpsとフレームのタイムスタンプに基づいて推定フレーム数を計算する方法を示す数多くの投稿を読んだが、どちらも取得できない。ffmpeg c/C++フレームカウントまたはタイムスタンプとfpsを取得

私が必要なもの:ビデオファイルのfpsで、現在のフレームのタイムスタンプやフレームがない(計算されていない)私が持っているもの

:私は使用してビデオの時間を取得することができる午前

pFormatCtx->duration/AV_TIME_BASE 

私は現在、それらを処理しているフレームを数えていますが、現在のフレームカウントを取得していますが、これは長期間は機能しません。私は

pFormatCtx->streams[currentStream->videoStream]->nb_frames 

を使用してファイルの総フレーム数を取得することができ、私はそれが私が試したすべてのストリームのために働いているが、これは、全てのストリームのために動作しない場合があります読んだことがあります。

私はtime_base.numとtime_base.denの値とpacket.ptsを使用しようとしましたが、私はそれらから得ている値の意味を理解できませんので、それらを理解する必要があるかもしれません値は

この値を取得する方法の例を示すリソースを知っている人はいますか?ここで An ffmpeg and SDL Tutorial by Dranger

あなたがフレームの面で探している正確に何の指針を与えているリンクから、専門家である:PTS値が意味をなすとどのように賢明なものを取得することはないかもしれない、なぜこのURLは説明し

答えて

4

数字とタイムスタンプ。これがあなたにとって有用と思われるなら、あなたは完全に理解するために、文書の多くを読むことをお勧めします:

それでは、私たちは映画を持っていたとしましょう、とフレームが同様に表示されていました。今、IBB P.、我々は必要我々は のいずれかのBフレームを表示する前にPの情報を知ることができます。このため、フレームは次のように格納されます。 I P B B.これは、デコードタイムスタンプとプレゼンテーション タイムスタンプを各フレームに持つ理由です。デコードタイムスタンプは、何かをデコードするために が必要なときに私たちに通知し、 が何かを表示する必要があるときにプレゼンテーションタイムスタンプが通知します。したがって、この場合には、私たちの流れは次のように に見えるかもしれません:

PTS: 1 4 2 3 
DTS: 1 2 3 4 
Stream: I P B B 

をストリームは、我々が 遊んでいるとき、一般的にはPTSとDTSは異なります、その中にBフレームを持っています。

av_read_frame()からパケットを取得すると、 パケットには、 パケット内の情報のPTSおよびDTS値が含まれます。しかし、私たちが本当に望むのは、新しくデコードされた生の フレームのPTSです。したがって、いつ表示するのかはわかります。

幸い、ffmpegのは)あなたが(av_frame_get_best_effort_timestamp、経由して取得することができます 「ベストエフォート」のタイムスタンプ、を私たちに提供し

+0

それがリンク唯一の答えであるため、この答えは、除去のためにフラグが設定されています。読者がリンク先のWebページをクリックすることなく、質問に対する回答を提供できるように、この回答を拡大してください。 – josliber

+0

私はリンク以上のものを提供するためにこの要件を遵守しようとしますが、私は2つのことを指摘しなければなりません:まず、 "この値を得る方法の例を示すリソース"を求めました。より長いものよりむしろalink。 (2)3年前、答えは明らかに答えとして選ばれてから質問者が必要としたものでした(それは唯一の回答だったので、おそらく元の質問者と他の訪問者を3年間助けていたでしょう)。 – Beel

+0

@Beelスタックオーバーフローの[回答方針](https://stackoverflow.com/help/how-to-answer)によれば、ちょうどリンクを提供する回答は完全な回答ではなく、あなたが取り除いた場合書式設定し、テキストだけを残して、彼らはまだ質問に答える必要があります。 –

関連する問題