我花了将近 4 个小时试图找出解决这个问题的方法。基本上,我正在使用DirectShowNet在 C# 中编写一个应用程序,该应用程序显示来自网络摄像头的视频,允许您拍摄快照并更改网络摄像头的分辨率。我有一个设备管理器,可以检测网络摄像头何时被拔出,然后重新插入。但是,在重新插入设备后,我很难重新创建图表。
我要做的第一件事是创建 FilterGraph 对象并将其转换为 IFilterGraph3。然后,我打这个电话:
graphBuilder.AddSourceFilterForMoniker(deviceMoniker, null, deviceName, out sourceFilter)
此调用在您最初启动应用程序时有效,即使您处理图表并创建一个新的也是如此。但是,唯一不起作用的是在重新插入设备后尝试创建图表时。
在一台机器(Win8 x64)上,我收到此错误:
REGDB_E_CLASSNOTREG - 0x80040154 - Class not registered
在另一台机器(Win7 x64)上,我收到此错误:
REGDB_E_IIDNOTREG - 0x80040155 - Interface not registered
我已经测试了将此代码构建为Any CPU和x86。另外,我在其他机器上测试过,但独立于操作系统,我仍然得到接口未注册错误。我尝试过同时使用Logitech C920和Microsoft LifeCam Studio。两者都会导致相同的错误。我也尝试了替代方法,使用 IMoniker 方法:
deviceMoniker.BindToObject(null, null, ref baseFilterId, out source);
发生同样的错误。我觉得在设备断开连接后可能会有一些东西我没有清理以允许图表正确抓取源(网络摄像头过滤器)。任何想法,将不胜感激。
一般 HRESULT 错误代码可在此处找到:COM 错误代码(通用)