DirectShowを使用してメディアファイルのフレームレートを取得します。私はその後、pPin->ConnectionMediaType(&compressedMediaFormat)
を呼び出し、それから出AvgTimePerFrame
を抽出し、そのピンを列挙、私のグラフにSourceFilter
を追加DirectShowがフレームレートを正しく返しませんFPS
:
現在、私はいくつかのケースでは、不正確なようで、次の方法を使用します。私が理解する限り、フレームあたりの平均時間は100ナノ秒で表されます。だから、私はファイルの平均FPSを得るために10,000,000/AvgTimePerFrameを分けるだけです。
すべてのフレームのフレーム時間がほぼ同じメディアファイルの場合、正しいFPSを取得します。しかし、異なるフレームのフレーム時間が異なる場合、このメソッドは非常に不正確な結果を返します。
正しい方法は、ファイルの継続時間とフレーム数を取得し、その中の平均FPS(frameCount/duration)を計算することです。しかし、正確なフレーム数を計算するためには、ファイル全体を通過する必要があるため、これは高価な操作です。
フレームレート情報をより正確に取得する方法があるのだろうか?
私はこのソリューションに完全に同意しますが、すぐに利用できるメタ情報を抽出する方法があるのだろうかと思います。たとえば、ファイルを右クリックしてプロパティと詳細を選択すると、フレームレートが表示されます。数ギガバイトのサイズのファイルを開くことさえも時間がかからないので、この技術を使っているとは思えません。私は少し正確ではないとしても、詳細のセクションにその値を表示したいと思います。だから、私はDirectShowのメディア財団の 'IMFMediaType - >> GetUINT32(MF_MT_AVG_BITRATE)'の代替案を探しています – mbaros
あなたの質問に記載したmedia typemからの 'AvgTimePerFrame'値です。これは直接的に同等です。ただし、DirectShowパーサーとMedia Foundationパーサーはメタデータを別々に抽出できますが、抽出された値が異なる場合があります。 –
それはまさに私に起こったことです。いくつかのメディアファイルのMedia Foundationの場合は、Properties - > Detailsを右クリックし、8FPSを表示します.AvgTimePerFrameで計算すると24FPSになります。 – mbaros