c++ - Windows 10 Camera frame server,使用网络摄像头识别实际应用
问题描述
在 Windows 10 上,需要访问网络摄像头的应用程序与之通信的frame server
是在svchost
.
我过滤掉网络摄像头流,我得到的进程 ID 是svchost
. 我想确定使用网络摄像头的实际过程。
是否有明确的方法以编程方式识别正在使用网络摄像头的实际应用程序是什么?我已经研究过枚举进程的句柄(也必须处理NtQueryObject()
挂起),但我正在寻找一个更好的明确解决方案。
解决方案
我怀疑您是否可以识别使用帧服务器捕获视频的应用程序(实际上,这同样适用于那些在当前或旧版本的 Windows 中不使用帧服务器的应用程序)。
Microsoft 添加了帧服务器以在视频捕获应用程序和实现此类捕获的实际驱动程序之间插入代理。尽管声明的意图是在应用程序之间共享摄像机设备,但我不认为它是可操作的,并且帧服务器几乎没有记录。我个人的理解是,微软需要以方便的方式加入,以便为他们的 Windows Hello 技术启用对摄像机的访问权限,因此他们开启了媒体管道。没有采取进一步措施为用户应用程序提供任何新选项。
尝试共享网络摄像头的简约桌面视频捕获应用程序仍然收到失败,表明无法共享通用应用程序(我猜微软之类的 Hello 可能在帧服务器中有一个未记录的后门用于摄像头共享目的,或者启用共享特定类别的客户端,例如使用 Capture Engine API 等):
也就是说,没有 API 来枚举帧服务器客户端,并且整个应用程序甚至不知道它们是在与真正的驱动程序还是帧服务器代理通信。
我认为间接获取相关信息的尝试,例如通过检查哪些应用程序使用视频相关模块,是不可靠的,并且在多个视频捕获设备(包括虚拟设备)的情况下更加混乱。
推荐阅读
- excel - 如何使用 If 函数向上或向下舍入
- google-app-engine - 将应用部署到谷歌应用引擎后无法加载应用
- docker - GitLab CI Cypress E2E 挂在“验证赛普拉斯”上
- kotlin - 过滤 Kotlin 对集合,使对内容不为空
- .net - 在 Azure 存储中使用队列
- ubuntu - 如何远程访问在我的机器上运行的服务器?
- javascript - 如何使用已在 if 语句中声明的变量在 else 语句中使用它
- php - 使用基于特定属性的值创建 WooCommerce 订单自定义字段
- kubernetes - Kubernetes 后端 Pod 端点为空白
- c# - 删除 HTTP 服务器和 X-Powered-By 标头