本系列每篇文章的链接:
Linux音频三部曲(1):嵌入式 Linux 音频基础与硬件体系 - 知乎
Linux音频三部曲(2):Linux ASoC驱动深度开发 - 知乎
Linux音频三部曲(3):嵌入式 Linux 音频用户态开发:ALSA、PipeWire、WirePlumber 与 GStreamer 实战 - 知乎
本文基于 Bootlin文档面向嵌入式系统集成、音频应用开发、服务调优与现场排障工程师。全文围绕ALSA 库与工具、PipeWire 核心架构、WirePlumber 策略管理、GStreamer 多媒体流水线四个主体展开,覆盖接口调用、配置编写、命令调试、问题定位全流程。
如有专业词汇翻译不当、内容理解有误的地方,还望指正。
一、用户态音频体系总览与架构定位
嵌入式 Linux 音频栈自上而下分为四层:
- 应用层:播放器、通话、语音交互、多媒体程序;
- 服务/框架层:PipeWire、PulseAudio、JACK、GStreamer;
- 接口库层:alsa-lib、libpipewire、libgstreamer;
- 内核层:ALSA、ASoC、DMA、DAI 驱动。
用户态开发的核心任务是:正确打开设备、协商参数、路由音频数据流、控制音量与路由、处理异常、保证低延迟与稳定性。
早期嵌入式场景直接使用 alsa-lib 访问硬件,随着多应用并发、蓝牙音频、低延迟需求、屏幕共享等场景普及,PipeWire 成为新一代标准服务,统一音频与视频流管理;WirePlumber 作为会话管理器负责设备发现、策略与权限;GStreamer 负责编解码、滤波、混音、推流等复杂流水线处理。
二、ALSA 用户态开发基础(libasound + alsa-utils)
ALSA 是 Linux 音频原生接口,用户态通过 alsa-lib(libasound)与内核交互,是所有上层服务的底层依赖。
2.1 alsa-lib 核心作用与编译依赖
alsa-lib 提供对 PCM、Control、RawMIDI、HwDep 等设备的封装,屏蔽内核细节,提供稳定 ABI。 嵌入式工程编译依赖:libasound.so.2与asoundlib.h。
pkg-config 配置:pkg-config --cflags --libs alsa
2.2 PCM 设备命名规则
应用通过字符串打开设备:
hw:card,dev:直接访问硬件,无插件;plughw:card,dev:自动格式转换插件;default:默认设备,由/etc/asound.conf或~/.asoundrc决定。
查看声卡列表:
aplay -l
https://zhida.zhihu.com/search?content_id=274146106&content_type=Article&match_order=1&q=arecord&zhida_source=entity -l
2.3 PCM 流操作标准流程
- 打开 PCM 设备;
- 分配并填充硬件参数结构体;
- 设置访问模式、格式、采样率、通道数、周期、缓冲;
- 应用参数;
- 循环写入采样数据;
- 结束后关闭设备。
典型 C 代码片段:
#include <alsa/asoundlib.h>
snd_pcm_t *pcm;
snd_pcm_hw_params_t *params;
unsigned int rate = 48000;
int dir = 0;
int err;
// 打开播放设备
err = snd_pcm_open(&pcm, "plughw:0,0", SND_PCM_STREAM_PLAYBACK, 0);
if (err < 0) {/* error */}
// 初始化参数
snd_pcm_hw_params_malloc(¶ms);
snd_pcm_hw_params_any(pcm, params);
// 交错模式
snd_pcm_hw_params_set_access(pcm, params, SND_PCM_ACCESS_RW_INTERLEAVED);
// 16bit 小端
snd_pcm_hw_params_set_format(pcm, params, SND_PCM_FORMAT_S16_LE);
// 通道数
snd_pcm_hw_params_set_channels(pcm, params, 2);
// 采样率
snd_pcm_hw_params_set_rate_near(pcm, params, &rate, &dir);
// 周期与缓冲(关键:决定延迟与稳定性)
snd_pcm_hw_params_set_period_size(pcm, params, 256, dir);
snd_pcm_hw_params_set_buffer_size(pcm, params, 4096);
// 应用参数
err = snd_pcm_hw_params(pcm, params);
snd_pcm_hw_params_free(params);
snd_pcm_prepare(pcm);
// 写入数据循环
short buf[4096];
while (running) {
generate_audio(buf, 4096);
err = snd_pcm_writei(pcm, buf, 2048);
if (err == -EPIPE) {
snd_pcm_prepare(pcm);// 处理溢出
}
}
snd_pcm_close(pcm);
以上为嵌入式产品常用的稳定播放模板。
2.4 录音流程与播放对称
snd_pcm_open(&pcm, "plughw:0,0", SND_PCM_STREAM_CAPTURE, 0);
// 参数配置同上
snd_pcm_readi(pcm, buf, frames);
2.5 Control 接口(音量、静音、路由)
Control 对应内核 kcontrol,用于调节音量、开关通道、切换模拟路由。
操作流程:
- 打开 ctl 设备;
- 设置元素 ID(按名称);
- 读取/写入值;
- 关闭。
示例:获取 Master 音量
snd_ctl_t *ctl;
snd_ctl_elem_id_t *id;
snd_ctl_elem_value_t *val;
snd_ctl_open(&ctl, "hw:0", 0);
snd_ctl_elem_id_alloca(&id);
snd_ctl_elem_id_set_interface(id, SNDRV_CTL_ELEM_IFACE_MIXER);
snd_ctl_elem_id_set_name(id, "Master Playback Volume");
snd_ctl_elem_value_alloca(&val);
snd_ctl_elem_value_set_id(val, id);
snd_ctl_elem_read(ctl, val);
long left = snd_ctl_elem_value_get_integer(val, 0);
long right = snd_ctl_elem_value_get_integer(val, 1);
2.6 alsa-utils 工具集(现场调试)
aplay:播放 WAV、PCM;arecord:录制;alsamixer:文本界面控件调节;amixer:命令行控件控制;alsactl:保存/恢复 mixer 状态;- speaker-test:发生测试,定位通道、噪声、无声问题。
常用命令:
amixer sset 'Master' 80%
amixer sset 'Headphone Playback Switch' on
speaker-test -c 2 -r 48000 -f 440
alsactl store
alsactl restore
2.7 ALSA 常见异常与处理
-EPIPE:underrun/overrun,处理方式snd_pcm_prepare;-EINVAL:参数不支持,检查格式、率、通道、缓冲;- 无声:先检查 mixer 开关与音量,再检查 DAPM 路由;
- 爆音:启动/停止时静音控制缺失;
- 噪声:时钟、电源、增益、接地问题。
ALSA 是用户态开发的基石,上层所有服务最终都调用 alsa-lib 访问硬件。
三、PipeWire 嵌入式低延迟多媒体服务
PipeWire 是新一代统一多媒体服务器,用于替代 PulseAudio、JACK,同时管理音频与视频,支持低延迟、热插拔、权限管理、动态路由,已成为嵌入式 Linux 音频服务标准。

