Linux声卡避坑
坑的由来
Linux的声音系统
Linux上有许多和声音相关的部件,包括但不限于ALSA、OSS、PulseAudio、Jack
-
ALSA和OSS是内核层级的组件,负责直接和声音设备通信,并提供接口以便上层使用。
因为声音设备是设备,所以ALSA/OSS它们必须存在;因为声音设备是设备,对设备的使用是独占的,所以需要更上层的组件来收集所有的应用需求,以和本层组件进行通信。 之所以存在两个,是历史和许可证/商业原因:原本几乎都用OSS,但OSS 4闭源了,所以社区转向了ALSA,结果后来OSS 4又开源了。
-
PulseAudio处于应用层的底层,负责和内核层级的ALSA和OSS通信,并提供接口以便上层使用。
蓝牙之类的外部设备,也一般都通过PulseAudio进行连接处理。
-
Jack和PulseAudio所处层级有些类似,但一般认为更专注于高阶使用,尤其是实时、低延迟需求的场景。
PipeWire 是一个新的底层多媒体框架。 它旨在以最低的延迟为音频和视频提供录制和播放功能,并支持基于 PulseAudio、JACK、ALSA 和 GStreamer 的应用程序。
选择PipeWire而弃用PulseAudio的原因主要在于PipeWire提供了统一的音视频处理框架,支持更低延迟和更高性能,适合专业音频制作和实时应用程序。它与PulseAudio和JACK兼容,提供更大的灵活性和兼容性,同时增强了安全性,特别是在Wayland会话中实现了更细粒度的权限管理。此外,PipeWire采用现代化设计,便于扩展和维护,得到了越来越多的Linux发行版和开发者社区的支持,成为未来多媒体处理的主流选择。
我自己遇到的最大的坑来源于更新系统后系统没声了,或使用浏览器播放视屏时没有声音,搜了半天最后发现可能是 pipewire 与 pulseaudio 冲突了,通过卸载 pulseaudio 能得到解决,然后又发现还有软件会依赖 pulseaudio ,再看了一下文章,发现是可以用PipeWire替代PulseAudio 的。
使用PipeWire替代PulseAudio填坑
安装PipeWire
sudo pacman -S pipewire pipewire-pulse pipewire-jack pipewire-alsa wireplumber
- pipewire-pulse : PipeWire对PulseAudioAPI的兼容层,作用是使得外部程序可以将PipeWire当作PulseAudio来使用
- pipewire-jack : Jack的兼容层
- pipewire-alsa : alsa的兼容层
- lib32-pipewire : 提供对32位的支持
- wireplumber : 会话管理器
pipewire-pulse 和 pulseaudio 冲突,需要先卸载 pulseaudio
systemctl --user stop pulseaudio.{service,socket}
systemctl --user disable pulseaudio.{service,socket}
sudo pacman -R pulseaudio
卸载完 pulseaudio 后将 pipewire 安装后尽量重启系统或手动启动相关服务
systemctl --user start pipewire pipewire-pulse pipewire-media-session