树莓派连接蓝牙音箱播放音乐

缘起

去年买手机的时候,送了一个小小的蓝牙音箱,除了刚买手机时连上试了试是否可用(音质渣的没想用),在桌子上吃灰近一年了。

最近终于有一点点时间,想到同样在角落默默吃灰运行(其实并没有吃灰了,运行了n多任务)的树莓派,何不使用树莓派的蓝牙控制这个蓝牙音箱,做个小播放器,以后还可以做一个闹钟(这样再也不能按掉闹钟赖床O(∩_∩)O~)

说干就干,于是有了这次的折腾~

折腾过程

首先说下配置,方便同样想要折腾的朋友:

树莓派: 树莓派sb    
系统:Linux raspberrypi 4.19.46-v7+  
外设情况: 挂载了一个可调速风扇,一个摄像头,一个外置移动硬盘(带电源)  
电源:5V 2A(插座自带的usb扣)

1、配对蓝牙音箱

使用下面的一组命令,就可以配对蓝牙设备了:

bluetoothctl -a   
scan on  
scan off  
devices  

# 其中12:34:56:78:9a:bc是从devices里看到的蓝牙音箱的地址,trust是信任设备方便后续自动连接  

trust 12:34:56:78:9a:bc  
connect 12:34:56:78:9a:bc

通过上面的命令,我们已经成功连接了蓝牙音箱了,接下来我们通过命令自动的链接蓝牙:

#打开crontab增加开机自启命令  crontab -e  

# 按i进入便捷状态,写入下面的命令,其中地址需要自己换下  
@reboot sleep 15 && echo "connect   12:34:56:78:9a:bc" | bluetoothctl  

# 按esc,然后shift加:, 然后wq回车退出

经过上面的命令,已经能够开机自动连接蓝牙了。此处推荐一个自动化的脚本,可以帮我们做这个事情,github地址是https://github.com/bablokb/pi-btaudio.git

1、使用pulseaudio播放

最新的树莓派系统里,已经默认安装了pulseauido相关的软件,我们只需要开启相关的服务,然后就可以播放了。

从网上找了很多的配置,修改后能够播放,但是播放音频卡顿、变声且播放一会儿就没有声音了,或者蓝牙连接断开,反正问题非常多,主要的修改点如下,

1)修改pulse配置

通过以下命令修改pulse的配置文件/etc/pulse/default.pa

sudo vi /etc/pulse/default.pa  
#增加如下两行  
#automatically switch to newly-connected devices  
load-module module-switch-on-connect

其中增加的两行表示,将最后一次链接的设备,作为输出音频设备。

2)启动pulseaudio

通过以下命令启动pulseaudio

pulseaudio --start --high-priority=yes --realtime=yes

然后通过如下命令,进入bluetooth命令,connect一下如果没有自动连接上

bluetoothctl -a  
#连接到蓝牙  
connect 12:34:56:78:9a:bc

通过如上的配置,已经基本可以通过蓝牙音箱播放音乐,但是实测播放非常卡顿,且经常会突然没有声音(见网上的树莓派蓝牙播放没声音,树莓派蓝牙播放卡顿)问题。

至于音乐播放软件,可以拿mpg123随便找一个mp3测试下就好。

2、使用bluealsa进行播放

经过网上n多的搜索,发现除了pulseauio的另一个蓝牙控制软件-bluealsa,经测试播放很流畅,建议大家使用。

1)卸载老的pulseaudio

由于都是蓝牙相关的配置软件,两者并存有问题,我们需要先卸载掉老的,如下命令卸载:

sudo apt remove pulseaudio*

2)安装新的bluealsa

使用如下命令安装bluealsa

sudo apt-get install bluealsa

3)添加pi用户到蓝牙用户组

使用如下命令将pi添加到蓝牙用户组

sudo usermod -aG bluetooth pi  
#需要重启生效  
sudo reboot

4)修改bluealsa配置

使用如下命令修改配置文件/etc/asound.conf

sudo vi /etc/asound.conf

文件内容如下:

pcm.!default {  
      type plug  
      slave.pcm {  
              type bluealsa  
	      interface "hci0"  
              device "12:34:56:78:9a:bc"  
              profile "a2dp"  
      }  
      hint {  
              show on  
              description "BT Speaker"  
      }  
}

编辑完成后重启,如果不出意外,我们的蓝牙音箱已经自动链接上了,且能够播放音乐了,也没有之前的卡顿问题。

总结

上面的两种方案,建议使用第二种bluealsa的方案,至少不会有卡顿问题,断断续续的问题。

其中遇到的坑:

1、各种开机不自动链接蓝牙

