树莓派4B+Ubuntu20.04播放开机音乐
开机音乐需求介绍
需求:为了方便确认树莓派已经正常启动,希望播放开机音乐来提示。
硬件:没有耳机线的USB音箱
软件:mplayer, 或其他的无需界面的软件
设置流程(踩坑记录)
步骤一:验证问题,手动切换默认输出设备
使用PulseAudio命令行工具列出所有音频设备:pactl list short sinks
你会看到类似这样的输出,其中 alsa_output.usb-... 很可能是你的USB音箱:0 alsa_output.pci-0000_01_00.1.hdmi-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
1 alsa_output.usb-Generic_USB_Audio_Device-00.analog-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
第一列是设备编号,第二列是设备名称。将默认输出设备切换到你的USB音箱的设备名称:pactl set-default-sink alsa_output.usb-Generic_USB_Audio_Device-00.analog-stereo
这种方式比使用编号更可靠,不必担心换到其他USB口插入。
如果这个方法能播放声音,说明根本原因就是系统开机时选错了默认设备。请继续下面的步骤。
步骤二:配置PulseAudio自动切换到USB设备
建一个PulseAudio的配置文件,当检测到某个特定的USB声卡时,自动将其设置为默认设备。
需要获取你USB音箱的唯一标识符:pactl list short sinks | grep usb记下完整的设备名称,例如 alsa_output.usb-Generic_USB_Audio_Device-00.analog-stereo。你只需要品牌和型号部分,比如 Generic_USB_Audio_Device。创建PulseAudio的默认设备规则文件:sudo nano /etc/pulse/default.pa在文件末尾,添加以下规则。请将 YOUR_DEVICE_IDENTIFIER 替换为你上一步记下的标识符(例如 Generic_USB_Audio_Device)。# 自动将特定USB音频设备设为默认
.ifexists module-switch-on-connect.so
load-module module-switch-on-connect
.endif
重要提示: 现代PulseAudio版本通常已经加载了 module-switch-on-connect 模块。你只需要确保它没有被注释掉(行首没有#)。如果已经有了,就无需重复添加。如果添加后无效,可以尝试更精确的匹配规则:# 更精确地匹配USB音箱并设为默认
set-default-sink alsa_output.usb-YOUR_DEVICE_IDENTIFIER-00.analog-stereo
保存并退出(在nano中按 Ctrl+X,然后按 Y,最后按回车)。重启PulseAudio服务以使配置生效:pulseaudio -k
等待几秒钟,PulseAudio会自动重启。或者最简单的方法是注销并重新登录。
步骤三:解决“断电后设备消失”问题,禁止USB端口电源管理
有时,操作系统为了省电,会在关机或休眠时给USB端口断电,导致下次启动时设备未能及时初始化。
编辑GRUB配置文件:sudo nano /etc/default/grub找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行,在引号内的现有参数后面添加 usbcore.autosuspend=-1。例如,修改后可能看起来像这样:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.autosuspend=-1"
这个参数告诉内核禁止所有USB设备的自动挂起功能。保存文件后,更新GRUB配置:sudo update-grub重启系统。
问题1. 开机完成后插上音箱正常响,再次开机却不响,再次重新拔掉插入又能响了,为什么?
带耳机和不带耳机就差在这里了。
带耳机的,USB只是作为供电。系统开机时,已经自动加载了耳机的驱动。
不带耳机的,USB既要供电还要传输数据。因此需要在系统开机的时候,启动USB音箱的驱动。
问题2. 为什么开机音乐响了两次?在初次打开浏览器时又播放了一次?
原因:PulseAudio 守护进程的按需启动
第一次有程序请求音频时(如浏览器),PulseAudio 才真正启动。PulseAudio启动触发了音乐播放脚本。
经过排查发现,如下的设置会导致上面的问题:
pi@raspberrypi:~/.config/autostart$ ll
总用量 16
drwxrwxr-x 2 pi pi 4096 9月 26 16:18 ./
drwx------ 17 pi pi 4096 9月 25 20:38 ../
-rw-rw-r-- 1 pi pi 191 9月 26 16:12 startup-sound.desktop
-rwxrwxr-x 1 pi pi 467 9月 26 15:58 play_sound.sh*
play_sound.sh是播放音乐的脚本。在脚本开头添加详细日志以定位问题。
echo "$(date): 脚本被调用,进程树: $(pstree -s $$)" >> /tmp/audio_debug.log
echo "环境变量: $DESKTOP_SESSION $XDG_CURRENT_DESKTOP" >> /tmp/audio_debug.log
再次开机并查看日志发现,打开音乐的脚本被调用的流程如下:
2025年 09月 26日 星期五 15:59:26 CST: 脚本被调用,进程树: systemd---systemd---gnome-session-b---play_startup_so---pstree
启动这个流程的程序在~/.config/autostart/,就是startup-sound.desktop。其中的设置和下面的重复了。在startup-sound.desktop中注释掉启动play_sound.sh的代码即可。
pi@raspberrypi:~/.config/systemd/user$ ll
总用量 16
drwxrwxr-x 3 pi pi 4096 9月 26 16:46 ./
drwxrwxr-x 3 pi pi 4096 9月 25 19:30 ../
drwxr-xr-x 2 pi pi 4096 9月 25 19:32 default.target.wants/
-rw-rw-r-- 1 pi pi 357 9月 25 19:59 startup-sound.service