私は常に DS フレームワークに処理レートを処理させます: メイン アプリケーション スレッドで、サンプル グラバー コールバックを構成し、コールバックがトリガーされると、メディア サンプルとサンプル時間を取得します: この時点で、次の場合にサンプルを処理できます。適切な間隔、つまり 1 秒が経過しました。
ちょっとスリープを呼び出すとはどういう意味ですか? どこから (どのスレッドから) 呼び出しますか? コールバック内からこれを行っている場合、DirectShow パイプラインを効果的にブロックしていますか? 設定をもっと詳しく説明していただけると、もっと助かるかもしれません。
/// Callback that is triggered per media sample
/// Note this all happens in the DirectShow streaming thread!
STDMETHODIMP SampleCB( double dSampleTime, IMediaSample * pSample )
{
// check timestamp and if one second has elapsed process sample accordingly
// else do nothing
...
// Get byte pointer
BYTE* pbData(NULL);
HRESULT hr = pSample->GetPointer(&pbData);
if (FAILED(hr))
{
return hr;
}
...
}
PS サンプルをできるだけ速く処理したい場合は、コールバックでサンプルのタイムスタンプを NULL に設定できます。
// set time to NULL to allow for fast rendering since the
// the video renderer controls the rendering rate according
// to the timestamps
pSample->SetTime(NULL, NULL);