DirectShow的SampleGrabber检索错误的样本

时间:2016-07-15 21:25:52

标签: c++ c windows directshow

作为DS的新手,我需要一个可以处理VIDEOINFOHEADER2的SampleGrabber,IMediaDet不能这样做。

所以我从DX8.1样本中取出SampleGrabber,与股票抓取器相比,它允许所有类型的媒体。 我完全按原样使用了示例代码,抓住一个单独的框架似乎一切正常:图形构建时没有返回错误代码等。 然后打电话给

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

with Seek = 2

调用回调:

HRESULT回调(IMediaSample * pSample,REFERENCE_TIME * StartTime,REFERENCE_TIME * StopTime,BOOL TypeChanged)

问题在于缓冲区: 它的大小合适(GetSize()== 691200 = 3 Byte * 640 * 320) 但它的内容全是" 205",不能(以哪种格式)。

可疑: " Callback"的参数是StartTime = 834168,StopTime = 1251251和TypeChanged = 1.

我尝试在GraphEdit上显示Graph https://msdn.microsoft.com/en-us/library/windows/desktop/dd390650%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 但是没有成功("应用程序很忙"来自GraphEdit)。

问题可能在哪里?

2 个答案:

答案 0 :(得分:1)

在Windows上,内存设置为各种模式以帮助调试无效的内存引用。 205是十六进制的0xCD,这意味着uninitialized heap memory。因此,您没有收到“错误”数据,数据永远不会被写入。

您可能无法寻求。您是否尝试过调用IsFormatSupported

答案 1 :(得分:0)

找到它(最后)。

在回调中,我使用memcpy复制了传递的缓冲区,并混淆了源和目标。非常尴尬。

感谢您的帮助。 (在每个人都阅读之后的几天内会尝试删除这个问题,因为它的使用非常有限)。