使用方法

目录

  1. 窗口
    1. 主页
    2. 配置文件
    3. 诊断
    4. 适配器
    5. 设置
    6. 首次运行设置
  2. 托盘与浮出窗口
  3. 随 Windows 启动
  4. CLI 模式
    1. 基本用法
    2. 选择编解码器
    3. 音质
    4. ABR(自适应比特率)
    5. 设备发现
    6. 全部选项
  5. 捕获模式
    1. 应用程序模式
    2. 音量
    3. 耳机按键
    4. 系统级音效应用
      1. 为什么 A2DPWB 没有自己的虚拟输出设备
  6. 编解码器比较
  7. aptX 系列与 aptX Adaptive 的兼容性
    1. 为什么不支持 aptX Adaptive
    2. 不存在从 aptX Adaptive 到 aptX 的“回退”
    3. 明确指定的编解码器不可用
    4. 耳机同时连接其他设备时缺少编解码器
    5. 采样率
    6. 查看耳机提供的编解码器
  8. 最大媒体数据包大小(每个配置文件)
  9. 验证媒体流(a2dpwb_decode)
  10. 链路质量与 AFH
  11. 对端接收器测试(tools/linux_sink)
  12. LE Audio(实验性)
  13. 更新
  14. 故障排除
    1. 窗口提示核心未运行
    2. 分配或恢复驱动程序失败
    3. Bluetooth 适配器无响应
    4. 更新后出现配对问题
    5. 连接超时

窗口

从“开始”菜单启动 A2DP Windows Bridge(或运行 a2dpwb.exe)。左侧菜单包含五个页面;窗口较窄时,菜单会折叠为图标。窗口只显示常驻程序 a2dpwb-core.exe 的运行情况:关闭窗口不会停止串流(请参阅托盘与浮出窗口)。

主页

  • 当前配置文件的设备、其状态,以及正在使用的编解码器和比特率。如果使用的编解码器与配置文件中的不同,编解码器标签会说明改用了哪种以及原因
  • 连接 / 断开连接,页面上最大的按钮
  • 音量:耳机的音量(请参阅音量)
  • 配置文件切换器、捕获源(附编辑按钮),以及带小图表的链路质量
  • 出现错误时会显示原因,并在可能时附上解决问题的按钮(分配 WinUSB、打开下载页面、重新启动 Bluetooth、重试、编辑配置文件等)

配置文件

配置文件是设备及其音效设置的组合。卡片上显示设备、编解码器和捕获源,并提供连接(串流期间为断开连接)、编辑和删除按钮。新建配置文件和编辑按钮会打开编辑器:

  • 设备:扫描设备会通过 USB 适配器查找附近的设备(约 10 秒;请让耳机进入配对模式)。A2DPWB 之前配对过的设备会标记为已配对。如果扫描找不到耳机,请在手动:下输入地址并单击使用;输入或粘贴的地址会自动格式化(aa-bb-cc-dd-ee-ff、AABBCCDDEEFF 和 AA BB CC DD EE FF 都会变为 AA:BB:CC:DD:EE:FF)
  • 配置文件名称:在你自行输入之前,会跟随设备名称
  • 编解码器:“自动”或某一种编解码器,以卡片形式显示,各带三个指标条(音质、低延迟、稳定性)。此编解码器不可用时使用其他编解码器(默认开启,请参阅明确指定的编解码器不可用)
  • 捕获源:系统环回、虚拟设备或应用程序(请参阅捕获模式)
  • Windows 音量同步(请参阅音量)
  • 高级(音质、采样率、位深度、数据包大小):只提供所选编解码器支持的选项
    • 音质:LDAC HQ (990 kbps) / SQ (660 kbps) / MQ (330 kbps);LHDC V5 高 (1000 kbps) / 中高 (900 kbps) / 标准 (500 kbps) / 移动 (400 kbps),即 Android 提供的四个级别;AAC 和 SBC 也有音质级别,aptX 系列则为固定比特率
    • ABR(自适应比特率):用于 LDAC 和 LHDC V5(请参阅 ABR)
    • 采样率:“自动”跟随捕获设备
    • 位深度:LDAC 和 LHDC V5 为 16 或 24 bit(“自动”:24 bit);其他编解码器为 16 bit
    • 最大媒体数据包大小(字节)(请参阅最大媒体数据包大小)

默认值即可获得最佳音质;大多数配置文件无需更改高级中的任何设置。

诊断

  • 串流期间的链路质量:实际比特率、数据包、发送前丢弃的数据包、捕获时丢弃的音频、发送队列、无线占用时间、信号(RSSI)以及 AFH 信道(请参阅链路质量与 AFH)
  • 连接流程:最近一次连接尝试的十一个阶段(开始、Bluetooth 适配器、ACL / AVDTP 连接、功能发现、编解码器选择、音频捕获、流配置、编码器、流开始、音频发送、包括断开 / 重新连接在内的连接维持),各标记为“正常”、“警告”或“失败”,并显示所用时间。复制流程可复制这些内容
  • 日志:实时显示,可按级别(所有级别、信息及以上、警告和错误、仅错误)和文本筛选。复制显示的日志可复制当前显示的内容
  • 开始 HCI 捕获 / 停止 HCI 捕获(请参阅验证媒体流)
  • 复制诊断信息:将版本、操作系统、适配器、配置文件、连接流程、警告 / 错误以及最近的日志复制到剪贴板,可直接粘贴到错误报告中。隐藏 Bluetooth 地址(默认开启)只保留厂商部分(AA:BB:CC:xx:xx:xx)

