Aquí Linux gana, y no por poco. En Windows el sistema no te dice qué códec Bluetooth está usando y tampoco te deja 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 larga que la de Windows: aquí están LDAC, aptX, aptX HD, AAC, LC3, Opus y SBC-XQ, que en Windows no existen o hay que pagarlos aparte.
Todo lo que hay abajo está probado en PipeWire 1.6 con BlueZ 5.87. Si tu distribución todavía va con PulseAudio, los comandos son otros; a estas alturas casi todas las distribuciones grandes usan ya PipeWire.
Ver qué códec estás usando ahora mismo
Con los auriculares conectados y reproduciendo algo, un solo comando:
pactl list sinks | grep -e "Name:" -e "api.bluez5.codec"
Entre las salidas de audio aparecerá 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 usan el resto de comandos:
wpctl status
wpctl es la herramienta de WirePlumber, que es el gestor de sesión que va montado sobre PipeWire en casi todas las distribuciones actuales. Sirve para ver el estado y mover 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 lleva los códecs dentro: cada uno es un módulo suelto, y tu distribución decide cuáles compila. Por eso hay gente que no ve LDAC por ninguna parte aunque sus auriculares lo tengan.
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 es un códec disponible. Si no está el fichero, ese códec no existe para ti, por muy compatibles que sean tus auriculares.
/usr/lib/x86_64-linux-gnu/spa-0.2/bluez5/, y en Fedora y openSUSE en /usr/lib64/spa-0.2/bluez5/. Si el ls de arriba te dice que no existe el directorio, prueba con find /usr/lib* -name 'libspa-codec-bluez5-*'.Qué instalar si te falta alguno
Los que suelen faltar son justo los interesantes, y siempre por lo mismo: licencias. LDAC es de Sony y aptX de 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, una reimplementación libre, no con la biblioteca de Qualcomm. Funciona y es compatible, pero por eso el paquete no se llama nada parecido a «aptx».
Cambiar el códec, que es lo que Windows no deja
Hay dos formas y sirven para cosas distintas: una cambia el códec ahora y se pierde al desconectar, y la otra fija tu preferencia para siempre.
En caliente, con pactl
PipeWire expone un perfil de tarjeta por cada códec que los dos lados soporten. Primero mira cuáles tienes:
pactl list cards | grep -E "Name: bluez_card|a2dp-sink"
Verás algo así, con el nombre del perfil 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, con 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 está en esa lista, o te falta el módulo del sistema (mira el apartado anterior) o tus auriculares no llevan LDAC, aunque lo ponga 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 dice a WirePlumber qué códecs puede usar, y al recortar la lista fuerzas 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 se queda con el primero que los auriculares acepten. Si dejas solo [ ldac ], o va por 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, a reiniciar:
systemctl --user restart wireplumber
La calidad de LDAC, que también se elige
LDAC tiene tres modos y por defecto va en automático, ajustando el bitrate según lo limpio que esté el enlace. Se puede clavar en el mismo fichero:
monitor.bluez.properties = {
bluez5.codecs = [ ldac ]
bluez5.a2dp.ldac.quality = "hq"
}
Los valores son hq (990 kbps), sq (660), mq (330) y auto, que es el de fábrica. Aviso realista: forzar hq en un sitio con mucho wifi alrededor no da mejor sonido, da cortes. Si te salta el audio, ese es el primer sitio donde mirar.
SBC-XQ, el truco que solo tienes aquí
Este merece apartado propio porque es la mejora más grande que puedes conseguir gratis, y en Windows sencillamente no existe.
SBC tiene mala fama por su sonido, pero el problema nunca fue el códec: fue la configuración conservadora que traen casi todos los dispositivos, que lo dejan en unos 328 kbps. SBC admite bastante más. Subiéndole el bitpool llega a 452 kbps y la diferencia se oye.
A eso se le llama SBC-XQ, y tiene una ventaja enorme sobre LDAC o aptX: no es un códec nuevo, es SBC. Así que funciona con cualquier auricular Bluetooth del mundo, sin licencias, sin módulos y sin que el fabricante tenga que haber pagado nada.
Para activarlo:
monitor.bluez.properties = {
bluez5.enable-sbc-xq = true
bluez5.codecs = [ sbc_xq sbc ]
}
Y a reiniciar WirePlumber. Si al reconectar api.bluez5.codec dice 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 sitio con wifi alrededor, el orden que funciona:
- 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.
Y una cosa que ahorra discusiones: en unos auriculares de 60 euros no vas a oír la diferencia entre LDAC y SBC-XQ. Donde sí se nota es de SBC estándar hacia arriba, y en la latencia. La comparativa de códecs lo desglosa entero.
El micrófono y la caída a mono
Este problema es igual en todos los sistemas y es el que de verdad estropea el sonido: el Bluetooth clásico no puede llevar estéreo de calidad y micrófono a la vez.
- 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 de perfil automáticamente y el audio se cae. Es un comportamiento deliberado, no un fallo, y en Linux se puede desactivar, que es más de lo que ofrece Windows.
Que no cambie solo
En ~/.config/wireplumber/wireplumber.conf.d/50-bluez.conf:
wireplumber.settings = {
bluetooth.autoswitch-to-headset-profile = false
}
Con eso el sistema se queda 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 aparte— 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 vez de los 8 kHz de la banda estrecha. Se activa así, y en la mayoría de distribuciones ya viene puesto:
monitor.bluez.properties = {
bluez5.enable-msbc = true
}
Y hay algo mejor todavía si tu hardware llega: los módulos hfp-lc3-swb que aparecían en la lista del segundo apartado son LC3 en banda superancha, con 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 de verdad al problema del micrófono es Bluetooth LE Audio, que sí transmite estéreo y voz a la vez con el códec LC3. En Linux lo tienes si estás en PipeWire 1.0 o superior con BlueZ 5.72 o superior, y aparece como perfiles bap-sink, bap-source y bap-duplex en lugar 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.











