树莓派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
相关推荐
Lyre丶4 小时前
Ubuntu 24.04 LTS 安装GAMIT
linux·经验分享·学习·ubuntu·gamit
新手村领路人4 小时前
ubuntu24.04安装todesk远程工具
ubuntu·todesk·远程工具
namekong84 小时前
ubuntu 通过下面几种方式查看系统 重启时间/开机时间:
linux·运维·ubuntu
老黄编程6 小时前
ubuntu如何查看一个内核模块被什么模块依赖(内核模块信息常用命令)?
linux·运维·ubuntu
什么半岛铁盒15 小时前
C++项目:仿muduo库高并发服务器-------Channel模块实现
linux·服务器·数据库·c++·mysql·ubuntu
神都少年17 小时前
Linux Ubuntu Docker 常用命令
linux·ubuntu·docker
Tipriest_17 小时前
Ubuntu 中 Bash / Zsh / Ash / Dash 的使用与区别(含对比图)
ubuntu·bash·dash
老黄编程1 天前
ubuntu 20.04 代号 focal , ubuntu 22.04 代号为 jammy, ubuntu24.04 代号为 noble
linux·运维·ubuntu
陈震_1 天前
linux系统(ubuntu)安装mysql8详细教程
linux·运维·ubuntu