开启设置 > 开发者模式后,“诊断”中还会出现对端接收器测试选项卡(请参阅对端接收器测试)。

适配器

  • 检测到的 USB Bluetooth 适配器及其芯片、驱动程序和固件。刷新会重新检测
  • 分配 WinUSB / 恢复驱动程序(请参阅安装与设置);每次操作 Windows 都会请求管理员权限
  • 用于固件的 Bluetooth 芯片,以及打开下载页面和打开配置文件夹(请参阅固件)
  • AFH:自动、关或手动指定 Wi-Fi 信道(请参阅链路质量与 AFH)
  • Bluetooth 堆栈:已停止(在首次扫描或连接时启动)、正在启动、就绪或错误,以及重新启动 Bluetooth

设置

分区 设置项
外观 语言、主题(跟随系统 / 浅色 / 深色)
启动 随 Windows 启动和在托盘中启动(请参阅随 Windows 启动)、最小化到系统托盘(请参阅托盘与浮出窗口)
耳机 耳机按键控制播放(请参阅耳机按键)、记住耳机音量(请参阅音量)
更新 检查更新、启动时检查更新、检查更新时包括预发布版本(也会提示 beta 版本)、立即更新(请参阅更新)
高级 开发者模式(在“诊断”中添加接收器测试,并在日志中输出更多细节;无需重新启动)、设置文件夹及打开配置文件夹、运行设置向导
关于 A2DPWB 版本、许可证、第三方许可证、退出 A2DPWB

首次运行设置

首次启动时(还没有配置文件,或没有使用 WinUSB 的适配器),会打开设置 A2DPWB:选择适配器、驱动程序和固件、查找耳机、测试。请参阅安装与设置。设置 > 运行设置向导可再次打开它。

托盘与浮出窗口

无论窗口是否打开,A2DPWB 都会在系统托盘中持续运行:

  • 左键单击托盘图标会打开浮出窗口:设备及其状态、连接 / 断开连接、音量、配置文件切换器、编解码器、链路质量以及打开应用。按 Esc 或单击其他位置即可隐藏。如果某个错误需要用到主窗口的某个页面(配置文件、适配器),其按钮会打开窗口并转到该页面
  • 右键单击打开菜单:打开 A2DPWB、前 10 个配置文件(当前使用的配置文件带勾选标记;单击某个配置文件即可用它连接)、断开连接和退出。菜单会立即打开,无需启动窗口
  • 工具提示会显示 A2DPWB 处于空闲还是正在串流

设置 > 最小化到系统托盘开启时(默认),最小化或关闭窗口只是将其隐藏到托盘,串流继续进行。关闭该项时,窗口会最小化到任务栏,关闭窗口则会退出 A2DPWB。托盘菜单中的退出或设置 > 退出 A2DPWB 会停止串流、释放适配器并完全关闭 A2DPWB。

随 Windows 启动

设置 > 随 Windows 启动会在你登录时启动 A2DPWB。开启在托盘中启动时,它在后台启动:只显示托盘图标,窗口可从托盘打开。关闭该项时(默认),会打开主窗口。它对应 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 下名为 A2DPWB 的值,数据为 "<folder>\a2dpwb-core.exe",开启在托盘中启动时后面加上 --background。如需手动关闭,删除该值即可。在 v1 上覆盖安装 v2 时,在托盘中启动会被开启,因为 v1 总是在托盘中启动。

CLI 模式

a2dpwb-core.exe --cli 在控制台中串流,使用与窗口相同的核心。请先退出 A2DPWB(托盘 > 退出):同一时间只能有一个程序使用适配器。CLI 不读取配置文件;所有设置都通过选项指定。

基本用法

# Auto-select best codec
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF

按 Ctrl+C 停止串流。CLI 会输出状态、编解码器和比特率,并在结束时输出已发送和已丢弃的数据包数。

选择编解码器

a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c ldac      # LDAC
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c aptxhd    # aptX HD
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c aptxll    # aptX Low Latency
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c aptx      # aptX
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c aac       # AAC
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c sbc       # SBC
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c lhdcv5    # LHDC V5
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c opus      # Opus (experimental; 48 kHz, 256 kbps)

自动选择的优先级:LDAC > aptX HD > aptX LL > aptX > LHDC V5 > Opus(实验性)> AAC > SBC XQ > SBC(FastStream 仅在明确选择时使用)

如果耳机不提供所请求的编解码器,CLI 会停止并显示说明原因的错误;使用 -c auto(默认)即可采用耳机提供的最佳编解码器。aptX Adaptive 永远不会被选中——请参阅 aptX 系列与 aptX Adaptive 的兼容性。

音质

a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c ldac -q hq   # 990 kbps (default)
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c ldac -q sq   # 660 kbps
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c ldac -q mq   # 330 kbps

