2011-02-17 21 views
1

我正在繼續研究DirectShow應用程序,並且只是對其進行最後的修改。程序正在做的是以1秒爲間隔瀏覽一個視頻文件,並從樣本採集器中捕獲當前緩衝區並在繼續前處理它。但是,我注意到我在測試中獲取了重複圖像,因此我發現DirectShow在該1秒間隔內的視頻速度不夠快。我的問題是,如果有方法可以檢查DirectShow何時準備好調用samplegrabber來獲取當前幀並對其進行處理。目前我打電話睡1秒,但必須有更好的方法。預先感謝您的幫助。查找Samplegrabber在DirectShow中的準備時間

編輯

我只是想運行一個檢查,以查看該視頻的位置等於說我想抓住並處理下一個位置。這減少了重複幀的數量,但我仍然看到它們以塊形式出現。

回答

0

我總是讓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); 
+0

我目前沒有任何回調函數設置,因爲我目前只是從樣本抓取器中抓取數據,只要它準備好並從那裏處理它。我在網上看了一下,看到有關如何使用IMediaSample類的資源非常有限。我試圖用返回的「E_NOINTERFACE」句柄來查詢Graph的界面。 – Seb

+0

在我的DirectShow體驗中,執行此操作的「正確」方式是通過樣本採集器回調:通過收到每個通過圖表的樣本的通知,您可以完全控制每個樣本要做什麼。至於IMediaSample接口,沒有多少內容,您只需獲取媒體採樣緩衝區,如上面的代碼部分所示,以便您可以處理/保存它。您無法查詢IMediaSample接口的圖形。 IMediaSample是媒體樣本的容器,並通過DS圖形(即從過濾器過濾到過濾器)。 – Ralf

+0

重構我的代碼以從Samplegrabber進行回調後,一切都完美無缺。我能夠刪除任何睡眠呼叫,並獲得巨大的性能提升,沒有重複的圖像。感謝您的幫助。 – Seb

0

嘗試將您的圖形計時器設置爲NULL。這將允許:

  • 過程中的文件儘可能快地
  • 會減輕你的,你有問題。

當然,如果您要同時將文件渲染到屏幕上,它將不起作用。

+0

我在各地搜索了,但我找不到任何圖形計時器。你可以請進一步的細節? – Seb

+0

要設置圖形時鐘,請查看http://msdn.microsoft。COM/EN-US /庫/ dd377588(V = vs.85)的.aspx。如我所解釋的,它基本上具有與將媒體採樣時間戳設置爲NULL相同的效果。但是,我不確定這種方法是否可行:如果沒有在樣本採集器上配置回調並且圖表儘可能快地運行,您將如何在適當的時間間隔內檢索樣本? – Ralf

+0

在示例回調中,每個樣本都有一個對應於媒體時間的時間戳。檢查http://msdn.microsoft.com/en-us/library/dd376985(v=vs.85).aspx - ISampleGrabberCB方法,它們都具有第一個參數作爲SampleTime –