树莓派4B+Ubuntu20.04播放开机音乐

开机音乐需求介绍

**需求:**为了方便确认树莓派已经正常启动,希望播放开机音乐来提示。

**硬件:**没有耳机线的USB音箱

**软件:**mplayer, 或其他的无需界面的软件

设置流程(踩坑记录)

步骤一:验证问题,手动切换默认输出设备

使用PulseAudio命令行工具列出所有音频设备:pactl list short sinks

bash 复制代码
你会看到类似这样的输出,其中 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声卡时,自动将其设置为默认设备。

bash 复制代码
需要获取你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端口断电,导致下次启动时设备未能及时初始化。

bash 复制代码
编辑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启动触发了音乐播放脚本。

经过排查发现,如下的设置会导致上面的问题:

bash 复制代码
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是播放音乐的脚本。在脚本开头添加详细日志以定位问题。

bash 复制代码
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的代码即可。

bash 复制代码
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
相关推荐
欧云服务器5 天前
怎么让脚本命令可以同时在centos、debian、ubuntu执行?
ubuntu·centos·debian
智渊AI5 天前
Ubuntu 20.04/22.04 下通过 NVM 安装 Node.js 22(LTS 稳定版)
ubuntu·node.js·vim
The️6 天前
Linux驱动开发之Read_Write函数
linux·运维·服务器·驱动开发·ubuntu·交互
再战300年6 天前
Samba在ubuntu上安装部署
linux·运维·ubuntu
qwfys2006 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
木尧大兄弟6 天前
Ubuntu 系统安装 OpenClaw 并接入飞书记录
linux·ubuntu·飞书·openclaw
小虾爬滑丫爬6 天前
ubuntu上设置Tomcat 开机启动
ubuntu·tomcat·开机启动
老师用之于民6 天前
【DAY25】线程与进程通信:共享内存、同步机制及实现方案
linux·c语言·ubuntu·visual studio code
小虾爬滑丫爬6 天前
Ubuntu 上设置防火墙
ubuntu·防火墙
林开落L6 天前
解决云服务器内存不足:2 分钟搞定 Ubuntu swap 交换区配置(新手友好版)
运维·服务器·ubuntu·swap交换区