# LHDC V5: hq 1000 / mhq 900 / sq 500 / mq 400 kbps (Android's four levels)
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c lhdcv5 -q mhq  # 900 kbps

ABR(自适应比特率)

a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c ldac -a
a2dpwb-core.exe --cli -d AA:BB:CC:DD:EE:FF -c lhdcv5 -a

ABR 会在 Bluetooth 连接不稳定时自动降低比特率,并在状况改善后提高比特率。LDAC 在其各音质模式之间切换;LHDC V5 遵循 Android 的策略,保持在 160 到 400 kbps 之间。在窗口中,ABR 位于配置文件编辑器的高级下。

设备发现

# Nearby devices, found with the USB adapter (10 seconds; --scan 20 for longer)
a2dpwb-core.exe --cli --scan

请先让耳机进入配对模式。

全部选项

选项 说明
-d <addr> 耳机 / 接收器的 Bluetooth 地址(AA:BB:CC:DD:EE:FF)
-c <codec> ldac、aptxhd、aptxll、aptx、aac、sbc、lhdcv5、opus、auto(默认:auto)
-q <mode> 音质:hq(默认)、sq、mq;LHDC V5 另有 mhq(900 kbps)
-a ABR(LDAC 和 LHDC V5)
-m <mode> 捕获模式:loopback(默认)、virtual、app
--audio-device <id> 用于 -m virtual 的渲染设备
--app <exe> 用于 -m app 的可执行文件(如 spotify.exe)
--rate <hz> 捕获采样率(默认:设备的采样率)
--bits <16\|24> 位深度(默认:编解码器支持时为 24)
--max-packet <bytes> 最大媒体数据包大小,679-1679,默认 1023(请参阅最大媒体数据包大小)
--afh <auto\|off\|6,11> AFH 主机信道分类(请参阅链路质量与 AFH)
--remote-sink <host[:port]\|auto> 显示对端接收器收到的内容;未指定 -d 时,向该接收器串流(请参阅对端接收器测试)
--scan [seconds] 列出附近的设备并退出(默认 10 秒)
-h 显示帮助

用于开发和测试的选项还有:--hci-tcp <host:port>(通过 TCP 使用虚拟控制器,代替 WinUSB 适配器)、--test-tone(以左 1 kHz / 右 1.5 kHz 的测试音代替捕获的音频)、--duration <s>(运行指定秒数后停止)和 --hci-capture <file.pklg>(对整个运行过程进行 HCI 捕获);请参阅构建。

不带 --cli 时,a2dpwb-core.exe 就是常驻程序:它也会启动窗口,但使用 --background 时除外(只显示托盘图标,开启在托盘中启动时供随 Windows 启动使用)。a2dpwb-core.exe --quit 会请求正在运行的 A2DPWB 停止串流并退出(安装程序会使用它)。

捕获模式

A2DPWB 支持三种音频捕获模式,分别录制音频路径中的不同位置:

模式 录制内容
系统环回 Windows 默认输出设备播放的内容:所有应用混合后的声音
虚拟设备 应用播放到所选设备(如 VB-CABLE)的内容
应用程序 仅某一个应用(及其子进程)播放的内容,且是经过该应用自身处理之后的声音。需要 Windows 11 或 Windows 10 版本 2004(内部版本 19041)及更高版本

配置文件编辑器的捕获源下也有相同的说明。

系统环回只是复制音频,不会把声音从默认输出设备上拿走。声音会继续在该设备(扬声器、HDMI 电视等)上播放,同时也在 Bluetooth 耳机上播放。如果只想在耳机上听到,请使用虚拟设备模式,并选择不会在任何地方发声的设备,例如 VB-CABLE。

在虚拟设备模式下,自动切换默认设备会在串流期间将所选设备设为 Windows 默认输出设备,这样无需更改 Windows 设置,应用就会播放到该设备。停止串流时,A2DPWB 会切换回之前的默认设备。

  • 音频设备列表中只显示 A2DPWB 识别为虚拟音频设备的设备。如果没有这样的设备,编辑器会提供下载 VB-Cable。
  • 默认通信设备(通话类应用使用的设备)不会被更改。
  • 某些应用在重新启动之前,仍会继续在之前的设备上播放。
  • 如果 A2DPWB 意外退出,默认设备不会被切换回去。请在 Windows 声音设置中更改。

应用程序模式

应用程序模式发送某一个应用的音频,例如音乐播放器、浏览器或音效应用。在应用列表中选择该应用。列表显示当前正在播放音频的应用;如果找不到你的应用,请先在其中开始播放,然后单击刷新。应用的子进程也包含在内,因此在独立进程中播放音频的浏览器也能正常工作。

  • 应用不必正在运行。A2DPWB 仍会连接耳机,并在应用启动后开始发送。如果应用在串流期间退出,A2DPWB 会保持连接,并在应用重新启动后重新捕获它。
  • 应用仍会在其自身的输出设备上播放。如果只想在耳机上听到,请将该输出设备静音(其主音量):这不会影响 A2DPWB 捕获的内容。但不要在 Windows 音量合成器中将该应用静音,否则耳机也会没有声音。
  • 应用在 Windows 音量合成器中的滑块会改变发送到耳机(以及其输出设备上)的音量。主音量和音量键不会改变发送的音频;当配置文件的 Windows 音量同步为“自动”时,它们改为调节耳机的音量(请参阅音量)。
  • Windows 会将音频转换为 A2DPWB 请求的采样率,因此声音设置中的设备格式不会对其造成限制。
  • 在 Windows 10 版本 2004(内部版本 19041)之前的版本上,Windows 不支持按应用捕获。此时使用“应用程序”配置文件连接会显示错误,提示选择其他捕获源。

