gpt4 book ai didi

c# - DirectShow ISampleGrabber.SetCallback 在显示 C# MessageBox 后抛出 InvalidCastException

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

我正在使用 DirectShow 的 SampleGrabber 从网络摄像头视频中捕捉图像。代码用 C# 编写,并使用 DirectShow 接口(interface)的 .NET 包装器进行 COM 通信。下面的BufferCB,首先将图片数据复制到本地数组变量,关闭SampleGrabber回调,处理接收到的图片数据,并使用MessageBox显示结果。

public int BufferCB(double sampleTime, IntPtr pBuffer, int bufferLen)
{
if (Monitor.TryEnter(lockSync))
{
try
{
if ((pBuffer != IntPtr.Zero))
{
this.ImageData = new byte[bufferLen];
Marshal.Copy(pBuffer, this.ImageData, 0, bufferLen);

// Disable callback
sampleGrabber.SetCallback(null, 1);

// Process image data
var result = this.Decode(new Bitmap(this.ImageData));

if (result != null)
{
MessageBox.Show(result.ToString());
}

// Enable callback
sampleGrabber.SetCallback(this,1);
}
}
finally
{
Monitor.Exit(this.parent.lockSync);
}
}
return 0;
}

现在,如果 result = null,因此 MessageBox.Show 永远不会运行,则两个钳位调用 sampleGrabber.SetCallback() 将毫无问题地运行。一旦 result != null 和 MessageBox 出现,调用 sampleGrabber.SetCallback(this,1) 将抛出 InvalidCastException,如下所示:

无法将“System.__ComObject”类型的 COM 对象转换为“DirectShowInterfaces.ISampleGrabber”接口(interface)类型。此操作失败,因为 IID 为“{6B652FFF-11FE-4FCE-92AD-0266B5D7C78F}”的接口(interface)的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(interface)(HRESULT 异常:0x80004002 (E_NOINTERFACE)) .

如果我在 VS 调试器中停止并添加 ((ISampleGrabber)sampleGrabber).SetCallback(sampleGrabber, 1) 的监视,我将收到带有“找不到方法”消息的 ArgumentException在对象实例上。”相反。

有遇到同样问题的 friend 可以给我一些建议。谢谢。

最佳答案

BufferCBSampleCB 调用发生在通常属于 MTA 的工作线程上。另一方面,您的图形初始化通常发生在 STA 线程上。 DirectShow API 和过滤器主动忽略 COM 线程规则,而 .NET 强制执行线程检查并在尝试在错误线程上使用 COM 接口(interface)指针时引发异常。您正好遇到了这个问题。

您不需要重置回调然后将其设置回去。请改用 SampleCB 回调,它会作为阻塞调用发生。在您完成处理之前,其余的流媒体将暂停。

关于c# - DirectShow ISampleGrabber.SetCallback 在显示 C# MessageBox 后抛出 InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392447/

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