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 复制了传送的缓冲区,并混淆了源和目标。好尴尬。
感谢您的帮助。 (过几天会尽量在大家看完后删掉这个问题,用处非常有限)
作为 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 复制了传送的缓冲区,并混淆了源和目标。好尴尬。
感谢您的帮助。 (过几天会尽量在大家看完后删掉这个问题,用处非常有限)