音量

串流期间,如果耳机支持 AVRCP 绝对音量,主页和托盘浮出窗口会显示音量滑块。它直接设置耳机本身的音量,因此发送的音频保持完整的分辨率。该滑块也会跟随耳机上的音量按键和触控操作。

配置文件中的 Windows 音量同步会在串流期间将某个 Windows 音量与耳机音量合为一个音量:

选项 同步的 Windows 音量
自动(默认) A2DPWB 捕获的设备:系统环回和应用程序模式下为默认输出设备,虚拟设备模式下为所选设备
关 无:Windows 音量与耳机音量相互独立
某个输出设备 该设备的音量
  • 耳机的音量按键和手势以及音量滑块会调节同步的 Windows 音量,而声音设置中该设备的滑块会调节耳机的音量。
  • 音量键和 Windows 音量浮出控件始终作用于默认输出设备,因此只有当默认输出设备就是同步的设备时,它们才会改变耳机音量(“自动”即如此,但在未开启自动切换默认设备的虚拟设备模式下除外)。
  • 开始串流时,耳机音量会采用 Windows 音量;停止串流时,设备会恢复到之前的音量。
  • 使用“自动”时,音频是在应用 Windows 音量之前被捕获的,因此只会在耳机上衰减一次。如果同步的音量也会改变捕获到的音频,音量就会被应用两次:此时请选择“关”(请参阅系统级音效应用)。
  • 静音不会同步:将输出设备静音会让 PC 不发声,但不会让耳机静音。

设置 > 记住耳机音量(默认关闭)会为每台设备保存耳机音量,并在连接后、发送任何音频之前立即重新设置。否则耳机会以其自身上次的音量启动,这可能比上次使用 A2DPWB 时的音量大得多(例如刚在手机上用过之后)。

耳机按键

串流期间,耳机上的播放/暂停、下一曲和上一曲控制(按键或触控手势,例如 WH-1000XM4 上的双击)可控制 PC 上的播放:A2DPWB 将它们作为媒体键传递给 Windows,由 Windows 媒体控件中显示的应用(Spotify、浏览器、媒体播放器等)接收。停止也会被传递。

  • 播放和暂停都作为 Windows 的播放/暂停键处理,因此即使耳机所认为的状态已过时,每次轻点也总会在播放和暂停之间切换。
  • A2DPWB 会告诉耳机当前是否在播放音频(依据是否有可捕获的音频),因此摘下时会暂停的耳机也能发送正确的命令。
  • 快进 / 快退(长按按键)没有对应的 Windows 媒体键,会被忽略。
  • 音量手势会改变耳机自身的音量;开启 Windows 音量同步时,同步的 Windows 音量也会随之变化(请参阅音量)。
  • 可通过设置 > 耳机按键控制播放关闭此功能,例如另一个程序已经响应媒体键、导致操作被执行两次时。

此功能需要耳机支持 AVRCP,几乎所有耳机都支持。如果不支持,串流仍可照常进行,只是按键不起作用。

系统级音效应用

系统级音效应用(均衡器、音效增强、虚拟环绕声应用等)通常会安装自己的虚拟输出设备。其他应用播放到该设备;音效应用处理音频后,将结果播放到你在音效应用中选择的输出设备。在 A2DPWB 中选择哪种模式,决定了耳机是否能获得音效:

设置 到达耳机的内容
虚拟设备:音效应用自身的虚拟设备 音效处理之前的音频:应用送入音效应用的内容
应用程序:音效应用 音效处理之后的音频:音效应用播放的内容(推荐)
虚拟设备:音效应用的输出设备(例如将 VB-CABLE 设为其输出) 音效处理之后的音频(适用于不支持应用程序模式的 Windows 版本)

在应用程序模式下,音效应用的输出设备可以是任意设备:A2DPWB 获取的是应用播放的内容,而不是设备播放的内容,因此该设备只是音频的去处。为了不让 PC 同时发声,请选择没人收听的输出(例如显示器的 HDMI 音频),或将该设备的主音量静音。VB-CABLE 这样的虚拟设备也可以作为静默的输出目标,但并非必需。该设备必须已启用且已连接。

如果音效应用自身的虚拟设备是 Windows 默认输出设备,其音量也会降低音效应用接收到的音频。此时若 Windows 音量同步为“自动”,音量变化会被应用两次(在音效应用的输入端和耳机上)。请在该配置文件中将其设为“关”,并使用耳机的音量或音量滑块。

为什么 A2DPWB 没有自己的虚拟输出设备

