0
0

Linux 常见问题

2026-05-09
2026-07-23

Ubuntu 蓝牙耳机连接成功但没有声音:排查与解决笔记

一、这次问题的现象

Ubuntu 里蓝牙耳机显示已经连接,例如 bluetoothctl info 里能看到:

Connected: yes

但是系统声音设置里没有出现耳机名字,pactl list short sinks 里也没有蓝牙耳机输出,只看到内置声卡或 HDMI 声卡:

alsa_output.pci-0000_00_1f.3.analog-stereo
alsa_output.pci-0000_2d_00.1.hdmi-stereo-extra1

正常情况下,蓝牙耳机作为音频输出设备时,应该能看到类似:

bluez_card.08_12_87_CC_8A_FC
bluez_sink.08_12_87_CC_8A_FC.a2dp_sink

其中:

bluez_card

表示蓝牙耳机已经被系统识别成一张“声卡”。

bluez_sink

表示蓝牙耳机已经生成了“声音输出口”,系统可以把声音送到这里。


二、核心因果:为什么蓝牙连上了但没声音

Linux 桌面音频大致有两层:

第一层是蓝牙连接层,由 bluetoothd / BlueZ 管理。它负责发现、配对、连接蓝牙设备。只要 bluetoothctl info 里看到 Connected: yes,说明蓝牙连接层基本是通的。

第二层是音频服务层,Ubuntu 20.04 常见是 PulseAudio。它负责把蓝牙耳机注册成声音设备,并生成 bluez_cardbluez_sink。只有生成 bluez_sink 后,系统声音设置里才会出现耳机,声音才能输出到耳机。

这次问题是:蓝牙连接层成功了,但音频服务层没有正常接管耳机。原因是系统里异常存在一个 root 用户启动的 PulseAudio:

root 2592 pulseaudio --start --log-target=syslog

PulseAudio 正常应该主要运行在当前桌面用户下面,例如:

madm ... pulseaudio --start

如果 root 用户下面也跑了一个 PulseAudio,它可能会抢占 BlueZ 的蓝牙音频端点,导致当前用户的 PulseAudio 无法把耳机注册成自己的声音设备。结果就是:蓝牙显示已连接,但 pactl 里没有 bluez_card / bluez_sink,声音设置也没有耳机。


三、相关概念快速解释

bluetoothctl:蓝牙命令行工具,用来扫描、配对、信任、连接蓝牙设备。

bluetoothd:Linux 的蓝牙后台服务,属于 BlueZ。它负责蓝牙设备管理。

BlueZ:Linux 官方蓝牙协议栈,可以理解为 Linux 管蓝牙的核心组件。

PulseAudio:Ubuntu 20.04 常用的用户态音频服务器。它负责管理声卡、音量、输入输出设备、应用声音流。

pactl:PulseAudio 的命令行控制工具。可以查看声卡、输出设备、切换默认输出等。

card:声卡设备。蓝牙耳机被识别后会出现 bluez_card.xxx

sink:声音输出口。比如内置扬声器、HDMI、蓝牙耳机都可以是 sink。真正播放声音时,应用的声音会被送到某个 sink。

A2DP Sink:蓝牙高质量音乐播放模式。听歌、看视频一般要用这个。

HSP/HFP:蓝牙通话耳麦模式,主要用于麦克风通话,音质差,容易没声音或声音很糊。


四、标准排查流程

1. 先看蓝牙耳机是否连接成功

bluetoothctl info 08:12:87:CC:8A:FC

说明:

bluetoothctl

是蓝牙控制工具。

info 08:12:87:CC:8A:FC

查看这个 MAC 地址对应蓝牙设备的详细状态。08:12:87:CC:8A:FC 是这次 OPPO Enco Air4 Pro 的设备地址。

重点看:

Connected: yes

如果是 Connected: yes,说明蓝牙连接层成功。

如果是 Connected: no,说明耳机还没真正连上,后面的音频排查先不用做。


2. 查看 PulseAudio 有没有识别蓝牙耳机

pactl list short cards

说明:查看 PulseAudio 当前识别到的“声卡”。

正常应该有:

bluez_card.08_12_87_CC_8A_FC

再看输出设备:

pactl list short sinks

说明:查看 PulseAudio 当前可用的“声音输出口”。

正常应该有:

bluez_sink.08_12_87_CC_8A_FC.a2dp_sink

如果 bluetoothctl 显示 Connected: yes,但 pactl list short cards 里没有 bluez_card,说明问题在音频服务层,不是蓝牙配对层。


3. 查看当前 PulseAudio 是不是正常用户启动的

ps -ef | grep -E 'pulseaudio|bluetoothd' | grep -v grep

说明:

ps -ef

列出当前系统进程。

grep -E 'pulseaudio|bluetoothd'

筛选出 PulseAudio 和蓝牙服务相关进程。

grep -v grep

把 grep 命令本身从结果里过滤掉。

正常情况可以有当前用户的 PulseAudio:

madm ... pulseaudio --start

也可能有登录界面的 gdm PulseAudio:

gdm ... pulseaudio

但如果看到这个就很可疑:

root ... pulseaudio --start

因为 root 用户不应该长期跑一个 PulseAudio 来管理桌面音频。它可能会抢占蓝牙音频端点。


五、这次真正有效的修复方法

1. 杀掉 root 用户下异常的 PulseAudio

