0

特定の生ファイルを読み取るための directshow ソース フィルターを作成しています。生ファイルには、各フレームにタイムスタンプ (utc 時間) が含まれています。

私のフィルターは、Microsoft SDK の「Push Source Filters Sample」から変更されているため、最も重要なことは、GetMediaType()、DecideBufferSize()、および FillBuffer() を上書きすることです。

私の質問は、FillBuffer(IMediaSample *pSample) にあります。この関数で pSample->SetTime() を正しく呼び出す方法がわかりません。タイムスタンプが大きな数字から始まるため、フレームは StreamTime がタイムスタンプに達するまで待機します。

この問題は、各フレームのオフセットを減算することで解決できますが、下流のフィルター (SampleGrabber) で元のタイムスタンプが必要です。

より良い解決策はありますか?

4

1 に答える 1

0

メディアサンプルには絶対的なタイムスタンプはありません。最初のメディアサンプルがゼロになり、次のサンプルが正しく設定されるように、ストリーミングされるセグメント内のすべてのサンプルから先行メディアサンプル時間を差し引く必要があります。

サンプルのグラバーコールバックでベースタイムスタンプ(減算している)を使用できるようにできる場合は、そこに追加して、正しい絶対時間を復元できます。

MSDN:DirectShowのタイムスタンプ

于 2013-02-27T08:16:34.617 に答える