要在 Windows 输出设备列表中出现一个可供音效应用直接选择的 Bluetooth 耳机项,就需要内核模式音频驱动。A2DPWB 不包含这样的驱动:

  • 编写和维护内核音频驱动工作量很大,其中的错误可能导致 Windows 崩溃(蓝屏)。
  • Windows 10 和 11 只加载经过 Microsoft 签名的驱动。获得该签名需要 EV 代码签名证书(每年数百美元)和 Microsoft 合作伙伴中心帐户,通常需以公司名义注册。
  • 绕过签名的唯一方法是 Windows 测试签名模式,它会降低系统安全性,并导致部分软件(例如带反作弊的游戏)无法正常运行。A2DPWB 不会依赖它。

应用程序模式,或 VB-CABLE 等免费虚拟设备,可以满足相同的用途。

  • Windows 没有用于更改默认设备的公开 API。A2DPWB 与其他音频切换工具一样,使用未公开的 IPolicyConfig 接口(Windows 10 和 11)。

系统环回和虚拟设备使用 WASAPI 共享模式,因此捕获的采样率由 Windows 声音设置中设备的默认格式决定(通常为 48 kHz)。如需以 96 kHz 使用 LDAC,请在声音设置 > 设备属性 > 高级 > 默认格式中将输出设备的格式改为 96 kHz。

编解码器比较

编解码器 适合 取舍
LDAC (HQ) 最高音质 延迟较高,需要稳定的连接
LDAC (ABR) 音质 + 稳定性 比特率随连接状况波动
aptX HD 高音质,设备支持更广 固定 576 kbps
aptX LL 游戏、视频(低延迟) 音质较低(16-bit)
aptX aptX 设备支持最广 16-bit,352/384 kbps
AAC Apple 设备,效率高 音质中等
SBC 兼容性最佳 音质最低

配置文件编辑器在每张编解码器卡片上以三个指标条显示相同的比较。

aptX 系列与 aptX Adaptive 的兼容性

A2DPWB 支持三种 aptX 编解码器,均使用 libopenaptx 编码。不支持 aptX Adaptive。

aptX HD 和 aptX Low Latency 为实验性功能。 它们参照 Android / PipeWire 的实现,并通过了编码/解码往返测试,但尚未在真实耳机上验证。

只需要经典 aptX? Windows 10 的内置 Bluetooth 堆栈已经支持经典 aptX(不含 aptX HD、aptX LL 和 aptX Adaptive),因此无需 A2DPWB。A2DPWB 主要用于 LDAC、aptX HD 和 aptX Low Latency。

编解码器 Vendor ID / Codec ID RTP 标头 状态
aptX 0x0000004F / 0x0001 无 支持(44.1/48 kHz 下 352/384 kbps)
aptX HD 0x000000D7 / 0x0024 有 支持(576 kbps,24-bit 输入)
aptX Low Latency 0x0000000A 或 0x000000D7 / 0x0002 无 支持(352 kbps)
aptX Adaptive 0x000000D7 / 0x00AD – 不支持——仅检测并记录到日志

为什么不支持 aptX Adaptive

不存在开源的 aptX Adaptive 编码器。libopenaptx 只实现了 aptX 和 aptX HD(A2DPWB 也将其用于 aptX Low Latency)。arkq/openaptx 只是重新实现了 aptX / aptX HD,不包含 aptX Adaptive 编码器,且不允许再分发二进制文件。因此 A2DPWB 只检测 aptX Adaptive 并将其写入日志。

不存在从 aptX Adaptive 到 aptX 的“回退”

A2DPWB 连接时,耳机会通告一个编解码器列表(AVDTP 流端点)。A2DPWB 从该列表中选择一种编解码器。aptX Adaptive 从来不是候选项,因此也就不存在从它“回退”的情况:

  • 耳机同时列出了经典 aptX——许多 aptX Adaptive 耳机都是如此,因为 Qualcomm 宣传 aptX Adaptive 向下兼容 aptX / aptX HD。这种情况下 A2DPWB 会直接选择经典 aptX;它是耳机列表中独立的一种编解码器,而不是 aptX Adaptive 的降级模式。
  • 耳机只列出了 aptX Adaptive(没有经典 aptX、aptX HD 或 aptX LL)——无法通过 A2DPWB 使用 aptX。“自动”会按优先级顺序选择下一个编解码器,通常是 AAC 或 SBC。

自动选择的优先级:LDAC > aptX HD > aptX LL > aptX > LHDC V5 > Opus(实验性)> AAC > SBC XQ > SBC(FastStream 仅在明确选择时使用)

明确指定的编解码器不可用

当你请求了耳机未列出的特定编解码器时:

位置 行为
配置文件,开启了此编解码器不可用时使用其他编解码器(默认) 按“自动”的优先级顺序,使用耳机提供的最佳编解码器连接,编解码器标签会显示改用了哪种编解码器以及原因。
配置文件,关闭了该选项 连接因错误而停止(“设备不支持 …”)。如果你请求的是 aptX、aptX HD 或 aptX LL,而耳机只提供 aptX Adaptive,消息中会说明这一点,并建议使用“自动”、AAC 或 SBC。
CLI(-c <codec>) 以相同的错误停止。使用 -c auto 可用耳机提供的最佳编解码器连接。

该选项位于配置文件编辑器中编解码器卡片的下方(选择“自动”时不使用)。

