DirectShow 的 SampleGrabber 检索错误样本

DirectShow's SampleGrabber retrieves erroneous sample

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

所以我从 DX8.1 样本中获取了 SampleGrabber,与股票采集器相比,它允许所有类型的媒体。 我按原样使用示例代码,抓取一个单帧似乎一切正常:构建图形时没有返回错误代码等。 然后调用

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

搜索 = 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 中显示图表 https://msdn.microsoft.com/en-us/library/windows/desktop/dd390650%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 但没有成功("application is busy" 来自 GraphEdit)。

问题可能出在哪里?

在 Windows 上,内存被设置为各种模式以帮助调试无效的内存引用。 205 是十六进制的 0xCD,这意味着 uninitialized heap memory。所以你没有得到 "erroneous" 数据,数据永远不会被写入。

你可能找不到。你试过打电话给 IsFormatSupported

终于找到了。

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

感谢您的帮助。 (过几天会尽量在大家看完后删掉这个问题,用处非常有限)