3.1 核心架构与组件
pipewire:核心守护进程,负责图调度、内存管理、IPC;pipewire-pulse:PulseAudio 兼容层,兼容原有应用;wireplumber:会话与策略管理器(下一章详述);libpipewire:应用开发库;- SPA 插件:封装 ALSA、BlueZ、V4L2、libcamera 等。
3.2 嵌入式部署结构
嵌入式系统通常运行系统级实例(而非 user 实例),配置位于:
/usr/share/pipewire/
/etc/pipewire/
/etc/pipewire/pipewire.conf.d/
最小启动命令:
pipewire -c /etc/pipewire/pipewire.conf
3.3 关键配置段(context.properties)
配置时钟、延迟、量子、采样率,直接决定系统性能。
context.properties = {
core.daemon = true
default.clock.rate = 48000
default.clock.allowed-rates = [ 48000 44100 ]
default.clock.quantum = 1024
default.clock.min-quantum = 256
default.clock.max-quantum = 4096
link.max-buffers = 16
log.level = 2
}
低延迟场景可降低 quantum,代价是 CPU 占用升高。
3.4 SPA 库映射(对接 ALSA 硬件)
context.spa-libs = {
audio.convert.* = audioconvert/libspa-audioconvert
api.alsa.* = alsa/libspa-alsa
api.bluez5.* = bluez5/libspa-bluez5
support.* = support/libspa-support
}
3.5 模块加载(context.modules)
context.modules = [
{ name = libpipewire-module-rt }
{ name = libpipewire-module-profiler }
{ name = libpipewire-module-filter-chain }
]
module-rt:申请实时优先级;module-filter-chain:音效插件;module-loopback:虚拟回环设备。
3.6 静态对象(context.objects)
用于创建固定 ALSA 设备节点:
context.objects = [
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink
node.name = "alsa-output"
media.class = "Audio/Sink"
audio.position = [ FL FR ]
api.alsa.path = "hw:0"
}
}
]
3.7 核心概念:Node / Port / Link