耳机同时连接其他设备时缺少编解码器

耳机通过流端点(SEP)提供各个编解码器。在双设备(多点)连接时,正在向手机或 PC 串流的端点会被报告为正在使用,在该串流停止之前无法使用其编解码器。有些耳机还只在仅连接一台设备时才提供高解析度编解码器(LDAC、L2HC 等)。此时 A2DPWB 会在日志中记录:

remote SEP 6: sink audio, IN USE (codec not queried)
remote SEPs in use by another connection: 1 of 6 audio sink SEP(s); ...
capability discovery complete (LDAC=false ... , 1 of 6 audio sink SEP(s) in use)

并且错误消息会说明端点正被其他设备使用。请断开耳机与手机 / PC 的连接(或在耳机的应用中关闭双设备连接),然后重新连接。如果 PC 的内置 Bluetooth 仍与耳机配对,也算作其他设备。

采样率

aptX、aptX HD 和 aptX LL 只支持 44.1 kHz 和 48 kHz。A2DPWB 会从耳机通告的采样率中选择一个(优先使用当前 Windows 设备的采样率,否则使用 48 kHz),并由 WASAPI 对捕获的音频进行重采样。使用 aptX 时无需更改 Windows 声音设置。

查看耳机提供的编解码器

  1. 连接耳机。
  2. 打开诊断,在日志筛选框中输入 remote。

相同的内容也会写入配置文件夹中的日志文件(%APPDATA%\A2DPWB\logs\a2dpwb-core.<date>.log);在 CLI 模式下则输出到控制台。功能发现相关的日志行会准确显示耳机列出了哪些编解码器:

remote supports aptX (SEID ..., [...])
remote supports aptX Adaptive (SEID ...) - never selected (no open encoder); classic aptX is used only if the remote lists it
remote vendor codec 0x........./0x.... (SEID ...) - unsupported
capability discovery complete (LDAC=false aptX HD=false aptX LL=false aptX=true aptX Adaptive=true [not encodable] SBC=true AAC=true LHDC V5=false Opus=false)
  • aptX=true——可以使用经典 aptX(即使同时有 aptX Adaptive=true)。
  • aptX=false、aptX HD=false、aptX LL=false 且 aptX Adaptive=true——耳机只提供 aptX Adaptive;请使用“自动”、AAC 或 SBC。
  • remote vendor codec ... - unsupported——A2DPWB 未实现的其他厂商编解码器。

最大媒体数据包大小(每个配置文件)

每个配置文件中的最大媒体数据包大小(配置文件编辑器 > 高级;CLI:--max-packet <bytes>)设置每个 Bluetooth 数据包中音频数据的上限,范围为 679 到 1679 字节,这样需要不同值的耳机可以各自使用自己的设置。耳机自身的上限(MTU)也始终有效;A2DPWB 使用两者中较小的值。更改从下次连接时生效。由旧版本保存的配置文件会沿用之前全局设置的值。

推荐使用 1023(默认)。 它正好容纳一个 Bluetooth 基带数据包(3-DH5)。更大的值只能节省 1-2% 的开销,而每丢失一个数据包会损失更多音频。679 正好容纳一个 2-DH5 数据包,也是 LDAC 接受的最小值。

验证媒体流(a2dpwb_decode)

大多数耳机无法显示正在使用的编解码器。诊断 > 开始 HCI 捕获 / 停止 HCI 捕获会记录一份 HCI 数据包日志(配置文件夹中的 hci_<date>_<time>.pklg),包含编解码器协商和发送的每个媒体数据包。在 LDAC 990 kbps 下,它每小时大约增长 0.5 GB,因此请只在需要时进行捕获。在 CLI 模式下,--hci-capture <file.pklg> 会记录整个运行过程。

可以在连接前开始捕获,也可以在串流过程中开始。如果在连接期间开始捕获,A2DPWB 会先写入它记住的连接建立数据包(L2CAP 信道建立和 AVDTP 信令,包括编解码器协商),因此该文件仍然可以分析。“诊断”会在记录期间和停止后显示文件路径。

可以用 Wireshark 打开捕获文件,或使用开发者工具 a2dpwb_decode(需从源代码构建,请参阅构建)进行检查:

a2dpwb_decode "%APPDATA%\A2DPWB\hci_20260925_120000.pklg" -o C:\temp\check

该工具会跟踪 AVDTP 信令(SET_CONFIGURATION / RECONFIGURE 以及耳机是否接受),提取 A2DPWB 发送的媒体数据包,并对照协商的配置进行检查:

编解码器 检查内容 输出
SBC、AAC、aptX、aptX HD、aptX LL 使用参考解码器完整解码;帧参数与配置是否一致;媒体负载标头中的帧数 可供试听的 <prefix>.<n>.<codec>.wav
LDAC 仅检查帧头(同步字、采样率、声道模式、帧长度)、帧数和比特率。不存在开源的 LDAC 解码器 仅报告

对于每个流,它还会报告 RTP 序列号的间断、RTP 时间戳的推进速度、比特率,以及 Bluetooth 控制器报告已完成的 ACL 数据包数量。最后一行为 RESULT: OK 或 RESULT: PROBLEMS FOUND(退出代码为 0 或 1)。

