如何为蓝牙耳机选择合适的编解码器?

如何为蓝牙耳机选择合适的编解码器?

我刚刚拿到了新的 Sony WH-1000XM3 耳机,想知道如何正确将其连接到我的 Ubuntu 机器。这是一款带有集成麦克风的 ANC 耳机 - 主要用于录制环境噪音,但它们也可以用作输入。我主要感兴趣的机器运行 18.04 LTS(工作笔记本电脑),但我的私人电脑上也运行 20.04 LTS / 20.10。

当我第一次将耳机连接到电脑时,我对音质的糟糕程度感到震惊,但后来我意识到我在音质下选择了“耳机主机(HSP/HFP)”。我可以毫无问题地选择“高保真播放(A2DP)”,输出声音也变得更好了。问题是:每当我启用“耳机 - LE_WH-1000XM3”作为笔记本电脑内置麦克风的输入设备时,输出就会跳回到“耳机主机(HSP/HFP)”。希望这对我有帮助,我从 PPA 安装了 LDAC 支持:https://github.com/EHfive/pulseaudio-modules-bt/wiki/Packages#ppaeh5pulseaudio-a2dp但问题当然仍然存在。在路上的某个地方,我读到 LDAC 解码器(与我安装的编码器相反)甚至不是免费提供的(来源:https://habr.com/en/post/456182/) 因此尝试通过 LDAC 发送麦克风信号从一开始就注定会失败。

我有什么办法可以让新买的耳机获得可接受的麦克风输入并保持良好的音频输出(都比 HSP/HFP 更好)?不知何故,我的 Android 设备(LineageOS 15.1 - Oreo 8.1)确实保持了不错的输入和输出质量,我希望在我的 Linux 机器上也能有同样的体验。

根据开发者选项的 Android 统计数据:

Bluetooth AVRCP Version: AVRCP 1.4
Bluetooth Audio Codec: LDAC
Bluetooth Audio Sample Rate: 96 kHz
Bluetooth Audio Bits Per Sample: 32 bits/sample
Bluetooth Audio Channel Mode: Stereo
Bluetooth Audio LDAC Codec: Best Effort (Adaptive Bit Rate)