这个可能跟蓝牙配置服务(bluealsa这些)有关,也可能跟蓝牙服务有关,可以使用sudo service bluetooth status看下

2、播放一段时间后没有声音

这个问题使用bluealsa也遇到了,播放一段时间后就会断掉,还没有找到解决方案,就是毫无征兆的树莓派蓝牙音箱没有声音了,通过命令sudo hciconfig hci0 up重启也不行。

正常状态的蓝牙服务状态如下:

6月 08 16:15:02 raspberrypi systemd[1]: Started Bluetooth service.  
6月 08 16:15:02 raspberrypi bluetoothd[633]: Starting SDP server  
6月 08 16:15:02 raspberrypi bluetoothd[633]: Bluetooth management interface 1.14 initialized  
6月 08 16:15:02 raspberrypi bluetoothd[633]: Failed to obtain handles for "Service Changed" characteristic  
6月 08 16:15:02 raspberrypi bluetoothd[633]: Sap driver initialization failed.  
6月 08 16:15:02 raspberrypi bluetoothd[633]: sap-server: Operation not permitted (1)  
6月 08 16:15:02 raspberrypi bluetoothd[633]: Failed to set privacy: Rejected (0x0b)  
6月 08 16:15:02 raspberrypi bluetoothd[633]: Endpoint registered: sender=:1.6 path=/A2DP/SBC/Source/1  
6月 08 16:15:04 raspberrypi bluetoothd[633]: Endpoint registered: sender=:1.6 path=/A2DP/SBC/Source/2  
6月 08 16:15:16 raspberrypi bluetoothd[633]: /org/bluez/hci0/dev_30_21_54_94_C6_33/fd0: fd(25) ready

异常情况下,这里的服务可能是失败状态,而bluealsa的状态也是失败的,启用hci设备也是timeout错误

3、播放一段时间后蓝牙挂掉

这个问题也是还么有解决,一段时间后,蓝牙挂了,也启动不了,各种tiemout超时

6月 08 16:15:02 raspberrypi bluetoothd[633]: Endpoint registered: sender=:1.6 path=/A2DP/SBC/Source/1  
6月 08 16:15:04 raspberrypi bluetoothd[633]: Endpoint registered: sender=:1.6 path=/A2DP/SBC/Source/2  
6月 08 16:15:16 raspberrypi bluetoothd[633]: /org/bluez/hci0/dev_30_21_54_94_C6_33/fd0: fd(25) ready  
6月 08 17:11:24 raspberrypi bluetoothd[633]: Unable to get io data for Headset Voice gateway: getpeername: Transport endpoint is not connected  
6月 08 17:11:24 raspberrypi bluetoothd[633]: Unable to get io data for Hands-Free Voice gateway: getpeername: Transport endpoint is not connec  
6月 08 17:13:14 raspberrypi bluetoothd[633]: Endpoint unregistered: sender=:1.6 path=/A2DP/SBC/Source/1  
6月 08 17:13:14 raspberrypi bluetoothd[633]: Endpoint unregistered: sender=:1.6 path=/A2DP/SBC/Source/2  
6月 08 17:13:14 raspberrypi bluetoothd[633]: Endpoint registered: sender=:1.17 path=/A2DP/SBC/Source/1  
6月 08 17:13:21 raspberrypi bluetoothd[633]: Unable to get io data for Headset Voice gateway: getpeername: Transport endpoint is not connected  
6月 08 17:13:21 raspberrypi bluetoothd[633]: Endpoint registered: sender=:1.17 path=/A2DP/SBC/Source/2

遇到蓝牙断开或者播放没声音时,可以通过如下几个命令尝试解决:

#重启hci设备  
sudo hciconfig hci0 up  

#重启bluealsa服务   
sudo service bluealsa restart   

#重启蓝牙服务    
sudo service bluetooth restart

如果上面的命令解决不了,只能重启设备了,从这几天的观察来看,在持续播放音乐时,容易出现上面的问题。

建议的做法是安装https://github.com/Arkq/bluez-als,有一个定时的检查任务,可能能缓解蓝牙连接问题。

参考文档

https://bbs.hassbian.com/thread-5375-1-1.html

https://github.com/bablokb/pi-btaudio.git

https://forum-raspberrypi.de/forum/thread/38902-bluetooth-audio-for-headless-raspbian-jessie/

https://github.com/Arkq/bluez-alsa

https://www.raspberrypi.org/forums/viewtopic.php?t=222203

https://gist.github.com/actuino/9548329d1bba6663a63886067af5e4cb

https://raspberrypi.stackexchange.com/questions/9795/pulseaudio-sink-stuttering


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。