Aquí Linux gana, y por mucho. En Windows el sistema no te dice qué códec Bluetooth está usando y tampoco te permite elegirlo: negocia con los auriculares por su cuenta y te quedas con lo que salga. En Linux, con PipeWire, lo ves con un comando y lo cambias con otro.
Además, la lista de códecs es bastante más extensa que la de Windows: aquí disponemos de LDAC, aptX, aptX HD, AAC, LC3, Opus y SBC-XQ, que en Windows no existen o requieren un pago aparte.
Todo lo que aparece a continuación ha sido probado en PipeWire 1.6 con BlueZ 5.87. Si tu distribución todavía utiliza PulseAudio, los comandos son otros; aunque a estas alturas casi todas las distribuciones grandes ya usan PipeWire.
Ver qué códec estás usando ahora mismo
Con los auriculares conectados y reproduciendo algo, basta con un solo comando:
pactl list sinks | grep -e "Name:" -e "api.bluez5.codec"
Entre las salidas de audio verás la de tus auriculares y, justo debajo, la línea que buscas:
Name: bluez_output.98_80_BB_41_CF_2D.1
api.bluez5.codec = "ldac"
Eso es todo. api.bluez5.codec es la propiedad que PipeWire rellena con el códec que se ha negociado de verdad, no con el que te gustaría tener.
bluetoothctl devices Connected y que el perfil sea de audio y no el de manos libres, que va aparte y se explica más abajo.Los otros dos comandos que conviene conocer
Para verlo todo del dispositivo, incluida la ruta, el perfil y la latencia:
pactl list cards | grep -A40 bluez_card
Y para una vista rápida de qué hay conectado, con los identificadores que utilizan los demás comandos:
wpctl status
wpctl es la herramienta de WirePlumber, el gestor de sesión que se integra sobre PipeWire en casi todas las distribuciones actuales. Sirve para consultar el estado y ajustar volúmenes, pero para el códec hay que ir por pactl: wpctl no lo muestra.
Qué códecs trae tu sistema (y por qué te falta LDAC)
PipeWire no integra los códecs internamente: cada uno es un módulo suelto y tu distribución decide cuáles compila. Por este motivo, hay usuarios que no ven el LDAC por ninguna parte aunque sus auriculares sean compatibles.
Para ver los que tienes:
ls /usr/lib/spa-0.2/bluez5/
En un sistema completo la respuesta es algo así:
libspa-bluez5.so libspa-codec-bluez5-lc3.so
libspa-codec-bluez5-aac.so libspa-codec-bluez5-ldac.so
libspa-codec-bluez5-aptx.so libspa-codec-bluez5-opus.so
libspa-codec-bluez5-faststream.so libspa-codec-bluez5-sbc.so
libspa-codec-bluez5-g722.so libspa-codec-bluez5-hfp-msbc.so
Cada libspa-codec-bluez5-XXX.so representa un códec disponible. Si el fichero no está, ese códec no existe para ti, por muy compatibles que sean tus auriculares.
/usr/lib/x86_64-linux-gnu/spa-0.2/bluez5/, mientras que en Fedora y openSUSE se encuentra en /usr/lib64/spa-0.2/bluez5/. Si el comando ls anterior te indica que el directorio no existe, prueba con find /usr/lib* -name 'libspa-codec-bluez5-*'.Qué instalar si te falta alguno
Los que suelen faltar son precisamente los más interesantes, y siempre por la misma razón: las licencias. LDAC pertenece a Sony y aptX a Qualcomm, así que algunas distribuciones no los compilan por defecto.
- Arch y derivadas — vienen todos de serie en el paquete
pipewire. El módulolibldaces una dependencia, no hay nada que hacer. - Debian y Ubuntu — instala
libldacbt-abr2ylibldacbt-enc2para LDAC, ylibfreeaptx0para aptX. Después hay que reiniciar PipeWire, que no los recoge en caliente:systemctl --user restart pipewire pipewire-pulse wireplumber. - Fedora — LDAC y aptX vienen en los paquetes de PipeWire de los repositorios oficiales desde hace ya varias versiones.
Un detalle que despista: aptX en Linux se implementa con libfreeaptx, que es una reimplementación libre, y no con la biblioteca de Qualcomm. Funciona y es compatible, pero por eso el paquete no tiene un nombre parecido a «aptx».
Cambiar el códec, que es lo que Windows no deja
Existen dos formas de hacerlo y sirven para propósitos diferentes: una cambia el códec ahora y se pierde al desconectar, mientras que la otra fija tu preferencia para siempre.
En caliente, con pactl
PipeWire expone un perfil de tarjeta por cada códec que sea compatible con ambos dispositivos. Primero mira cuáles tienes disponibles:
pactl list cards | grep -E "Name: bluez_card|a2dp-sink"
Obtendrás un resultado similar a este, donde el nombre del perfil aparece a la izquierda y su descripción a la derecha:
Name: bluez_card.98_80_BB_41_CF_2D
a2dp-sink-sbc: High Fidelity Playback (A2DP Sink, codec SBC)
a2dp-sink-sbc_xq: High Fidelity Playback (A2DP Sink, codec SBC-XQ)
a2dp-sink-aac: High Fidelity Playback (A2DP Sink, codec AAC)
a2dp-sink-ldac: High Fidelity Playback (A2DP Sink, codec LDAC)
Y ahora se elige el que quieras, usando el nombre de la tarjeta y el del perfil:
pactl set-card-profile bluez_card.98_80_BB_41_CF_2D a2dp-sink-ldac
El cambio es inmediato: el audio se corta medio segundo y vuelve ya con el códec nuevo. Compruébalo con el comando del primer apartado.
a2dp-sink-ldac no figura en esa lista, o falta el módulo del sistema (mira el apartado anterior) o tus auriculares no llevan LDAC, aunque así lo indique la caja. Es la forma más rápida de salir de dudas con las especificaciones dudosas de los auriculares baratos.Para siempre, con la configuración de WirePlumber
Lo anterior se pierde al desconectar. Para dejar tu preferencia fijada, se le indica a WirePlumber qué códecs puede usar y, al recortar la lista, se fuerza el resultado.
Crea el fichero ~/.config/wireplumber/wireplumber.conf.d/50-bluez.conf con esto:
monitor.bluez.properties = {
bluez5.codecs = [ ldac aac sbc_xq sbc ]
}
El orden importa: PipeWire negocia de izquierda a derecha y elige el primero que los auriculares acepten. Si dejas solo [ ldac ], o utiliza LDAC o no conecta en A2DP.
Los nombres válidos son sbc, sbc_xq, aac, aptx, aptx_hd, aptx_ll, aptx_ll_duplex, ldac, lc3, opus_05, faststream y algunas variantes más. Después, hay que reiniciar:
systemctl --user restart wireplumber
La calidad de LDAC, que también se elige
LDAC dispone de tres modos y, por defecto, funciona en automático, ajustando el bitrate según la calidad del enlace. Se puede fijar en el mismo fichero:
monitor.bluez.properties = {
bluez5.codecs = [ ldac ]
bluez5.a2dp.ldac.quality = "hq"
}
Los valores disponibles son hq (990 kbps), sq (660), mq (330) y auto, que es el valor de fábrica. Aviso realista: forzar hq en un lugar con mucho wifi alrededor no mejora el sonido, sino que provoca cortes. Si el audio da saltos, este es el primer sitio donde mirar.
SBC-XQ, el truco que solo tienes aquí
Esto merece un apartado propio porque es la mejora más grande que puedes conseguir gratis, y en Windows sencillamente no existe.
El sonido de SBC tiene mala fama, pero el problema nunca ha sido el códec, sino la configuración conservadora de casi todos los dispositivos, que lo limitan a unos 328 kbps. SBC admite bastante más. Si se sube el bitpool, alcanza los 452 kbps y la diferencia se nota.
A eso se le llama SBC-XQ, y presenta una ventaja enorme sobre LDAC o aptX: no es un códec nuevo, es SBC. Por lo tanto, funciona con cualquier auricular Bluetooth del mundo, sin necesidad de licencias, sin módulos y sin que el fabricante haya tenido que pagar nada.
Para activarlo:
monitor.bluez.properties = {
bluez5.enable-sbc-xq = true
bluez5.codecs = [ sbc_xq sbc ]
}
Reinicia WirePlumber. Si al reconectar api.bluez5.codec indica sbc_xq, ya está.
[ sbc ] y listo; no se rompe nada, pero conviene probarlo con música que conozcas antes de darlo por bueno.Entonces, ¿qué códec pongo?
Con el hardware normal y en un entorno con wifi alrededor, el orden que funciona es el siguiente:
- LDAC en
auto, si tus auriculares lo tienen. Es el techo de calidad y el automático ya se encarga de bajar cuando el enlace va justo. - aptX HD o aptX, si no hay LDAC. Menos bitrate, pero muy estable y con menos latencia, que se agradece con vídeo.
- SBC-XQ, que puede ganarle a aptX y sirve con cualquier cosa.
- AAC solo si es lo único, porque el codificador de Linux no es el de Apple y a bajo bitrate se le nota.
Para evitar discusiones: en unos auriculares de 60 euros no vas a oír la diferencia entre LDAC y SBC-XQ. Donde sí se nota es a partir de SBC estándar y en la latencia. La comparativa de códecs lo desglosa entero.
El micrófono y la caída a mono
Este problema ocurre en todos los sistemas y es lo que realmente arruina la calidad del sonido: el Bluetooth clásico no puede transmitir audio estéreo de calidad y micrófono simultáneamente.
- A2DP es estéreo y de buena calidad, pero solo va del ordenador a los auriculares.
- HFP lleva el micrófono, pero es mono y a 8 o 16 kHz. Ahí no hay LDAC que valga: suena a llamada telefónica.
En cuanto abres una videollamada, WirePlumber cambia el perfil automáticamente y el audio se cae. No es un fallo, sino un comportamiento deliberado, y en Linux se puede desactivar, algo que Windows no permite.
Que no cambie solo
En ~/.config/wireplumber/wireplumber.conf.d/50-bluez.conf:
wireplumber.settings = {
bluetooth.autoswitch-to-headset-profile = false
}
De este modo, el sistema se mantiene en A2DP pase lo que pase. El micrófono de los auriculares deja de funcionar —tendrás que usar el del portátil o uno externo— pero la música ya no se degrada nunca. Para quien escucha más de lo que habla, es la mejor decisión.
Si necesitas el micrófono, al menos que sea el bueno
Cuando toque usar HFP, que sea en banda ancha: mSBC a 16 kHz en lugar de los 8 kHz de la banda estrecha. Se activa de esta forma, y en la mayoría de distribuciones ya viene activado:
monitor.bluez.properties = {
bluez5.enable-msbc = true
}
Y hay una opción todavía mejor si tu hardware lo permite: los módulos hfp-lc3-swb que aparecían en la lista del segundo apartado son LC3 en banda superancha, y ofrecen bastante más calidad de voz que mSBC. Si están presentes y los auriculares lo soportan, PipeWire lo usa solo.
LE Audio
La solución definitiva al problema del micrófono es Bluetooth LE Audio, que permite transmitir estéreo y voz simultáneamente mediante el códec LC3. En Linux, esta función está disponible si utilizas PipeWire 1.0 o superior con BlueZ 5.72 o superior, y se muestra a través de los perfiles bap-sink, bap-source y bap-duplex en vez de los a2dp-.
Sigue siendo la parte más verde del asunto: depende del adaptador Bluetooth, de que el firmware lo soporte y de que los auriculares también. Pero cuando funciona, se acabó el drama del mono.











