gpt4 book ai didi

c# - c#紧凑框架中的Directshow : trigger handling problems for a Filtergraph's IMediaEvent

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:23 26 4
gpt4 key购买 nike

我正致力于在 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

我遇到了 2 个相关问题:

  1. 当我的 dshow 事件处理程序循环使用超时 0 通过 IMediaEvent.GetEvent() 拉取事件时,我在第三次迭代中得到了“超时超出”hresult (-2147467260)。第三个事件触发器(和后续错误)不会在 C++ 示例中发生。
  2. 如果我忽略上面提到的超时情况,它将不断触发 73 事件。这会杀死处理器,因为循环基本上从不暂停。

当 C++ 示例在预览模式下运行其图形时,它会获得两个 IMediaEvent:第一个 13,然后 73。之后,它停止触发,直到开始实际捕获。我的 C# 版本拉取 13,然后拉取 73,然后再次拉取 73,但出现超时错误。

简而言之,DshowRequestMan 的第三次触发似乎不应该发生,因为没有实际“获取”的 dshowevent,因此超时。

不确定我做错了什么 - 我在每次迭代中都调用“FreeEventParams()”...我怀疑 ManualResetEvent 对象使用不当,因为我只是为它的 handle 属性分配了一些东西,但是当我使用 Pinvoked“WaitForSingleObject”来收听 DshowEventHandle 时,同样的事情发生了......我在这一点上感到困惑。

任何想法将不胜感激。提前致谢!

最佳答案

这是我的过滤器图事件处理代码:

while (!_stopReceivingEvents) {
IntPtr eventHandle;
var hr = _mediaEvent.GetEventHandle(out eventHandle);
DsError.ThrowExceptionForHR(hr);

//NOTE: Do not close the event handle, because it is used internally by the filter graph
using (var safeWaitHandle = new SafeWaitHandle(eventHandle, false)) {
using (var waitHandle = new AutoResetEvent(false) {SafeWaitHandle = safeWaitHandle}) {
if (WaitHandle.WaitAll(new[] {waitHandle}, 500)) {
//receive all available events
do {
EventCode eventCode;
IntPtr param1;
IntPtr param2;
hr = _mediaEvent.GetEvent(out eventCode, out param1, out param2, 500);
_mediaEvent.FreeEventParams(eventCode, param1, param2);

if (hr == 0) {
switch (eventCode) {
//add handling code here
}
}
} while (hr == 0);
}
}
}
}

关于c# - c#紧凑框架中的Directshow : trigger handling problems for a Filtergraph's IMediaEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1066593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com