我總是讓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;
}
...
}
如果您想盡可能快地處理樣本,您可以在回調中將樣本時間戳設置爲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);
我目前沒有任何回調函數設置,因爲我目前只是從樣本抓取器中抓取數據,只要它準備好並從那裏處理它。我在網上看了一下,看到有關如何使用IMediaSample類的資源非常有限。我試圖用返回的「E_NOINTERFACE」句柄來查詢Graph的界面。 – Seb
在我的DirectShow體驗中,執行此操作的「正確」方式是通過樣本採集器回調:通過收到每個通過圖表的樣本的通知,您可以完全控制每個樣本要做什麼。至於IMediaSample接口,沒有多少內容,您只需獲取媒體採樣緩衝區,如上面的代碼部分所示,以便您可以處理/保存它。您無法查詢IMediaSample接口的圖形。 IMediaSample是媒體樣本的容器,並通過DS圖形(即從過濾器過濾到過濾器)。 – Ralf
重構我的代碼以從Samplegrabber進行回調後,一切都完美無缺。我能夠刪除任何睡眠呼叫,並獲得巨大的性能提升,沒有重複的圖像。感謝您的幫助。 – Seb