sudo pkill -u root -x pulseaudio

说明:

sudo

用管理员权限执行命令。

pkill

按进程名杀进程。

-u root

只杀 root 用户下面的进程,避免误杀当前用户自己的程序。

-x pulseaudio

精确匹配进程名为 pulseaudio 的进程。

注意:不要拼错。正确是:

pulseaudio

不是:

pluseaudio

如果杀不掉,可以按 PID 杀,例如这次 root 的 PulseAudio PID 是 2592

sudo kill -9 2592

说明:

kill -9

强制结束指定 PID 的进程。一般先用 pkill,不行再用 kill -9


2. 确认 root PulseAudio 已经消失

ps -ef | grep -E 'pulseaudio|bluetoothd' | grep -v grep

确认结果里不要再有:

root ... pulseaudio --start

如果只剩:

gdm ... pulseaudio
madm ... pulseaudio
root ... bluetoothd

就比较正常。


3. 重启当前用户的 PulseAudio

pulseaudio -k

说明:杀掉当前用户自己的 PulseAudio。它一般会自动重启。

如果提示:

杀死守护进程失败:没有那个进程

不一定是坏事,意思是当前没有正在运行的用户 PulseAudio。

然后手动启动:

pulseaudio --start

说明:启动当前用户自己的 PulseAudio。


4. 重启蓝牙服务

sudo systemctl restart bluetooth

说明:重启系统蓝牙服务 bluetoothd,让蓝牙状态重新刷新。


5. 重新连接耳机

bluetoothctl connect 08:12:87:CC:8A:FC

说明:连接 OPPO 蓝牙耳机。

等待几秒后检查:

bluetoothctl info 08:12:87:CC:8A:FC

重点确认:

Connected: yes

6. 检查蓝牙声卡是否出现

pactl list short cards

如果修复成功,会出现:

bluez_card.08_12_87_CC_8A_FC

这说明 PulseAudio 已经把耳机识别成蓝牙声卡。


7. 切换到 A2DP 高质量播放模式

pactl set-card-profile bluez_card.08_12_87_CC_8A_FC a2dp_sink

说明:

set-card-profile

设置声卡的工作模式。

bluez_card.08_12_87_CC_8A_FC

蓝牙耳机声卡名。

a2dp_sink

高质量蓝牙音频输出模式,适合听音乐、看视频。


8. 设置蓝牙耳机为默认输出

先查看输出设备:

pactl list short sinks

如果看到:

bluez_sink.08_12_87_CC_8A_FC.a2dp_sink

就执行:

pactl set-default-sink bluez_sink.08_12_87_CC_8A_FC.a2dp_sink

说明:把蓝牙耳机设置为默认声音输出设备。


9. 测试声音

paplay /usr/share/sounds/alsa/Front_Center.wav

说明:

paplay

用 PulseAudio 播放一个测试音频。

如果耳机有声音,说明修复成功。


六、以后遇到同样问题,优先执行的简化版流程

如果以后蓝牙耳机连接了但没声音,先不要重装系统,也不要一直插拔适配器。按这个顺序排查:

bluetoothctl info 08:12:87:CC:8A:FC

看是否 Connected: yes

pactl list short cards
pactl list short sinks

看是否有 bluez_cardbluez_sink

ps -ef | grep -E 'pulseaudio|bluetoothd' | grep -v grep

看是否有异常的:

root ... pulseaudio

如果有 root 的 PulseAudio,执行:

sudo pkill -u root -x pulseaudio

然后:

pulseaudio -k
pulseaudio --start
sudo systemctl restart bluetooth
bluetoothctl connect 08:12:87:CC:8A:FC

再查:

pactl list short cards
pactl list short sinks

如果出现 bluez_card,执行:

pactl set-card-profile bluez_card.08_12_87_CC_8A_FC a2dp_sink
pactl set-default-sink bluez_sink.08_12_87_CC_8A_FC.a2dp_sink

七、判断问题属于哪一层

情况 1:bluetoothctl info 里是 Connected: no

说明蓝牙连接本身没成功。优先重新连接、重新配对、让耳机进入配对模式。

情况 2:Connected: yes,但没有 bluez_card

说明蓝牙连接成功,但 PulseAudio 没有接管蓝牙音频。重点查 PulseAudio、root PulseAudio、PipeWire 冲突、蓝牙音频模块。

情况 3:有 bluez_card,但没有 bluez_sink

说明耳机被识别成声卡了,但还没有切到正确音频 profile。执行:

pactl set-card-profile bluez_card.08_12_87_CC_8A_FC a2dp_sink

情况 4:有 bluez_sink,但还是没声音

说明输出设备可能没设成默认,或者当前应用声音流还在内置声卡上。执行:

pactl set-default-sink bluez_sink.08_12_87_CC_8A_FC.a2dp_sink

也可以打开:

pavucontrol

Playback 里把浏览器、播放器的输出切到蓝牙耳机。


八、这次问题的一句话总结

这次不是蓝牙耳机没连上,而是系统里异常存在 root 用户的 PulseAudio,导致蓝牙音频端点被抢占。当前用户的 PulseAudio 无法生成 bluez_card / bluez_sink,所以声音设置里没有耳机。杀掉 root PulseAudio 后,重新启动当前用户 PulseAudio 和蓝牙服务,再连接耳机,蓝牙声卡出现,切到 a2dp_sink 后恢复声音。