蓝牙耳机通话时 WASAPI Loopback 为何没有音频数据?
结论
现有日志还不足以判断这是 WASAPI 对蓝牙通话的普遍限制。WASAPI loopback 捕获的是指定 render endpoint 上由 Windows 音频引擎播放的音频。会话枚举器显示 Chrome 会话为 Active,只能说明会话处于活动状态,不能证明该 endpoint 当时有音频帧可供 loopback 读取。Microsoft 的 Loopback Recording 文档
蓝牙经典音频在麦克风参与通话时会使用 Hands-Free Profile(HFP)。Microsoft 说明,HFP 支持单声道录音和单声道播放;在 Windows 10 上切换到 HFP 时,发往 A2DP Stereo endpoint 的音频会被丢弃。Windows 11 则统一 A2DP/HFP endpoint,并根据麦克风是否打开等条件选择配置。Microsoft 的 Bluetooth Classic Audio 文档 这些行为可能影响录音所选的 endpoint 和实际路由,但文档没有说明蓝牙双向通话时 loopback 一定会返回 0 字节。
先确认实际播放路由
日志显示,活动会话属于 Headphones (2- Razer BlackShark V2 HS BT);设备列表中 OnePlus Buds 3 有 0 个活动会话。排查时应确认通话期间 Chrome 实际使用的播放 endpoint,并核对它是否与传给 IMMDeviceEnumerator::GetDevice 的 endpoint ID 一致。Windows 10 和 Windows 11 对蓝牙 endpoint 的呈现方式及配置切换不同,仅凭设备名称无法确定当前使用的 profile。
可以按以下顺序检查:
- 通话期间查看 Windows 音量合成器中 Chrome 的输出设备,并确认它与传给
IMMDeviceEnumerator::GetDevice的 endpoint ID 一致。 - 记录通话前后的 endpoint ID、
GetMixFormat()结果、默认 communications/render endpoint,以及 Chrome 的输出目标。如果麦克风打开后路由或格式发生变化,停止旧客户端,针对当前 endpoint 重新初始化,再观察是否有数据包。 - 在捕获循环中分别统计
GetNextPacketSize、GetBuffer的 HRESULT、numFrames和flags。AUDCLNT_BUFFERFLAGS_SILENT表示存在静音帧;如果要生成带时长的 WAV,也应按静音帧数量写入相应的零样本,不能完全跳过写入。你给出的日志显示GetNextPacketSize持续为 0,因此仍需重点确认是否有 packet 到达。 - 使用另一个麦克风进行同一通话,同时让蓝牙耳机只负责输出。你已测试过类似场景,且 loopback 可以正常工作。这提示问题可能与通话时的蓝牙音频模式或路由有关,但还不能据此确定具体原因。
Windows 10 1703 及更高版本支持 loopback 的 event-driven buffering。Microsoft 文档提到的旧系统事件通知限制,不适用于通常所说的 Windows 10/11 版本。Loopback Recording 文档 因此,在这些系统上,单纯移除 AUDCLNT_STREAMFLAGS_EVENTCALLBACK 不能证明问题已解决;还应检查实际路由和捕获缓冲区状态。
可尝试的替代方式
如果目标是捕获 Chrome 输出的远端通话声音,可以测试 Windows 的 process loopback。它按进程及其子进程捕获渲染流,不绑定到某个物理 endpoint;Microsoft 的 API 文档列出的最低客户端版本是 Windows 10 Build 20348。如果 Chrome 当前没有渲染流,process loopback 也会得到静音。Process loopback API Microsoft 示例
如果还要录制本地说话者的麦克风,需要另外打开对应的 capture endpoint。Render loopback 和麦克风输入是不同的数据流;捕获 Chrome 的渲染音频不会自动包含蓝牙麦克风输入。如果 process loopback 也没有通话音频,应继续确认 Chrome 的实际渲染行为和应用音频路由。仅凭当前材料,无法认定存在另一个 Windows API 可以绕过未进入可捕获渲染流的音频。
关于官方限制说明
Microsoft 官方资料分别说明了 WASAPI loopback 如何捕获 render endpoint 的播放流,以及蓝牙 A2DP/HFP 的切换行为。目前,这些资料没有将“蓝牙耳机同时作麦克风和扬声器时 loopback 返回 0 字节”列为普遍且必然的限制。要判断你的具体情况,还需结合通话期间的 endpoint 路由、Windows 版本和捕获状态进一步排查。
备注:内容仅供参考。
