Я всегда позволяю платформе 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;
}
...
}
P.S. Если вы хотите обработать выборки как можно быстрее, вы можете установить временную метку выборки в значение 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);