0

以前の質問に対する Roman R の回答のおかげで、サードパーティのデコーダー ライブラリをラップする非同期フィルターができました。

エンコードされた入力サンプルは、ネットワーク ソースからのものです。現時点では、デコードされたフレームにタイムスタンプを追加していないため、データ パケットが受信される時間に依存するため、フレームレートはかなりぎくしゃくしています。

ライブラリが完全なフレームをデコードすると、ソース エンコーダのクロックに従ってフレームがキャプチャされた時刻の UTC タイムスタンプも提供されます。

問題は、これをストリーム時間に関連付けて、SetTime 関数の適切な値を作成するにはどうすればよいかということです。私はそれをいじってみましたが、入力した値が何であれ、CBaseOutputPin::Deliver 関数でフィルター グラフをロックしているように見えます。

4

1 に答える 1

0

最も簡単なタイムスタンプは次のとおりです。最初のメディアサンプルにゼロをタイムスタンプし(次の段落の調整ノートを参照)、次のサンプルにはそれとの差がスタンプされます。つまり、ストリーミングを開始し、ネットワークソースから最初のサンプルを取得します。この時間を覚えUTC0て、DirectShowメディアサンプルにゼロを付加します。フレーム1、2 ... Nに続いてUTC時間UTC1...UTCNで、DirectShow時間に変換されますUTCN- UTC0。DirectShowには100nsの単位が必要であり、ネットワークソースから1/90000 sのようなものが提供される可能性があるため、適切な単位への追加の変換が必要になる場合があります。

IReferenceClock::GetTimeソースはおそらくライブソースであり、最初のフレームはグラフの実行時に正確に取得されない可能性があるため、現在のフィルターグラフと呼び出しの引数として受け取った時間の差を使用して、結果のメディアサンプルのタイムスタンプを調整している可能性がありIBaseFilter::Runます。

于 2011-10-25T19:41:09.113 に答える