使用 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 获取帧速率