我的任务是修复医疗应用程序中的一个错误,该错误除其他外,可以从口内摄像机捕获快照。它使用DirectShow SampleGrabber来完成此任务。我必须声明我没有与DirectShow合作过,因此我在努力提高自己的速度。我基本上了解各种组件如何协同工作。
无论如何,该错误本身看似微不足道,但我无法解决。由于该系统的模块化性质,预览窗口是一个单独的图形的一部分,而不是SampleGrabber创建的图形(这是一个很长的故事,但这是由于支持先前设备的旧代码所致)。当相机处于 Activity 状态时,我们可以拍摄快照,一切都很好。关闭相机电源后,SampleGrabber会显示暗框,但释放在预览模块中创建的IAMStreamConfig接口(interface)时,DirectShow会崩溃(访问冲突)。由于某种原因,SampleGrabber图似乎以某种方式破坏了预览模块中内置的图。由于此应用程序的性质,我无法在此处显示任何源,但是本质上这是我想要完成的工作:
我需要能够检测相机是否确实在打开。我遇到的问题是,当插入相机(USB)时,它看起来像是在打开系统并返回视频流,只是该流不包含实际数据。当我使用GetState方法检查捕获过滤器的状态时,它声称它正在运行。另外,当我检查视频格式属性时,它会返回正确的属性。在我看来,相机上的按钮只是打开/关闭相机传感器本身,但是当相机关闭时,设备仍在返回空白流。不过必须有所不同,因为它不会因传感器实际打开并返回实况视频而崩溃。
有人知道我如何确定视频流是空白还是直播视频? IE,我可以调用任何公开的接口(interface)或方法来确定这一点吗?我已经仔细阅读了MSDN的DirectShow文档中的所有各种接口(interface),但是还没有找到实现此目的的方法。
最佳答案
如果您不希望调用示例采集器的回调函数,则可以考虑在示例采集器和源过滤器之间(或紧接在源过滤器之后)添加一个特殊的transform filter,以及此转换过滤器要检查的内容输入样本是否已损坏并阻止那些损坏的样本。这基本上需要您实现自己的Transform()
函数:
HRESULT CRleFilter::Transform(IMediaSample *pSource, IMediaSample *pDest)
关于c++ - DirectShow-如何确定流是否有效(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17049864/