- Node:处理单元(播放、录音、效果、设备);
- Port:输入/输出端口;
- Link:端口之间的连接。
数据流沿 Link 穿过 Node,由驱动节点触发调度。
3.8 调度机制(Quantum)
每个周期处理的样本数称为 quantum,决定延迟:延迟 ≈ quantum / 采样率
例如 48kHz、quantum=256,延迟≈5.3ms。
3.9 嵌入式常用命令工具
pw-cli:交互控制,创建/删除链接、查询节点;pw-dump:导出全图 JSON;pw-top:实时监控节点负载;

pw-cat / pw-play / pw-record:简易播放器/录音机;pw-link:链接管理;pw-dot:生成拓扑图;pw-profiler:性能分析。

示例:
pw-cli ls Node
pw-play test.wav
pw-record rec.wav
pw-link pw-play:output_FL alsa:playback_FL
3.10 低延迟调优(嵌入式关键)
- 提高线程实时优先级;
- 减小 quantum;
- 关闭不必要的插件;
- 使用
hw:设备而非plughw:; - 关闭自动重采样。
四、WirePlumber 会话与策略管理
WirePlumber 是 PipeWire 的官方会话管理器,负责设备发现、热插拔、路由策略、权限、配置文件、默认设备选择,是嵌入式产品必须定制的组件。
4.1 配置结构
/usr/share/wireplumber/
/etc/wireplumber/
/etc/wireplumber/wireplumber.conf.d/
4.2 核心功能
- 枚举 ALSA、BlueZ 音频设备;
- 为设备选择可用配置(Profile);
- 自动路由应用流到默认设备;
- 提供
wpctl命令行接口; - 支持 Lua 脚本策略定制;
- 权限管理与设备预留。
4.3 wpctl 常用命令
wpctl status # 查看所有设备与节点
wpctl set-default <ID> # 设置默认播放/录音设备
wpctl get-volume <ID>
wpctl set-volume <ID> 70%
wpctl set-mute <ID> toggle
4.4 ALSA 设备监控配置
monitor.alsa.rules = [
{ matches = [{ device.name = "~alsa_card.*" }]
actions = {
update-props = {
api.alsa.use-acp = true
device.disabled = false
}
}
}
]
4.5 禁用 D-Bus
wireplumber.profiles = {
main = { support.dbus = disabled }
}
monitor.alsa.reserve-device = disabled
4.6 软件 DSP 音效链
可给 sink 挂载均衡、降噪、自动音量等 DSP:
node.software-dsp.rules = [
{ matches = [{ node.name = "alsa_output.*" }]
actions = {
create-filter = {
filter-path = "/etc/wireplumber/dsp.json"
hide-parent = true
}
}
}
]
4.7 权限模型
WirePlumber 管理两个套接字:
pipewire-0-manager:无限制权限;pipewire-0:受限权限,由策略授予。
五、GStreamer 多媒体流水线开发
GStreamer 是嵌入式 Linux 主流多媒体框架,基于插件与流水线,用于音频播放、录音、编解码、混音、滤波、推流。

Example of a GStreamer pipeline
5.1 概念
- Element:功能单元(filesrc、wavparse、audioconvert、alsasink);
- Pad:输入/输出端口;
- Caps:数据格式约束;
- Bin:容器;
- Pipeline:顶层调度器。
5.2 插件

5.3 命令行调试(gst-launch-1.0)
播放 WAV 到 ALSA:
gst-launch-1.0 filesrc location=test.wav ! wavparse ! audioconvert ! audioresample ! alsasink
播放 MP3:
gst-launch-1.0 filesrc location=test.mp3 ! mpegaudioparse ! avdec_mp3 ! audioconvert ! alsasink
录音到 WAV:
gst-launch-1.0 alsasrc ! audioconvert ! wavenc ! filesink location=rec.wav
查看插件信息:
gst-inspect-1.0 alsasink
5.4 GStreamer 调试
GST_DEBUG=2:警告级别;GST_DEBUG=3,audioconvert:6:指定插件详细日志;GST_DEBUG_DUMP_DOT_DIR=./:生成流水线拓扑图;dot -Tpng xxx.dot -o pipeline.png:可视化。
5.5 嵌入式优化要点
- 使用硬件解码器插件;
- 关闭不必要的转换;
- 合理设置队列长度;
- 增大缓冲避免 underrun;
- 使用
async-handling=false降低延迟。
六、总结
嵌入式 Linux 用户态音频开发以 ALSA 为底层、PipeWire 为服务、WirePlumber 为策略、GStreamer 为多媒体能力,构成完整可产品化的技术栈。