这可以证明 A2DPWB 发送了什么,以及这些内容对于协商的编解码器是否有效。由于接收端只能解码协商好的编解码器,如果耳机播放的声音正常,同时报告也没有问题,就足以有力地证明该编解码器确实在使用中。

诊断 > 链路质量会显示串流期间 A2DPWB 发送的内容:实际比特率、已发送的数据包、发送前丢弃的数据包(发送队列已满:无线链路跟不上)、捕获时丢弃的音频、发送队列、无线占用时间,以及信号:连接的 RSSI(相对于控制器的理想接收范围,0 = 正常,负值 = 太弱;并非绝对电平),以及链路在 79 个 Bluetooth 信道中的多少个信道上跳频(AFH)。主页和托盘浮出窗口会将其概括为“良好”、“一般”或“较差”。

Bluetooth 会自行避开繁忙的信道(AFH),但它只能通过错误来了解 Wi-Fi 的存在。A2DPWB 还会在每次连接时告诉其控制器应避开哪些信道(AFH 主机信道分类):

AFH  
自动(默认) 仅本 PC 所连接的 2.4 GHz Wi-Fi 信道(连接期间每 30 秒重新检查一次)。PC 未使用 2.4 GHz Wi-Fi 时(未连接、使用 5 或 6 GHz,或有线连接)不指定任何信道
关 不指定:由控制器自行决定
手动,例如 6,11 指定的 Wi-Fi 信道(1 到 14)

对于 PC 只是能接收到的网络,“自动”会交给控制器自身的 AFH 处理:避开邻居的繁忙信道会从跳频中拿走 22 MHz,反而可能让链路变差。如果仍想避开这样的信道,请以“手动”方式输入。

始终至少保留 20 个 Bluetooth 信道可用。可以在适配器页面、settings.json(配置文件夹中)的 "afh",或 CLI 模式下的 --afh 进行设置。无线一行会显示正在避开哪些 Wi-Fi 信道。是否有帮助取决于环境:请用对端接收器测试进行测量。

对端接收器测试(tools/linux_sink)

链路质量显示的是 A2DPWB 发送的内容。要查看实际到达的内容,请在另一台运行 Linux 的 PC 上运行 tools/linux_sink/a2dpwb_sink.py。它直接驱动该 PC 上的普通 Bluetooth 适配器(内置适配器即可),通过 HCI user channel 使用 Bumble,作为支持包括 LDAC 在内所有编解码器的 A2DP 接收端,测量到达的每个媒体数据包,并通过网络提供统计数据:

将 tools/linux_sink 文件夹复制到 Linux PC 上(只需这个文件夹),然后运行:

sh setup.sh      # once: decoder libraries, Python environment (Ubuntu / Debian, Python 3.11+)
sudo sh run.sh   # start the receiver (root: it takes the Bluetooth adapter)

在 Windows PC 上退出 A2DPWB(托盘 > 退出),然后运行:

a2dpwb-core.exe --cli --remote-sink auto -c ldac --test-tone

--remote-sink auto 会在本地网络中查找接收器,向其 Bluetooth 适配器串流(除非 -d 指定了其他设备),并每 5 秒以及结束时输出接收器的统计数据:比特率、丢失和迟到的数据包(RTP 序列号)、抖动和间隔、模拟播放缓冲区中的断音和跳过、流 / 解码错误,以及接收端的 RSSI(相对于其理想接收范围:0 = 正常,负值 = 太弱)。不加 --test-tone 时发送系统音频。--remote-sink <host[:port]> 可直接指定接收器,而不进行查找。

开启设置 > 开发者模式后,“诊断”中会有对端接收器测试选项卡。在此版本中它仍是预览:可以保存接收器地址,但尚不能串流。请使用上面的命令行。

双方都从流的第一个数据包开始计数,因此可以比较发送和接收的数据包数:两者应当相等。Bluetooth 会在控制器内部重传丢失的无线数据包,而 A2DPWB 在链路保持连接期间不会放弃任何数据包,因此较差的无线链路在接收端会表现为间隔、抖动和断音,而不是丢包;当链路跟不上时,数据包会在发送端于发送前被丢弃。双方都无法获得重传次数。

工具运行期间,接收端的适配器无法供其自身的 Bluetooth 堆栈使用。发现过程使用 UDP 端口 51201 上的广播,因此两台 PC 必须位于同一网段(否则请输入地址)。所有选项和统计协议请参阅 tools/linux_sink/README.md。

LE Audio(实验性)

A2DPWB 也可以向 LE Audio 耳机传输音频(BAP 单播,通过连接等时流传输 LC3),并支持耳机音量(VCP)、媒体按键(MCP)、一对耳机的左右两只(CSIP)以及游戏耳机的低延迟模式(GMAP)。此功能为实验性功能,按配置文件选择:只有用于 LE Audio 设备的配置文件才会使用它。它只在 Bluetooth 模拟器上测试过,尚未在真实的 LE Audio 耳机上验证,可能无法与您的设备配合使用;日常收听请使用传统的 A2DP 配置文件。

