树莓派连接蓝牙音箱播放音乐
缘起
去年买手机的时候,送了一个小小的蓝牙音箱,除了刚买手机时连上试了试是否可用(音质渣的没想用),在桌子上吃灰近一年了。
最近终于有一点点时间,想到同样在角落默默吃灰运行(其实并没有吃灰了,运行了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
已有6位网友发表了看法:
感觉树莓派上的蓝牙或者我的小音箱非常不稳定,就没有继续尝试了
发表评论