在 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 > Build > 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# 9/10 .net 6 中基于网络摄像头的对象扫描器 [关闭]