2016-07-15 50 views
0

作爲DS的新手,我需要一個SampleGrabber來處理VIDEOINFOHEADER2,IMediaDet不能。DirectShow的SampleGrabber檢索錯誤的樣本

因此,我從DX8.1樣品中拿取SampleGrabber,與stock grabber相比,它允許使用各種介質。 我使用的樣例代碼相當原樣,並搶得一個單幀一切似乎很好地工作:根據圖表,而不返回ErrorCode的等內置 然後調用

hr = pSeeking->SetPositions( 
     &Seek, 
     AM_SEEKING_AbsolutePositioning, 
     NULL, 
     AM_SEEKING_NoPositioning); 

與尋求= 2

回調被稱爲:

HRESULT回調(IMediaSample * pSample,REFERENCE_TIME *開始時間,REFERENCE_TIME *停止時間,BOOL TypeChanged)

的問題是與緩衝器: 它具有正確的大小(GetSize()== 691200 = 3 Byte * 640 * 320) 但它的內容全部是「205」,不能是(以哪種格式)。

可疑一下: 的「回調」的參數是開始時間= 834168,停止時間= 1251251和TypeChanged = 1

我試圖表示在GraphEdit中 https://msdn.microsoft.com/en-us/library/windows/desktop/dd390650%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 圖形,但沒有成功(「應用正忙於「從GraphEdit)。

問題在哪裏?

回答

0

找到它(最後)。

在回調函數中,我複製了交付的緩衝區,memcpy以及混淆的源和目標。非常尷尬。

感謝您的幫助。 (在大家閱讀後的幾天內會試圖刪除這個問題,因爲它的使用非常有限)。

+0

我對DirectShow一無所知,除了一些涉及20多年前的事情。我唯一看到的是0xCD的線索。是的,我同意,刪除問題,因爲事實證明它與DirectShow無關。 –

+0

我會的。但是 - 再次指出 - 你的提示確實是一種幫助。謝謝! :-) – nji9

1

在Windows上,內存設置爲各種模式以幫助調試無效的內存引用。 205是十六進制0xCD,這意味着uninitialized heap memory。所以你沒有收到「錯誤」的數據,數據永遠不會被寫入。

您可能無法尋找。您是否嘗試致電IsFormatSupported

+0

是的,周圍的某個地方一定會有問題。 GetTimeFormat返回TIME_FORMAT_MEDIA_TIME。 IsFormatSupported on返回false。 所以我嘗試了SetTimeFormat(TIME_FORMAT_FRAME) - 它返回S_OK, 但IsFormatSupported仍然報錯。 然後嘗試SetTimeFormat(TIME_FORMAT_SAMPLE),它返回E_FAIL。 IsFormatSupported現在報告仍然是錯誤的,但 - 現在坐下 - 如果我之前執行GetTimeFormat(仍然是TIME_FORMAT_FRAME) ,那麼IsFormatSupported會在事後報告爲真。 Boing! 之後的CheckCapabilities(是否取決於設置的TimeFormat?) 說...(續) – nji9

+0

(續)...說AM_SEEKING_CanSeekAbsolute。 我在執行seek(pSeeking-> SetPositions)之前執行此操作。 我懷疑這只是在運行圖表? 好吧,完全困惑... – nji9

+0

在另一個嘗試使用GraphEdit可視化構建的過濾器圖形,我再次包含MSDN的AddRot代碼,並在調試我的應用程序時防止「服務器繁忙」消息,我包括一個無限循環在尋找命令之前,在建立圖形之後圍繞a :: Sleep(100)。 GraphEdit然後迴應並顯示...沒有...空白(紅色)表單。這是什麼意思呢?還沒有建立過濾器圖?但是在Windows的桌面上,LAV編解碼器的圖標出現了。請幫助,我卡住了。 – nji9