编写音频源过滤器用作 Lync 麦克风

Write an audio source filter for use as Lync microphone

我正在尝试编写可被 Microsoft Lync 客户端识别为 Microphone 源的 DirectShow 音频捕获过滤器。这些是我已经采取的步骤:

  1. 过滤器派生自CSource;它的输出引脚派生自 CSourceStream 并实现 IKsPropertySetIAMStreamConfig 以及所有必要的方法(包括 IUnknown 方法)

  2. 确保 AM_MEDIA_TYPE 及其 WAVEFORMATEX header 的适当元数据设置在 GetStreamCaps()GetMediaType()

  3. fillBuffer()中,每个媒体样本都填充了一个正弦波测试序列

  4. 为 COM 服务器创建 class 工厂并在 .def 文件中导出 DLL 函数,在 CLSID_AudioInputDeviceCategory.

    下注册过滤器

使用 regsvr32 注册我的过滤器后,目前在 GraphEdit 中一切正常:过滤器显示在 Audio Capture Devices 下,音调播放正确。


但是,我在 "real" 程序中得到不同的结果。例如,在 Picasa 的网络摄像头测试器中,过滤器显示为音频源,但切换到它会使程序崩溃。

在所有版本的 Lync 客户端中,过滤器根本不显示为 Audio Device -> Microphone 下的 Microphone 选择。我在 Lync documentation 中读到,只返回带有物理扬声器和麦克风的虚拟音频设备。

又看了一圈,好像Virtual Audio Cable达到了被系统识别的效果,如下图:


我需要编写自己的解决方案的灵活性 code-wise,它具有不需要购买许可证的额外好处。

我是否需要切换到 Windows Media Foundation、在我的过滤器中支持额外的接口、将源过滤器与硬件扬声器源耦合等?

我需要采取哪些步骤才能使我的过滤器显示为 Microphone 来源?

Lync (Skype for Business) 不使用 DirectShow 进行音频捕获,因此它看不到您的虚拟设备并且无法拾取它。据推测,它使用 WASAPI。 Virtual Audio Cable 大概实现了音频设备的内核级驱动程序,WASAPI 通过用户模式 ​​API 拾取并公开。无法将您的虚拟音频源连接到不使用 DirectShow 进行音频捕获的应用程序。