在 C# 中获取网络摄像头的当前状态

Posted

技术标签:

【中文标题】在 C# 中获取网络摄像头的当前状态【英文标题】:Get current state of webcam in C# 【发布时间】:2020-12-18 08:25:03 【问题描述】:

我正在尝试弄清楚如何检查网络摄像头/视频捕获设备是否已被另一个应用程序使用而没有实际激活它。

我目前的方法是使用 AForge.NET 库并使用 VideoCaptureDevice 对象的 .IsRunning 属性,如下所示:

 var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                
 foreach (FilterInfo videoDevice in videoDevices)
 
    VideoCaptureDevice camera new AForge.Video.DirectShow.VideoCaptureDevice(videoDevice.MonikerString);
    Debug.Print(camera.IsRunning)
 

我猜 IsRunning 属性仅适用于已使用库启动的 VideoCaptureDevices,我需要对设备进行较低级别的 DirectShow 访问。

虽然在 C# 中使用 DirectShow 有很多方法,但即使在 C++ 中使用 DirectShow,我也无法找到检查状态的方法。我需要在这里施展什么魔法吗?

谢谢

托拜厄斯·蒂佩

【问题讨论】:

我想你可以注册一个CameraCaptureStateChanged 活动。 听起来很有趣,我去看看,谢谢! IInspectable提供的方法对你有用吗? 不是真的,它只支持 UWP 应用程序,而我的应用程序应该使用 NotifyIcon 在后台运行。 你验证了吗?该文档经常过时,并且经常没有将DualApiPartitionAttribute 命名为 可用于经典桌面应用程序的类型。实际上,仅 UWP 的 WinRT 类型的数量接近于零。 【参考方案1】:

我不完全确定这是否会对您有所帮助,但我发现了您的问题,因为我想编写一个自定义应用程序来控制我的忙碌灯。这是非常“在我的机器上工作”认证的 - 这不是试图给出一般性答案。但是,我认为它可能会对您有所帮助,并且可能是下一个在谷歌搜索时遇到此页面的人......

private static bool IsWebCamInUse()

    using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\webcam\NonPackaged"))
    
        foreach (var subKeyName in key.GetSubKeyNames())
        
            using (var subKey = key.OpenSubKey(subKeyName))
            
                if (subKey.GetValueNames().Contains("LastUsedTimeStop"))
                
                    var endTime = subKey.GetValue("LastUsedTimeStop") is long ? (long) subKey.GetValue("LastUsedTimeStop") : -1;
                    if (endTime <= 0)
                    
                        return true;
                    
                
            
        
    

    return false;

【讨论】:

这正是我想要的!我正在将 Adafruit TrinketM0 设置为自定义忙灯,我想检查网络摄像头是否处于活动状态,然后将其设置为忙。我确实必须将目标平台设置为 64 位,因为密钥为空。 Properties &gt; Build &gt; Platform Target = x64 我还必须使用 LocalMachine Registry.LocalMachine.OpenSubKey... 我刚刚将 Windows 10 从 1909 年更新到 2004 年,我的进程停止工作。谷歌搜索后,我再次遇到了这个答案和我自己的评论!当我看到我之前所做的事情时,我想如果我将注册表项改回Registry.CurrentUser.OpenSubKey...,它会再次起作用吗?是的,它确实!这就是为什么我第一次尝试它时它不起作用的原因。我使用的 Windows 10 版本比 @Matt Whitfield 使用的更旧。现在一切都很好,我的自产忙碌灯又开始工作了。 在将进程作为服务运行时,我确实遇到了key 为空的问题。我通过自己运行服务来解决这个问题,但这只是一种解决方法。我假设在将服务作为 LocalSystem 运行时,它无权访问CurrentUser,这就是它为空的原因。 @FarFigNewton - 是的,当您作为 LocalSystem 运行时,CurrentUser 不是一回事?

以上是关于在 C# 中获取网络摄像头的当前状态的主要内容,如果未能解决你的问题,请参考以下文章

使用 openCV 和 wxPython 从网络摄像头获取流

如何使用 C# 流式传输网络摄像头视频? [关闭]

将处理后的视频从 C# 程序发送到 C++ 程序

C# 9/10 .net 6 中基于网络摄像头的对象扫描器 [关闭]

SharpPcap 可以用来在 C# 中找到我的网络中的 ip 摄像机吗

C#,Emgu 网络摄像头 - 选择捕获大小