大家好,我是冯哥的缓存。声音问题是 Linux 新手最常遇到的麻烦之一——装完系统没声音,或者声音奇奇怪怪。
这篇先聊一下Linux 的声音是怎么工作的、PulseAudio 和 PipeWire 有什么区别、为什么一套系统里有这么多层。搞懂这些,排查问题才不会无从下手。
💡提示:如果你只想快速解决"没声音"的问题,可以等下一篇,下一篇我们会聊到具体故障排查和修复。这篇更偏基础概念。
Linux 音频系统的"三层结构"
Windows 的音频系统对用户来说基本是个黑盒:驱动装好,声音就有了。Linux 的音频系统则是层层叠叠,每一层有不同的职责。
层级 | 名称 | 作用 | 典型软件 |
第一层 | 内核音频驱动(ALSA) | 直接和声卡硬件通信,最底层 | Linux 内核自带 |
第二层 | 音频服务器 | 管理多个应用同时播放,提供混音、音量控制 | PulseAudio、PipeWire |
第三层 | 应用程序 | Firefox、VLC、Spotify 等 | 各种软件 |
打个比方:
ALSA = 声卡的"驱动程序",只负责让内核认识硬件
PulseAudio/PipeWire = "调音台",负责把多路音频混合后送给声卡
应用程序 = 演奏音乐的乐手,只管把声音发出去 -WirePlumber 作为 PipeWire 的会话管理器,实际上可以看作是介于“音频服务器(第二层)”和“应用程序(第三层)”之间的一层,负责策略路由和设备管理,让整个架构图更完整。
⚠️注意: ALSA 本身也能直接播放声音,但只能一个程序独占声卡。有了 PulseAudio/PipeWire 这层,多个程序才能同时发声。
ALSA 是什么?为什么还要了解它?
ALSA(Advanced Linux Sound Architecture)是 Linux 内核内置的音频子系统,自 2.6 内核起就是标配。
项目 | 说明 |
全称 | Advanced Linux Sound Architecture |
层级 | 内核级,最底层 |
直接操作 | aplay(播放)、arecord(录音)、alsamixer(音量调节) |
配置文件 | /etc/asound.conf、~/.asoundrc |
典型问题 | 软件音量静音了,但 ALSA 硬件音量也被拉到0 |
你需要了解 ALSA 的原因:
即使 PulseAudio/PipeWire 负责日常音频管理,它们底层也是调用 ALSA 和声卡通信的。当出现"音量条拉满但没声音"的情况,通常是 ALSA 那层的静音开关被打开了,用alsamixer才能看到。
#打开ALSA 图形音量控制界面
alsamixer
#快捷键说明:
# F6 → 选择声卡
# M→ 静音/取消静音(底部显示"MM"表示静音)
# ↑↓ → 调节音量
# q→ 退出
💡提示:在 alsamixer里,声道底部显示 MM = 静音,显示 00 = 未静音。新手最常见的坑:PulseAudio音量正常,但 ALSA 里 Master或 Speaker通道被静音了。
PulseAudio:老一代音频服务器
PulseAudio 是 Linux 桌面使用了十多年的主流音频服务器,Ubuntu 20.04 及之前版本默认使用它。
项目 | 说明 |
出现时间 | 2004年(2.6内核时代) |
主要功能 | 多应用混音、音量独立控制、网络音频、蓝牙音频 |
配置文件 | /etc/pulse/default.pa、~/.config/pulse/ |
图形工具 | pavucontrol(PulseAudio Volume Control,强烈推荐安装) |
命令行工具 | pactl、pacmd |
当前状态 | 仍在维护,但逐渐被 PipeWire 取代 |
PulseAudio 核心概念:
概念 | 含义 | 类比 |
Sink | 音频输出目标(扬声器、耳机) | 调音台的输出通道 |
Source | 音频输入来源(麦克风) | 调音台的输入通道 |
Sink Input | 某个应用的音频输出流 | 某个乐手接入调音台的信号 |
Source Output | 某个应用的音频输入流 | 某个录音设备采集的信号 |
#查看所有音频输出设备(Sink)
pactl list short sinks
#查看所有音频输入设备(Source)
pactl list short sources
#查看PulseAudio 运行状态
systemctl --user status pulseaudio
#重启PulseAudio(不用 sudo)
pulseaudio --kill && pulseaudio --start
pavucontrol是什么?
pavucontrol(PulseAudio Volume Control)是 PulseAudio 的图形音量控制面板,比系统自带的音量条强大得多:
功能 | 说明 |
播放(Playback) | 查看每个应用的音量,可以单独静音某个应用 |
录音(Recording) | 查看哪个应用在录音,麦克风分配 |
输出设备(Output Devices) | 查看所有输出设备,切换默认输出 |
输入设备(Input Devices) | 查看所有麦克风,切换默认输入 |
配置(Configuration) | 设置声卡配置文件(立体声/5.1/HDMI等) |
#安装pavucontrol
sudo apt install pavucontrol
#打开
pavucontrol
💡提示:遇到声音问题,第一步先开 pavucontrol看看,很多问题一眼就能看出来(比如应用被单独静音了,或者输出设备选错了)。
PipeWire:新一代音频服务器
PipeWire 是 Linux 音频系统的"下一代",Ubuntu 22.04 起默认使用,也是目前 Fedora、Arch 等发行版的标配。
项目 | 说明 |
出现时间 | 2017年(Wim Taymans,Red Hat开发) |
设计目标 | 同时接管音频和视频,统一 PulseAudio 和 JACK 的功能 |
兼容性 | 内置 PulseAudio 兼容层(pipewire-pulse),原有命令和工具仍可用 |
当前状态 | 主流发行版已全面切换 |
PipeWire 解决了什么问题?
旧问题(PulseAudio时代) | PipeWire 的改进 |
专业音频(JACK)和桌面音频(PulseAudio)两套系统打架 | 统一接管,不再冲突 |
蓝牙音频延迟大、断连 | 重写蓝牙音频栈,延迟更低 |
视频捕获(屏幕录制/摄像头)权限管理混乱 | 统一视频管道,配合 Flatpak 沙箱 |
低延迟音频(游戏/DAW)配置复杂 | 默认支持低延迟场景 |
PipeWire 架构表
组件 | 作用 |
pipewire | 核心服务,音视频管道 |
pipewire-pulse | PulseAudio 兼容层(让 PulseAudio 应用无缝使用) |
wireplumber | 会话管理器(管理设备、路由规则) |
pipewire-alsa | ALSA 兼容层 |
pipewire-jack | JACK 兼容层(专业音频) |
#查看PipeWire 运行状态
systemctl --user status pipewire
systemctl --user status pipewire-pulse
systemctl --user status wireplumber
#重启音频服务时,推荐使用
systemctl --user restart wireplumber
#查看PipeWire 版本
pipewire --version
#列出所有音频设备(PipeWire 原生命令)
pw-dump | grep -A5 '"media.class": "Audio'
#图形工具:qpwgraph(PipeWire 图形连接管理)
sudo apt install qpwgraph
PulseAudio vs PipeWire 对比
对比项 | PulseAudio | PipeWire |
使用场景 | Ubuntu 20.04 及更早 | Ubuntu 22.04+、Fedora、Arch |
兼容性 | 成熟稳定 | 内置 PulseAudio 兼容,几乎无感 |
蓝牙音频 | 有延迟,偶有断连 | 明显改善 |
专业音频(DAW) | 需要切换到 JACK | 原生支持低延迟 |
屏幕录制权限 | 需要 xdg-portal 配合 | 原生集成 |
系统资源 | 轻量 | 稍重,但差异不大 |
配置工具 | pavucontrol(仍可用) | pavucontrol(仍可用)+ qpwgraph |
主流趋势 | 逐渐退出 | 现役标准 |
💡提示: Ubuntu 22.04 以后,pavucontrol照样能用——因为 PipeWire 内置了 PulseAudio 兼容层(pipewire-pulse),旧工具和旧命令(pactl、pacmd)都能正常使用,不用重新学。
如何判断我的系统用的是哪个?
#方法一:查进程
ps aux | grep -E 'pulseaudio|pipewire'
#方法二:查服务状态
systemctl --user status pulseaudio 2>/dev/null
systemctl --user status pipewire 2>/dev/null
#方法三:用 pactl 查服务器信息
pactl info | grep "Server Name"
#如果输出含 PulseAudio,说明是 PulseAudio
#如果输出含 PipeWire,说明是 PipeWire(即使命令是 pactl)
输出示例解读:
输出内容 | 说明 |
Server Name: pulseaudio | 系统使用 PulseAudio |
Server Name: PulseAudio (on PipeWire 1.x.x) | 系统使用 PipeWire,带 PulseAudio 兼容层 |
常用音频诊断命令速查
以下命令适用于 PulseAudio 和 PipeWire(两套系统下pactl都可用):
命令 | 作用 |
alsamixer | ALSA 底层音量控制(检查硬件静音) |
aplay -l | 列出所有 ALSA 声卡 |
aplay /usr/share/sounds/alsa/Front_Center.wav | 用 ALSA 直接播放测试音(绕过 PulseAudio/PipeWire) |
pactl list short sinks | 列出所有音频输出设备 |
pactl list short sources | 列出所有音频输入设备 |
pactl info | 查看音频服务器信息 |
pavucontrol | 图形音量控制面板(强烈推荐) |
speaker-test -t sine -f 1000 -c 2 | 播放 1000Hz 正弦波测试音 |
#快速声卡信息总览(一条命令看全貌)
aplay -l &&echo"---" && pactl info
音频配置文件分布
文件/目录 | 作用 | 作用范围 |
/etc/asound.conf | ALSA 系统级配置 | 全局 |
~/.asoundrc | ALSA 用户级配置 | 当前用户 |
/etc/pulse/default.pa | PulseAudio 系统级启动脚本 | 全局 |
~/.config/pulse/ | PulseAudio 用户配置目录 | 当前用户 |
/usr/share/pipewire/ | PipeWire 默认配置 | 全局(不建议直接改) |
~/.config/pipewire/ | PipeWire 用户配置目录 | 当前用户 |
/usr/share/wireplumber/ | WirePlumber 默认规则 | 全局 |
~/.config/wireplumber/ | WirePlumber 用户规则 | 当前用户 |
⚠️注意:修改 /etc/pulse/和 /usr/share/pipewire/下的系统级配置时要谨慎,建议先把原文件备份(cp original original.bak),改坏了可以还原。
声音系统层级总结表
层级 | 组件 | 你会遇到的问题 | 排查工具 |
硬件 | 声卡本体 | 声卡不被识别 | lspci、lsusb、aplay -l |
内核驱动 | ALSA | 静音开关、音量为0 | alsamixer、aplay |
音频服务器 | PulseAudio / PipeWire | 多应用冲突、输出设备选错 | pavucontrol、pactl |
会话管理 | WirePlumber | 设备切换规则、热插拔异常 | wpctl status、systemctl --user status wireplumber |
应用层 | Firefox / VLC 等 | 单个应用无声 | pavucontrol → 播放标签页 |
小结
知识点 | 要点 |
Linux 音频三层结构 | 内核 ALSA → 音频服务器 → 应用程序 |
ALSA | 最底层,直连声卡;alsamixer检查硬件静音 |
PulseAudio | 老一代音频服务器,Ubuntu 20.04及更早默认 |
PipeWire | 新一代音频服务器,Ubuntu 22.04+默认,内置 PulseAudio 兼容 |
判断用哪个 | pactl info | grep "Server Name" |
万能工具 | pavucontrol——遇到声音问题先开它 |
下篇预告:装完系统没声音怎么排查?爆音怎么解决?蓝牙耳机连上但没声音?多个输出设备怎么切换?