调查“蓝牙 HCI 监听日志”(https://btcodecs.valdikss.org.ru/)得出:

Connection:
  XX:XX:XX:XX:XX:XX (Redmi Note 4) → YY:YY:YY:YY:YY:YY (WH-1000XM3)
Supported codecs:
  Audio SBC (44100 48000 | Mono DualChannel Stereo JointStereo | block: 4 8 12 16 | subbands: 4 8 | allocation: SNR Loudness | bitpool: 2..53)
  Audio non-A2DP (LDAC - 44100 48000 88200 96000, Mono DualChannel Stereo)
  Audio non-A2DP (aptX HD - 44100 48000, Stereo)
  Audio non-A2DP (aptX - 44100 48000, Stereo)
  Audio MPEG-2,4 AAC
Used for audio:
  Audio non-A2DP (LDAC - 96000, Stereo)

这与索尼的信息一致: https://helpguide.sony.net/mdr/wh1000xm3/v1/en/contents/TP0001703175.html

我该怎么做才能让这款耳机在 Linux 上正常工作?
如果我什么都做不了,为什么?
如果我无法用这个特定的设备做任何事情,如果我想为 Linux 购买一款好的无线耳机,我需要寻找哪些属性,我如何找到这样的“Linux”耳机?
蓝牙耳机是否还不适用于 Linux,如果我想要获得良好的体验,我需要坚持使用有线耳机?

我知道问题如何在使用蓝牙耳机麦克风时保持 A2DP 音频配置文件?(一键通)WIP:通过 hsphpfd 守护进程实现蓝牙 HSP 和 HFP 配置文件但我认为我的问题并不完全相同。

编辑:添加pactl输出

user@pc:~$ pactl list sinks
Sink #0
    [...]
    Description: Built-in Audio Analog Stereo
    [...]

Sink #25
    State: RUNNING
    Name: bluez_sink.ZZ_ZZ_ZZ_ZZ_ZZ_ZZ.a2dp_sink
    Description: LE_WH-1000XM3
    Driver: module-bluez5-device.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 33
    Mute: no
    Volume: front-left: 34080 /  52% / -17,04 dB,   front-right: 34080 /  52% / -17,04 dB
            balance 0,00
    Base Volume: 65536 / 100% / 0,00 dB
    Monitor Source: bluez_sink.ZZ_ZZ_ZZ_ZZ_ZZ_ZZ.a2dp_sink.monitor
    Latency: 36416 usec, configured 30804 usec
    Flags: HARDWARE DECIBEL_VOLUME LATENCY 
    Properties:
        bluetooth.protocol = "a2dp_sink"
        bluetooth.a2dp_codec = "LDAC"
        device.description = "LE_WH-1000XM3"
        device.string = "ZZ_ZZ_ZZ_ZZ_ZZ_ZZ"
        device.api = "bluez"
        device.class = "sound"
        device.bus = "bluetooth"
        device.form_factor = "headset"
        bluez.path = "/org/bluez/hci0/dev_ZZ_ZZ_ZZ_ZZ_ZZ_ZZ"
        bluez.class = "0x240404"
        bluez.alias = "LE_WH-1000XM3"
        device.icon_name = "audio-headset-bluetooth"
        device.intended_roles = "phone"
    Ports:
        headset-output: Headset (priority: 0, available)
    Active Port: headset-output
    Formats:
        pcm

user@pc:~$ pactl list sources
Source #0
    [...]
    Description: Monitor of Built-in Audio Analog Stereo
    [...]

Source #1
    [...]
    Description: Built-in Audio Analog Stereo
    [...]
    
Source #37
    State: IDLE
    Name: bluez_sink.ZZ_ZZ_ZZ_ZZ_ZZ_ZZ.a2dp_sink.monitor
    Description: Monitor of LE_WH-1000XM3
    Driver: module-bluez5-device.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 33
    Mute: no
    Volume: front-left: 65536 / 100% / 0,00 dB,   front-right: 65536 / 100% / 0,00 dB
            balance 0,00
    Base Volume: 65536 / 100% / 0,00 dB
    Monitor of Sink: bluez_sink.ZZ_ZZ_ZZ_ZZ_ZZ_ZZ.a2dp_sink
    Latency: 0 usec, configured 30804 usec
    Flags: DECIBEL_VOLUME LATENCY 
    Properties:
        device.description = "Monitor of LE_WH-1000XM3"
        device.class = "monitor"
        device.string = "ZZ_ZZ_ZZ_ZZ_ZZ_ZZ"
        device.api = "bluez"
        device.bus = "bluetooth"
        device.form_factor = "headset"
        bluez.path = "/org/bluez/hci0/dev_ZZ_ZZ_ZZ_ZZ_ZZ_ZZ_DA"
        bluez.class = "0x240404"
        bluez.alias = "LE_WH-1000XM3"
        device.icon_name = "audio-headset-bluetooth"
        device.intended_roles = "phone"
    Formats:
        pcm

答案1

使用标准蓝牙协议时,高质量输出不能与麦克风输入结合,因为 A2DP 配置文件是单向的。

Android 手机有一个策略组件,当麦克风激活时会自动切换配置文件。我相信当您将麦克风设置为输入源时,PulseAudio 也会尝试执行相同的操作。

答案2

  • 将其添加到文件中/etc/pulse/default.pa

load-module module-bluetooth-discover a2dp_config="sbc_cmode=dual sbc_min_bp=53 sbc_max_bp=53 sbc_freq=44k"

  • 然后pulseaudio -k
  • 重新连接耳机
  • 比以前的 SBC 模式更好的音频

相关内容