2017-08-17 6 views
2

DirectShowを使用してメディアファイルのフレームレートを取得します。私はその後、pPin->ConnectionMediaType(&compressedMediaFormat)を呼び出し、それから出AvgTimePerFrameを抽出し、そのピンを列挙、私のグラフにSourceFilterを追加DirectShowがフレームレートを正しく返しませんFPS

現在、私はいくつかのケースでは、不正確なようで、次の方法を使用します。私が理解する限り、フレームあたりの平均時間は100ナノ秒で表されます。だから、私はファイルの平均FPSを得るために10,000,000/AvgTimePerFrameを分けるだけです。

すべてのフレームのフレーム時間がほぼ同じメディアファイルの場合、正しいFPSを取得します。しかし、異なるフレームのフレーム時間が異なる場合、このメソッドは非常に不正確な結果を返します。

正しい方法は、ファイルの継続時間とフレーム数を取得し、その中の平均FPS(frameCount/duration)を計算することです。しかし、正確なフレーム数を計算するためには、ファイル全体を通過する必要があるため、これは高価な操作です。

フレームレート情報をより正確に取得する方法があるのだろうか?

答えて

2

メディアファイルは固定フレームレートである必要はありませんが、一般的には可変フレームレートがあります。ファイルのメタデータにはまだフレームレート関連の情報がありますが、この場合は不正確かもしれません。ファイルへのアクセスを開始すると、フレームレートに関するメタデータの情報がすぐに利用できます。確かに、完全な画像を得るためには、すべてのフレームを読み、タイムスタンプを処理することになっています。

実際のデータを読み取ることなくフレームのタイムスタンプだけを素早く読み取ることは技術的に可能ですが、DirectShowデマルチプレクサ/パーサーには情報を取得するためのメソッドが定義されていないため、フレームを読み込んでカウントする必要があります。正確な情報を入手してください。

ビデオを解凍する必要はありません。また、これを行うときにフィルタグラフから時計を削除することもできます。これにより、カウントするフレームにリアルタイムでストリーミングデータを必要としません(フレームは最大レートでストリーミングされます)その場合)。

+0

私はこのソリューションに完全に同意しますが、すぐに利用できるメタ情報を抽出する方法があるのだろうかと思います。たとえば、ファイルを右クリックしてプロパティと詳細を選択すると、フレームレートが表示されます。数ギガバイトのサイズのファイルを開くことさえも時間がかからないので、この技術を使っているとは思えません。私は少し正確ではないとしても、詳細のセクションにその値を表示したいと思います。だから、私はDirectShowのメディア財団の 'IMFMediaType - >> GetUINT32(MF_MT_AVG_BITRATE)'の代替案を探しています – mbaros

+1

あなたの質問に記載したmedia typemからの 'AvgTimePerFrame'値です。これは直接的に同等です。ただし、DirectShowパーサーとMedia Foundationパーサーはメタデータを別々に抽出できますが、抽出された値が異なる場合があります。 –

+0

それはまさに私に起こったことです。いくつかのメディアファイルのMedia Foundationの場合は、Properties - > Detailsを右クリックし、8FPSを表示します.AvgTimePerFrameで計算すると24FPSになります。 – mbaros

関連する問題