2

SampleGrabber フィルターが何らかの処理を行っている DirectShow グラフがあります。処理には最大 50 ミリ秒かかるため、多くの場合、再生速度が遅くなります。加工のON/OFFが可能です。

私の問題は、処理がしばらくオンになっている場合、オフにすると、ビデオが特定のポイントに達するまでできるだけ速く再生されることです。おそらく、この時点でフレーム時間がストリーム時間と一致し、ラグがなくなります。

処理をオフにすると再生が通常の速度になるように、これを防ぐにはどうすればよいですか? データの処理中にストリーム クロックをオフにすることはできますか? それとも、SampleGrabber フィルターから出てくるサンプルに再びタイムスタンプを付けて、余分なラグを追加するのでしょうか?

これを行う適切な方法を知っている人はいますか?

編集:

以下の回答に示すように、サンプル時間を変更する方法を使用しましたが、サンプルのタイムスタンプのシークと計算に問題がありました。

独自の基準クロックを実装し、処理に時間がかかりすぎる場合はクロックを停止する方がよい方法を見つけました。

4

1 に答える 1

0

ISampleGrabberCB::SampleCBを使用し、ISampleGrabberCB::BufferCallbackを使用していない限り、 IMediaSample :: SetTimeを使用して、 IMediaSample プレゼンテーションのタイムスタンプを任意の値に簡単に更新できます。実際のサンプルへのポインターを提供するため、SampleCB を使用する必要がありますが、BufferCB はサンプルを取得する前にコピーします。これは、コピーを更新するだけであることを意味します。

クロックをオフにしても、グラフができるだけ速く実行されるだけなので、おそらく役に立ちません。IMediaSeeking::SetRateを使用して再生速度を変更してみることができますが、多くのフィルターは速度の変更をサポートしていないことに注意してください。正確な要件に応じて変化するカスタム クロックを実装することもできます。

于 2009-01-15T09:47:45.873 に答える