DirectShow的SampleGrabber检索错误的样本

DirectShow's SampleGrabber retrieves erroneous sample

本文关键字:样本 错误 SampleGrabber DirectShow 检索      更新时间:2023-10-16

作为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 字节 * 640 * 320)但它的内容都是"205",不可能(以哪种格式)。

对此持怀疑态度:"回调"的参数是 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但没有成功(来自GraphEdit的"应用程序很忙")。

问题可能出在哪里?

在 Windows 上,内存设置为各种模式,以帮助调试无效的内存引用。 205 以十六进制0xCD,这意味着未初始化的堆内存。所以你不会得到"错误"的数据,数据永远不会被写入。

你可能无法寻求。你有没有试过打电话给IsFormatSupported

终于找到了。

在回调中,我复制了交付的缓冲区,带有memcpy,并混淆了源和目标。很尴尬。

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