使用 MS Media Foundation 从 Windows 应用程序中隐藏相机设备名称?

Posted

技术标签:

【中文标题】使用 MS Media Foundation 从 Windows 应用程序中隐藏相机设备名称?【英文标题】:Hide camera device name from windows applications with MS Media Foundation? 【发布时间】:2021-01-23 00:11:51 【问题描述】:

上下文

我正在尝试构建一个图像过滤器应用程序,该应用程序将获取用户选择的相机帧,在帧上应用一些过滤器,创建一个虚拟相机设备并将帧发送到该虚拟相机。我成功地完成了所有这些,除了我必须隐藏实际的相机设备,因为我的应用程序正在使用它,其他应用程序(假设缩放/meet)应该看到我的虚拟相机而不是实际的相机设备。

在obs-virtual-cam的obs-virtualsource.dll的帮助下,我已经能够创建一个虚拟相机并在那里发送帧。

期望的结果

我需要为 Microsoft 的设备枚举 DLL 创建某种包装器。一旦我的包装器被注册,它将修改系统返回给应用程序的设备列表。这些设置可以保存在注册表中,并在其他进程的上下文中调用。

我想要的答案

我精通 C/C++,但在 COM 和 MS Media Foundation API 方面是新手。因此,即使问题无法在答案中解决,我也欢迎并链接或指导以正确的方向开始解决此特定问题。

【问题讨论】:

如果您不将虚拟相机注册到过滤器映射器(避免调用github.com/CatxFish/obs-virtual-cam/blob/master/src/…),您仍然可以直接实例化您的 COM 对象。事实上,根据您编写应用程序的方式,您甚至可能不需要将 COM 对象注册为 COM 对象,而是在 C/C++ 中实例化它们 我什至没有看到 obs-virtual-cam 暴露于媒体基金会。 Media Foundation 应用程序甚至不应该能够看到虚拟设备,因此首先不存在更改枚举的问题。 恕我直言,一个可能的解决方案可能是将 SetWindowsHookEx 放入每个进程并挂钩 MFEnumDeviceSources API(例如使用 minhook)。这对于 UWP 应用程序可能更难,但并非不可能。 Chrome 和 FireFox 还使用了一些需要处理的沙盒来挂钩 Media Foundation 调用。不过,这需要一些 COM 知识。 obs-virtual-cam 只是为了提供上下文。我认为这与我正在寻找的答案无关。简而言之,我想“对应用程序隐藏相机设备名称”。 【参考方案1】:

Microsoft Media Foundation API 不为您提供隐藏应用程序摄像头的方法。既不适用于使用 Media Foundation 访问摄像头的应用程序,也不适用于不使用 Media Foundation 访问摄像头的应用程序。

【讨论】:

那么如何实现呢?

以上是关于使用 MS Media Foundation 从 Windows 应用程序中隐藏相机设备名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Media Foundation 从 IMFSourceReader 播放音频缓冲区

使用 Media Foundation 将音频从文件播放到扬声器

如何使用 Media Foundation 从 MP4 视频中丢弃任意帧?

使用 Media Foundation .NET 从 MP4 获取帧速率

从图像创建 MPEG4 视频时的解决问题 (Windows Media Foundation)

使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)