需要:

  • 支持等时通道(ISO)的 Bluetooth 5.2 或更新版本的 USB Bluetooth 适配器(与 A2DP 一样分配 WinUSB)。不支持 ISO 的适配器会以 “adapter does not support LE Audio (no ISO buffers)” 被拒绝。
  • 支持 LE Audio(LC3)的耳机。有些型号需要先在其专用应用中开启 LE Audio。

使用方法:

  1. 让耳机进入配对模式,在配置文件中扫描设备。LE Audio 设备带有 LE Audio 标记,一对耳机带有 LE Audio 组 标记(选择其中任意一只,A2DPWB 会找到另一只)。同时支持 A2DP 的耳机会按类型显示两次。
  2. 在配置文件中勾选 LE Audio 设备(实验性,LC3)。不能选择编解码器和质量(A2DPWB 会选择耳机接受的最佳 LC3 配置),捕获方式只能使用系统环回和虚拟设备。
  3. 其下的 游戏耳机低延迟(GMAP,实验性) 默认开启:对支持 GMAP 游戏角色的耳机使用更短的 LC3 帧;其他耳机则无论开关都使用媒体配置。

设置中没有 LE Audio 开关。如果 LE 部分干扰了适配器,可在 settings.json(设置 > 设置文件夹)中写入 "le_audio_experimental": false,将其完全关闭。

在 CLI 模式下,--le-audio -d <地址> 向 LE Audio 设备传输,--le-device <地址> 添加组中的另一台设备(另一只耳机),--le-scan 列出附近的 LE Audio 设备,--le-low-latency / --le-preset <名称> 选择配置(所有 LE 选项见 a2dpwb-core.exe --cli -h)。

更新

A2DPWB 每天最多检查一次 GitHub Releases(设置 > 启动时检查更新;检查更新时包括预发布版本还会提示 beta 版本)。有新版本时,“设置”中会显示提示:

  • 安装版:立即更新会下载已签名的更新。串流期间会等待,直到串流停止后再安装,因此更新永远不会打断音频。随后 A2DPWB 会关闭、安装新版本并自动重新启动。
  • 便携版(或未进行更新签名的构建):打开下载页面会打开发布页面。

故障排除

窗口提示核心未运行

窗口需要同一文件夹中的 a2dpwb-core.exe,并会自动启动它。“A2DPWB 核心未运行”表示无法启动它:请重新安装 A2DPWB(或重新解压便携版 zip)。“核心版本不同”表示两个程序来自不同的版本:请安装两者的相同版本(安装最新版本即可)。

分配或恢复驱动程序失败

  • “管理员权限请求已被拒绝”:驱动程序未更改。请再次单击按钮并允许该请求。
  • “更改驱动程序失败”:详情请查看诊断 > 日志。
  • “适配器未恢复为之前的驱动程序”:如果适配器是用 Zadig 设置的,Windows 可能会再次选择 Zadig 的 WinUSB 驱动程序包。请在设备管理器中删除该驱动程序包(适配器 > 卸载设备,并勾选“尝试删除此设备的驱动程序”),然后拔下并重新插入适配器。

Bluetooth 适配器无响应

如果适配器打开后没有任何回应(不响应 HCI Reset),A2DPWB 会在 5 秒后放弃,再打开一次;如果仍无响应,则显示“Bluetooth 适配器无响应”。请拔下适配器,重新插入后再试(或单击重新启动 Bluetooth)。无需重新启动 A2DPWB:启动失败时会释放适配器,每次新的启动都会重新初始化它。

为防止适配器卡住,A2DPWB 在打开适配器时会重置其 USB 管道,在关闭时会发送 HCI Reset。

更新后出现配对问题

A2DPWB 使用 SSP(Just Works)和 General Bonding 进行配对,并保存链接密钥,这样耳机无需重新配对即可再次连接(v2 会读取 v1 的链接密钥)。如果你曾用较旧的 A2DPWB 版本配对过耳机,且现在无法连接,请在耳机上删除 A2DPWB 的配对信息(清除配对列表的方法请参阅耳机的说明书),然后重新配对。

连接超时

A2DPWB 会注册 SDP 记录(A2DP Source、AVRCP Controller / Target),以便耳机将其识别为音频源。如果连接尝试超时,半开的连接会被断开,因此可以直接重试,无需重新启动 A2DPWB。请确认耳机已开机、在范围内,并且没有连接到其他设备。

当链路建立后没有传输任何数据,或耳机没有应答时,失败的连接会自动重试(最多 3 次)。如果耳机已不再保留配对信息(被重置,或与其他 PC 配对过),已存储的密钥会被丢弃,并重新进行一次配对。随后错误消息会说明发生了什么:

消息 含义
设备无应答 设备关闭、超出范围或不可连接(新设备:请进入配对模式)
连接已建立但没有传输任何数据 无线环境问题:请重试,或调整适配器 / 设备的位置
设备已应答,但随后主动断开了连接 设备当前不接受连接:正在关机、充电或已连接到其他设备
身份验证失败,重新配对后仍然失败 请将设备置于配对模式,或删除其配对列表中的条目,然后重试

连接中断后会自动重新连接(最多 10 次)。如果 PC 在串流期间进入睡眠,A2DPWB 会在恢复后重新连接;这些尝试不计入次数。