我正在努力在 C# dll 中实现 directshow 功能。我的工作基于 Microsoft 随 Windows Mobile 6 sdk 提供的基于 C++ 的“CameraCapture”示例。事情进展顺利(多亏了这个网站上的早期帮助),但我在尝试在 C# 领域监听 directshow 事件时遇到了一些障碍:
我有一个循环来监听 dshow 事件的线程。它基于在此处定义的手动重置事件等待(这是在图初始化结束时定义的:构建图,调用渲染流,并且控制流已经阻塞数据流):
DshowRequestMan = new ManualResetEvent(false);
MediaEvent = (IMediaEvent)FilterGraph;
chk(MediaEvent.GetEventHandle(out DshowEventHandle));
DshowRequestMan.Handle = DshowEventHandle; //note: no "SafeHandle" in cf
我遇到了两个相关的问题:
- 当我的 dshow 事件处理程序循环使用超时时间 0 通过IMediaEvent.GetEvent()拉事件时,我在第三次迭代中得到“超时超时”hresult (-2147467260)。在 C++ 示例中不会发生第三个事件触发器(以及后续错误)。
- 如果我忽略上面提到的超时情况,它将不断触发 73 事件。这会杀死处理器,因为循环基本上从不暂停。
当 C++ 示例在预览模式下运行它的图形时,它会获得两个 IMediaEvent:第一个是 13,然后是 73。之后,它会停止触发,直到开始实际捕获。我的 C# 版本拉 13,然后是 73,然后又是 73,但出现超时错误。
简而言之,似乎不应该发生 DshowRequestMan 的第三次触发,因为没有实际“获取”的 dshowevent,因此超时。
不知道我做错了什么 - 我在每次迭代时都调用“FreeEventParams()”......我怀疑 ManualResetEvent 对象的使用不正确,因为我只是为其句柄属性分配了一些东西,但同样当我使用 Pinvoked "WaitForSingleObject" 来收听 DshowEventHandle 时,事情就会发生......我现在很困惑。
任何想法将不胜感激。提前致谢!