2016-07-15 24 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