在嵌入式 Linux 上配置 PulseAudio 默认输出设备的完整指南

🎧 在嵌入式 Linux 上配置 PulseAudio 默认输出设备的完整指南

引言

在嵌入式 Linux 平台(如 Firefly RK3588)中,音频系统通常由 ALSA 提供底层驱动支持,而 PulseAudio 作为用户空间音频服务器,负责混音、设备管理、音量控制等高级功能。为了实现稳定、可控的音频输出,正确配置 PulseAudio 的默认输出设备(sink)是关键步骤。


一、PulseAudio 简介

PulseAudio Sound Server 是一个跨平台的音频服务器,最初由 Lennart Poettering 开发,现已广泛用于 Linux 桌面和嵌入式系统。它运行在用户空间,提供以下功能:

  • 多应用混音
  • 网络音频传输
  • 蓝牙音频支持
  • 每用户音频隔离
  • 动态设备管理

源码地址:PulseAudio GitLab 仓库

模块文档:PulseAudio 模块参考

配置说明:PulseAudio 配置文档

开发者入口:PulseAudio Developer Docs


二、查看当前输出设备(sink)

使用 pactl 命令列出所有可用的输出设备:

bash 复制代码
pactl list short sinks

示例输出:

复制代码
0 alsa_output.platform-bt-sound.stereo-fallback
1 alsa_output.platform-dp0-sound.stereo-fallback
2 alsa_output.platform-es8388-sound.stereo-fallback
3 alsa_output.platform-hdmi0-sound.stereo-fallback
4 combined

这些 sink 名称是设置默认输出的关键标识。


三、设置默认输出设备

✅ 临时设置(当前会话有效)

bash 复制代码
pactl set-default-sink alsa_output.platform-es8388-sound.stereo-fallback

注意:不能使用数字编号如 #2,必须使用完整的 sink 名称。

验证设置是否生效:

bash 复制代码
pactl info | grep "Default Sink"

四、实现多声卡同时输出(合并 sink)

如果你希望多个声卡(如 HDMI 和 I2S)同时播放音频,可以使用 module-combine-sink 模块:

bash 复制代码
pactl load-module module-combine-sink sink_name=combined slaves=alsa_output.platform-es8388-sound.stereo-fallback,alsa_output.platform-hdmi0-sound.stereo-fallback
pactl set-default-sink combined

这样创建的 combined sink 会将音频同步输出到多个设备。

查看已加载模块:

bash 复制代码
pactl list modules | grep combine

五、永久生效配置方式

✅ 修改系统配置文件 /etc/pulse/default.pa

在文件末尾添加:

ini 复制代码
### Allow including a default.pa.d directory
.nofail
.include /etc/pulse/default.pa.d

load-module module-combine-sink sink_name=combined slaves=alsa_output.platform-es8388-sound.stereo-fallback,alsa_output.platform-hdmi0-sound.stereo-fallback
set-default-sink combined

推荐将模块加载和默认设置拆分为 /etc/pulse/default.pa.d/combined.pa,便于维护。

修改后重启 PulseAudio:

bash 复制代码
pulseaudio -k && pulseaudio --start

六、修复环境变量:解决 XDG_RUNTIME_DIR 报错

常见错误:

复制代码
XDG_RUNTIME_DIR (/run/user/0) is not owned by us (uid 1000), but by uid 0!
Failed to acquire autospawn lock

原因:

  • 当前用户 UID=1000(如 firefly),但环境变量错误地指向 /run/user/0(root)
  • PulseAudio 拒绝跨 UID 连接,无法启动或控制音频服务

✅ 解决方法:

bash 复制代码
export XDG_RUNTIME_DIR=/run/user/1000
pulseaudio --start

建议将其加入 .bashrc:

bash 复制代码
echo 'export XDG_RUNTIME_DIR=/run/user/1000' >> ~/.bashrc

七、嵌入式部署建议

项目 建议
默认输出设置 使用 set-default-sink 指定 sink 名称
多声卡输出 使用 module-combine-sink 合并 sink
持久化配置 修改 /etc/pulse/default.pa 或使用 .pa 片段
环境变量修复 设置正确的 XDG_RUNTIME_DIR,避免 UID 冲突
自动启动 可用 systemd 用户服务或 .bashrc 脚本
验证工具 使用 pactl, aplay, ps, grep 等命令调试

八、常用命令速查

bash 复制代码
# 查看 sink 列表
pactl list short sinks

# 设置默认 sink
pactl set-default-sink <sink_name>

# 查看当前默认 sink
pactl info | grep "Default Sink"

# 加载合并 sink 模块
pactl load-module module-combine-sink sink_name=combined slaves=<sink1>,<sink2>

# 查看已加载模块
pactl list modules | grep combine

# 修复环境变量
export XDG_RUNTIME_DIR=/run/user/1000
相关推荐
Rabitebla13 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
Decay__13 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
天远API18 小时前
零信任架构实战:基于天远运营商三要素详版V即时版构建自动化消费电子大促电商平台高价值权益秒杀与优惠券防羊毛高并发实名核验网关
运维·人工智能·架构·自动化
Android系统攻城狮18 小时前
Linux FFmpeg深度解析之avcodec_default_get_encode_buffer调用流程与实战(二十八)
linux·运维·服务器·ffmpeg·车载音视频·ffmpeg音视频
程序员初一18 小时前
8080 打不开的四层定位:监听地址、ufw、DOCKER 链、安全组
linux·ssh
程序开发阿元18 小时前
swappiness 60 和 10 差在哪:一台 1C1G 的三轮对比
linux·ssh
无足鸟ICT19 小时前
【RHCA+】mpstat命令(监控CPU)
linux
乐维_lwops19 小时前
案例解读:大型综合性科创产业园运维监控落地实践
运维·网络·人工智能·安全·it监控·国产运维智能体
GeW20 小时前
新质生产力Linux和数据库为啥这么关键
linux
番茄啊20 小时前
linux 开启xftp连接
linux·运维·服务器