1. 设备与环境准备
我最近在Jetson AGX Orin开发板上折腾蓝牙音频设备连接,系统是Ubuntu 20.04,蓝牙版本5.0。要连接的是一副CW3蓝牙耳机,支持蓝牙5.3。虽然蓝牙版本不一致(耳机5.3 vs 开发板5.0),但实际测试下来完全兼容,这点大家可以放心。
开发板到手后我发现一个坑:NVIDIA默认禁用了蓝牙音频功能。这导致直接连接蓝牙耳机时,系统根本识别不到音频设备。经过一番摸索,发现需要修改系统配置才能启用这个功能。另外,Ubuntu 20.04默认的PulseAudio音频服务有个致命缺陷——无法同时支持蓝牙耳机的输入和输出,必须替换为PipeWire才能完美解决。
2. 启用NVIDIA默认禁用的蓝牙音频
2.1 修改蓝牙服务配置
首先需要修改蓝牙服务的配置文件:
bash复制sudo nano /lib/systemd/system/bluetooth.service.d/nv-bluetooth-service.conf
找到这行配置:
bash复制ExecStart=/usr/lib/bluetooth/bluetoothd -d --noplugin=audio,a2dp,avrcp
修改为:
bash复制ExecStart=/usr/lib/bluetooth/bluetoothd -d
这个修改移除了--noplugin参数,它原本禁用了audio、a2dp和avrcp这几个关键插件,正是这些插件负责蓝牙音频功能。
注意:修改系统服务配置文件前建议先备份原文件,以防出现问题可以快速恢复。
2.2 安装必要组件
接着更新软件源并安装PulseAudio的蓝牙模块:
bash复制sudo apt-get update
sudo apt-get install pulseaudio-module-bluetooth
这个模块让PulseAudio能够支持蓝牙音频设备。安装完成后需要重启系统:
bash复制sudo reboot
重启后,你应该能够配对和连接蓝牙耳机了。但这时候只能使用耳机的扬声器功能,麦克风还是无法工作。
3. 替换PulseAudio为PipeWire
3.1 为什么需要PipeWire
Ubuntu 20.04默认使用PulseAudio作为音频服务器,但它有个严重限制:无法同时支持蓝牙设备的输入和输出。这就是为什么我们只能使用耳机的扬声器,而麦克风无法工作的原因。
PipeWire是一个新一代的多媒体框架,设计之初就考虑了对蓝牙音频的完整支持。它不仅能解决输入输出的问题,还提供了更低的延迟和更好的资源管理。
3.2 安装PipeWire
首先添加PipeWire的PPA源:
bash复制sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream
sudo add-apt-repository ppa:pipewire-debian/wireplumber-upstream
sudo apt update
然后安装PipeWire主程序:
bash复制sudo apt install pipewire
安装完成后,重新加载系统守护进程:
bash复制systemctl --user daemon-reload
启动PipeWire服务并设置开机自启:
bash复制systemctl --user --now enable pipewire
检查服务状态确保正常运行:
bash复制systemctl status --user pipewire pipewire-session-manager --no-pager -l
3.3 安装额外组件
为了让蓝牙音频工作得更好,还需要安装一些额外组件:
bash复制sudo apt install libldacbt-{abr,enc}2 libspa-0.2-bluetooth pipewire-audio-client-libraries libspa-0.2-jack
这些包提供了对LDAC编解码器、蓝牙SPA插件等功能的支持。
3.4 禁用PulseAudio
现在可以安全地禁用PulseAudio了:
bash复制systemctl --user --now disable pulseaudio.{socket,service}
systemctl --user mask pulseaudio
这个操作会停止PulseAudio服务并防止它自动启动。
4. 配置音频系统
4.1 复制配置文件
将PipeWire的默认配置文件复制到系统目录:
bash复制sudo cp -vRa /usr/share/pipewire /etc/
sudo cp /usr/share/doc/pipewire/examples/alsa.conf.d/99-pipewire-default.conf /etc/alsa/conf.d/
移除之前安装的PulseAudio蓝牙模块:
bash复制sudo apt remove pulseaudio-module-bluetooth
配置Jack音频连接:
bash复制sudo cp /usr/share/doc/pipewire/examples/ld.so.conf.d/pipewire-jack-*.conf /etc/ld.so.conf.d/
4.2 重启系统
完成上述配置后,需要重启系统使所有更改生效:
bash复制reboot
5. 验证配置
重启后,执行以下命令检查PipeWire是否正常工作:
bash复制pactl info
如果看到类似这样的输出,说明配置成功:
code复制Server Name: PulseAudio (on PipeWire x.x.x)
这表示PipeWire现在正在模拟PulseAudio接口,保证了与原有应用程序的兼容性。
6. 连接蓝牙耳机
6.1 配对设备
在系统设置中打开蓝牙,按照常规流程配对你的蓝牙耳机。配对成功后,进入声音设置,你应该能看到蓝牙耳机同时出现在输入和输出设备列表中。
6.2 常见问题排查
如果遇到问题,可以尝试以下步骤:
-
检查蓝牙服务状态:
bash复制
systemctl status bluetooth -
查看PipeWire日志:
bash复制
journalctl --user -u pipewire -f -
重新加载PipeWire:
bash复制
systemctl --user restart pipewire -
确保没有PulseAudio进程残留:
bash复制
killall pulseaudio
7. 性能优化建议
经过实际使用,我发现以下几个优化点值得分享:
-
延迟问题:如果觉得音频延迟明显,可以尝试修改PipeWire配置:
bash复制sudo nano /etc/pipewire/pipewire.conf找到
default.clock.rate = 48000这一行,尝试调整为44100可能对某些设备更友好。 -
音质优化:安装支持更多编解码器的组件:
bash复制sudo apt install libspa-0.2-ffmpeg -
电池消耗:如果使用蓝牙耳机时发现电池消耗过快,可以尝试降低比特率:
bash复制sudo nano /etc/pipewire/media-session.d/bluez-monitor.conf修改
bluez5.a2dp.ldac.quality等参数为更保守的值。
8. 实际使用体验
经过这一系列配置后,我的CW3蓝牙耳机在Jetson AGX Orin上工作得非常完美。不仅能够同时使用麦克风和扬声器,音质也比之前使用PulseAudio时有了明显提升。特别是在进行视频会议时,双向音频传输稳定,延迟也在可接受范围内。
一个特别实用的发现是,PipeWire对蓝牙设备的切换处理更加智能。当我在不同设备间切换时,音频路由会自动调整,不再需要手动重新选择输出设备。