Bluetooth-наушники в Linux обычно работают сразу: подключил — и звук есть. Проблемы начинаются позже, когда выясняется, что микрофон звучит как из бочки, музыка хрипит, а видео отстаёт на полсекунды. Причина почти всегда в профиле, кодеке или настройках PipeWire. Ниже — как разобраться в этой цепочке, выбрать режим осознанно и не потерять качество там, где оно важно.
Кто за что отвечает
За поиск и сопряжение отвечает BlueZ, за звук — PipeWire, а за маршрутизацию устройств — WirePlumber. Старый PulseAudio в современных дистрибутивах обычно заменён на pipewire-pulse, поэтому команды pactl продолжают работать, но фактическим микшированием занимается PipeWire. Проверить стек лучше до того, как менять конфиги.
pactl info
wpctl status
bluetoothctl --version
systemctl status bluetooth --no-pager
В выводе pactl info строка Server Name должна содержать PipeWire. Если там PulseAudio, настройки из этой статьи могут отличаться: сначала обновите дистрибутив или переключитесь на PipeWire. WirePlumber версии 0.5 и новее использует конфиги в формате SPA-JSON, а 0.4 — Lua; способ проверки показан ниже.
Сопряжение и проверка
Графическая панель удобна, но bluetoothctl даёт понятный лог и позволяет довести устройство до состояния «доверенное». Именно trust избавляет от повторных запросов и помогает автоподключению.
bluetoothctl
power on
agent on
default-agent
scan on
pair AA:BB:CC:DD:EE:FF
trust AA:BB:CC:DD:EE:FF
connect AA:BB:CC:DD:EE:FF
После подключения проверьте, что устройство видно как аудиокарта, а не только как Bluetooth-адаптер. Команда pactl list cards short показывает имя карты вида bluez_card.AA_BB_CC_DD_EE_FF; именно его используют для переключения профиля.
bluetoothctl info AA:BB:CC:DD:EE:FF
pactl list cards short
pactl list sinks short
wpctl status
Профили: A2DP против HFP
A2DP передаёт стереозвук и используется для музыки. HFP и HSP включаются, когда приложению нужен микрофон: гарнитура переходит в режим связи, звук становится монофоническим и низкокачественным. Это не баг Linux, а ограничение самого профиля. Переключение можно делать вручную, если приложение не должно захватывать микрофон.
pactl set-card-profile bluez_card.AA_BB_CC_DD_EE_FF a2dp-sink
pactl set-card-profile bluez_card.AA_BB_CC_DD_EE_FF headset-head-unit
pactl set-default-sink bluez_output.AA_BB_CC_DD_EE_FF.1
Имена профилей и sink зависят от модели и версии стека. Посмотрите доступные варианты в pactl list cards: там будут a2dp-sink, headset-head-unit, а иногда дополнительные режимы с кодеками. Если после переключения звук пропал, верните a2dp-sink и проверьте, что выбрано правильное устройство вывода по умолчанию.
Кодеки и их включение
Обязательный минимум — SBC, он работает всегда. AAC, aptX, aptX HD и LDAC дают лучшее качество при достаточной полосе, но их поддержка зависит от сборки дистрибутива и самой гарнитуры. Проверить фактический кодек можно через свойства узла PipeWire.
pw-dump | grep -i "bluez5.codec"
pw-cli ls Node | grep -i bluez
wireplumber --version
Чтобы разрешить конкретные кодеки, создайте файл в каталоге WirePlumber. Для версии 0.5 и новее подойдёт формат ниже; для 0.4 используется Lua-файл с другим синтаксисом. После правки перезапустите службу пользователя и переподключите наушники.
mkdir -p ~/.config/wireplumber/wireplumber.conf.d
cat > ~/.config/wireplumber/wireplumber.conf.d/51-bluez.conf <<'EOF'
monitor.bluez.properties = {
bluez5.enable-sbc-xq = true
bluez5.enable-msbc = true
bluez5.enable-hw-volume = true
bluez5.codecs = [ sbc sbc_xq aac aptx aptx_hd ldac ]
}
EOF
systemctl --user restart wireplumber
Для WirePlumber 0.4 файл ~/.config/wireplumber/main.lua.d/51-bluez.lua выглядит иначе: свойства задаются таблицей bluez_monitor.properties, а список кодеков передаётся строкой. Не смешивайте два формата: лишний файл старого образца может быть проигнорирован или вызвать ошибку.
bluez_monitor.properties = {
["bluez5.enable-sbc-xq"] = true,
["bluez5.enable-msbc"] = true,
["bluez5.codecs"] = "[ sbc sbc_xq aac aptx ldac ]",
}
Не все кодеки доступны в каждом дистрибутиве: aptX и LDAC зависят от наличия соответствующих библиотек, а AAC — от сборки энкодера. Если после перезапуска в pw-dump остался только SBC, значит, выбранный кодек не поддерживается гарнитурой или пакетом. Это нормально: SBC с включённым SBC-XQ часто звучит достойно.
Задержка: что реально влияет
У A2DP задержка обычно составляет от 100 до 300 мс, у LDAC в режиме высокого качества может быть больше. HFP с mSBC даёт меньшую задержку, но моно и с более узкой полосой. Настройка кванта PipeWire влияет на буфер приложения, но не отменяет буферизацию кодека, поэтому ждать от неё чудес не стоит.
pw-top
pw-metadata -n settings 0 clock.force-quantum 256
pw-metadata -n settings 0 clock.force-quantum 0
В pw-top смотрите колонки QUANT, ERR и WAIT: рост ERR означает нехватку времени на обработку, а не проблему Bluetooth. Для видео задержку проще компенсировать в плеере: mpv и VLC позволяют сдвинуть звук на доли секунды. Для видеозвонков важнее стабильность, поэтому выбирайте кодек с меньшей задержкой и держите адаптер рядом с наушниками.
Микрофон и типичные проблемы
Если приложение открыло микрофон, карта переключилась на headset-head-unit, и музыка стала хуже — это ожидаемо. Варианты: использовать отдельный USB-микрофон, закрыть приложение с захватом звука или принудительно вернуть A2DP, если микрофон не нужен. Для гарнитуры с шумоподавлением полезно проверить, не включает ли она собственный режим связи.
- Устройство не видно: проверьте rfkill list bluetooth, питание адаптера и dmesg | grep -i btusb.
- Сопряжение есть, звука нет: проверьте профиль карты и sink по умолчанию.
- Хрипит и прерывается: уберите USB 3.0-устройства от адаптера, сократите расстояние, попробуйте SBC.
- Не подключается автоматически: выполните trust для MAC и переподключите устройство.
- Тихий звук: проверьте громкость самой гарнитуры и параметр bluez5.enable-hw-volume.
rfkill list bluetooth
dmesg | grep -i -E "bluetooth|btusb"
journalctl -u bluetooth -n 50 --no-pager
bluetoothctl remove AA:BB:CC:DD:EE:FF
Команда remove удаляет сопряжение; после неё устройство нужно спарить заново. Если ошибки повторяются, проверьте версию прошивки адаптера и свободные каналы Wi-Fi: Bluetooth и 2,4 ГГц делят эфир, поэтому перенос роутера или смена канала иногда помогает лучше, чем правка конфигов.
Итог
Bluetooth-звук в Linux настраивается через понятную цепочку: BlueZ сопрягает, PipeWire микширует, WirePlumber выбирает профиль и кодек. Для музыки держите A2DP и подходящий кодек, для разговоров допускайте HFP с mSBC, а для видео компенсируйте задержку в плеере. Проверяйте факты через pactl, pw-dump и pw-top, не меняйте конфиги вслепую и помните, что поддержка кодека зависит от гарнитуры и сборки дистрибутива. Этого достаточно, чтобы звук был предсказуемым, а не лотереей при каждом подключении.