You have to force the A2DP profile
Run:
pactl list cards | grep bluez_card
This command will show you your Bluetooth headphones. e.g.:
device.name = "bluez_card.45_0A_D2_79_21_17"
Now run (Replace the number with that of your device):
pactl set-card-profile bluez_card.45_0A_D2_79_21_17 a2dp_sink
Finally, verify the change (play something with sound first):
pactl list sinks short | grep a2dp_sink
10 bluez_sink.45_0A_D2_79_21_17.a2dp_sink module-bluez5-device.c s16le 2ch 44100Hz RUNNING
- s16le → 16-bit, little-endian audio
- 2ch → 2 channels = stereo
- 44100Hz → standard sampling rate (CD)
- RUNNING → Audio is playing (if stopped, SUSPENDED appears)
Update:
In Ubuntu 24.04 (the one I'm using), pactl is no longer installed by default because PulseAudio has been replaced by PipeWire, which now handles audio in many modern distros, including Ubuntu. However, pactl still works because PipeWire includes a compatibility component called pipewire-pulse, which emulates PulseAudio. It doesn't cause any conflicts, as long as you don't try to reinstall PulseAudio as the primary server, as that can break your PipeWire-based audio setup. That's what I did to fix this problem with my Bluetooth headphones.
sudo apt install pulseaudio-utils -y && pactl info | grep pulseaudio
summary:
- pulseaudio-utils contains only user tools like pactl, not the full PulseAudio server.
- If you have pipewire-pulse running, pactl connects to it as if it were PulseAudio.
- This doesn't break PipeWire, as you're only using compatible tools.
PD:
PulseAudio internally may use _ or - in names (a2dp-sink or a2dp_sink). To check:
pactl list sinks short | grep a2dp