c++ - DirectShow - 如何确定流是否有效(C++)

标签 c++ directshow

我的任务是修复医疗应用程序中的一个错误,该应用程序可以从口腔内摄像机捕获快照。它使用 DirectShow SampleGrabber 来完成此任务。我必须声明,我没有使用过 DirectShow,因此我正在努力加快步伐。我基本上了解各个组件如何协同工作。

无论如何,这个错误本身似乎微不足道,但我无法找到解决方法。由于该系统的模块化性质,预览窗口是独立图表的一部分,而不是 SampleGrabber 创建的图表(这是一个很长的故事,但这是由于支持以前设备的遗留代码)。当相机处于事件状态时,我们可以拍摄快照,一切都很愉快。当相机关闭时,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/

相关文章:

c# - 如何使用 DirectShow 过滤器将图像序列转换为视频?

c++ - Sample Grabber 返回的 IMediaSample 具有意外的缓冲区大小

c++ - CPP :How to get the REAL element in a vector?

windows - 模拟网络摄像头流

c++ - 为什么 cout.tellp 总是返回 -1?

c++ - 遍历整个图的最小节点数

c++ - 捕获 NTSC 模拟板时 DirectShow 像素乱序

video - DirectShow 中的负演示时间

c++ - PyTorch for C++ 中的按行元素索引

c++ - 搜索位域模板(密码本)