Linux多媒体系统服务-PipeWire


PipeWire是一个 GNU/Linux 平台上的用来处理媒体系统的服务和用户空间的应用程序接口。包括提供视频源(例如来自捕获设备或应用程序提供的流)并将其与客户端复用、访问视频源进行消费、生成用于音频和视频处理的图形。其开发出来的目的是为了替代PulseAudio来处理多媒体,包括支持容器化应用的音频输出,和专业音频用例。使用C语言开发并在MIT许可证下使用。

其最常见的用途是为 Wayland 和 Flatpak 应用程序实现屏幕共享、远程桌面以及不同软件之间其他形式的音频和视频路由。根据它的官方FAQ,“可以把它看作是应用程序和库可以使用的驱动之上的多媒体路由层”。PipeWire 由红帽的 Wim Taymans 创建,开发工作最早可以追溯到 2015 年,这项技术最初被认为是 “视频领域的 PulseAudio",但后来随着 PipeWire 的发展,也被扩展到了音频领域。2021 年 4 月发布的 Fedora 34 成为了第一个默认采用了这项技术的 Linux 发行版,其他桌面 Linux 发行版之后也陆续跟进。它为 Linux 带来了许多好处,首先 PipeWire 的实现方式更新,开发也更加积极,其bug相对也就更少;其次它有着更好的硬件兼容性,还减少了 CPU 的使用,并有现代化的代码基础。

相较于 PulseAudio 专注于消费级音频和 JACK 专注于专业级音频,PipeWire 的目标是为所有级别的用户工作。在其他技术中,PipeWire 通过提供在不同的缓冲区大小之间动态切换的能力来实现这一目标,以适应不同音频应用的不同延迟要求。 它使用一个摄像头组织多应用程序协作成为可能,通过安全捕获屏幕内容和远程访问解决问题到Wayland环境中的屏幕。也可以充当声音服务器,提供最小的延迟和功能,结合了PulseAudio和JACK的功能,甚至考虑了PulseAudio无法声称的专业声音处理系统的需求。另外,PipeWire提供了高级安全模型,该模型允许在单个设备级别进行访问控制,以及特定的传输方式,并简化了往来于孤立容器的声音和视频的传输组织。主要目标之一是支持Flatpak格式的独立应用程序,并在基于Wayland的图形堆栈上工作。

该项目得到Gnome的支持,并已在Fedora中得到积极使用,以在基于Wayland的环境中录制屏幕广播和屏幕共享。
小结
延迟补偿还不错,能统一音视频框架还兼容PulseAudio和Jack,朝着专业级音效去的;支持Wayland和平板,支持Flatpak之类的容器内使用,有类似PolKit的权限管理,不需要像PulseAudio那样新建音频用户组和添加用户。用户也可能对 PipeWire 的能力感兴趣,它可以直接替代现有的 Linux 音频解决方案,包括 PulseAudio 和 JACK。潜在的好处包括降低 CPU 使用率,更好地支持蓝牙设备,以及能够更好地整合使用 JACK 和 PulseAudio的应用程序。它已成为其他一些分发中的默认解决方案,特别是在 Fedora 34 和更新的版本中。
PulseEffects
它曾经在PulseAudio音频服务器工作,而在发布的5.0版本中,PulseEffects放弃对PulseAudio的支持,转向GNOME新造的多媒体架构Pipewire。相比PulseEffects,Pipewire在安全方面考虑更多,而且据说将会对专业音频有更好的支持(PulseAudio和Jack合二为一)。
可安装Pipewire对PulseAudio的兼容包,PulseAudio会被自动卸载,然后重启系统应该就能正常工作了。PulseAudio的一些小工具,比如pactl、pavucontrol在Pipewire的兼容中也可以继续使用。可将Pipewire类比Wayland。
最新版本:0.3
在这个新版本中,提到了重新设计了线程处理调度程序,进行更改后就可以启动中间层,以保证与性能与JACK2相当的JACK声音服务器的兼容性。还重新设计了API且计划对API进行所有其他更改,而不会破坏与现有应用程序的兼容性。0.3版本中包含一个会话管理器,它允许用户在PipeWire中管理多媒体节点图,以及添加新的流。虽然该管理器仅提供最简单的一组基本功能,但将来会用功能更强大,更灵活的选项(例如WirePlumber)进行扩展或替换。就其本身而言,包含的库已得到改进,以确保与PulseAudio,JACK和ALSA兼容,使PipeWire可以与旨在与其他声音系统一起使用的现有应用程序一起使用。 ALSA的库几乎可以完全使用,但是JACK和PulseAudio的库仍需要改进。
其中包含一些GStreamer插件可与PipeWire进行交互。使用PipeWire作为声源的pipewiresrc插件在大多数情况下都可以正常工作,通过PipeWire输出声音的pipewiresink插件还没有一些已知问题。PipeWire尚未准备好完全替换PulseAudio和JACK,但兼容性问题将在以后的版本中优先考虑。由于 PipeWire 已得到越来越广泛的使用,PipeWire 也得到了更多开发者的关注,2022年9月开发者 Frédéric Danis 为 PipeWire 添加的新代码为支持下一代蓝牙音频铺平了道路,初步实现了对 Bluetooth LE Audio(蓝牙低功耗音频)的支持。根据开发者的这份 GitLab 提交信息,PipeWire 目前已经获得了对 Bluetooth LE Audio 的初步支持,其中此次与 Bluetooth LE Audio 相关的提交包括这些内容:
在 media-codecs 中添加 LE Audio BAP 支持
在 LE Audio BAP 中增加 LC3 编解码器支持
在 bluez5-device 中增加 LE Audio BAP 支持
检查 BlueZ 守护程序是否支持 LE 音频
完成 BAP 音频位置的映射
为 LE Audio LC3 编解码器增加立体声支持
初始化 BAP LC3 编码器 / 解码器
其中 BAP(Basic Audio Profile)是 LE Audio 的一个重要部分。Bluetooth LE Audio 是下一代蓝牙音频,使蓝牙低功耗的音频流成为可能,与经典(BR/EDR)音频相比,它实现了新的用例并大大降低了功耗,并且大幅改进了延迟和带宽方面的性能。v0.3.68 已于2023年4月上旬发布,此版本带来一系列新功能和优化:
符号链接现在用于 pipwire 二进制文件,而不是多次重新编译相同的二进制文件。
一个新的 RTP 会话模块,它利用 Apple MIDI 协议在系统之间实现低延迟双向 MIDI,同时将 Opus 编码添加到 RTP 格式。
许多 FreeBSD 编译修复,用于改进 FreeBSD 构建支持。
现有的脉冲隧道模块已经改进了速率匹配和同步
RAOP 接收器被移植到新的 OpenSSL 函数
ACP 代码更新为新的 PulseAudio UCM 代码
此版本也有各种不同的修复,例如修复蓝牙设备断开连接时的崩溃问题。
最新版本:1
v1.4.0 现已于2025年3月上旬发布,其 API 和 ABI 与之前的 1.2.x 和 1.0.x 版本兼容。此版本包含自去年 1.2 版本以来的一些重大变化,其中包括:
client-rt.conf 已被删除,所有客户端现在都使用 client.conf 并在数据线程中被赋予 RT 优先级。
添加了 UMP(又名 MIDI2)支持,现在是 PipeWire 中携带 MIDI1 和 MIDI2 的默认格式。有辅助函数可以在旧版 MIDI 和 UMP 之间进行转换。
resampler 现在可以预先计算(在编译时)一些常见的 conversion filters。resampler 中的延迟报告已得到修复和改进。
添加了对 BAP 广播链路的蓝牙支持和对使用 ASHA 的助听器的支持。还添加了新的 G722 编解码器。改进了蓝牙中的延迟报告和配置。
当 alsa.formats 属性明确允许时,ALSA 插件现在支持 DSD 播放。
添加了 PipeWire JACK control API。
为 pipewire-pulse 添加了系统服务。
许多文档和翻译更新。
许多 SPA 宏都转换为内联函数。所有 SPA 内联函数现在也都编译到 libspa.so 库中,以便更轻松地从绑定访问它们。
将 module-filter-chain graph code 移至单独的 filter-graph SPA 插件,以便可在更多地方使用。EBUR128、param_eq 和 dcblock 插件已添加到 filter-graph 中。filter graph 现在还可以使用 fftw 进行卷积。audioconvert 插件已优化,并添加了对 audioconvert 的支持,以在处理管道中插入额外的 filter-graphs。
添加了新的辅助函数来解析 JSON 格式的描述。
增加了 RISCV CPU 支持和汇编程序优化。
现在可以配置用于记录时间戳的时钟。
将 JSON 解析器拆分为核心函数和辅助函数。
添加了对 UCM 拆分 PCM 的支持。
在 echo-cancel 中添加了对 webrtc2 的支持。
现在可以从 HDMI ELD 数据中检测 IEC958 编解码器。
浮点数和 32 位之间的转换现在保留 25 位精度,而不是 24 位。
添加了与 ofono 兼容的新 Telephony D-BUS API。
调用队列现在更加高效,可以同时从多个线程调用。
v4l2 中的时钟信息得到了改进。
添加了可与视频适配器一起使用的基于 ffmpeg 的视频转换插件。
GStreamer 元素改进了缓冲池处理和速率匹配。
combine-stream 模块现在也可以 mix streams。
link-factory 现在检查端口和节点是否属于一起。
netjack-manager 模块支持自动连接流。
native-protocol 支持 abstract sockets。
pulse server 支持在 pulse.rules 中阻止回放和捕获。
现在可以在 pulse server 中正确报告流的堵塞状态。
修复 pulse-server 中的向后跳转。
在 loopback 和 raop-sink 中添加了延迟配置支持。
ROC 模块有更多的配置选项。
SAP 模块现在仅在发生变化时发送更新的 SDP。
RTP 源现在具有待机模式,当没有接收到数据时它处于空闲状态。
RTP 流中添加了对 PTP clocking 的支持。
VBAN receiver 现在可以在检测到流时动态创建流。
改进了建立链接时的错误报告功能。
增加了对在 pw-stream 中发出事件的支持。
pw-cat 现在支持 stdin 和 stdout。
更多详情可查看官方发行公告。
官方主页:https://pipewire.org/

其最常见的用途是为 Wayland 和 Flatpak 应用程序实现屏幕共享、远程桌面以及不同软件之间其他形式的音频和视频路由。根据它的官方FAQ,“可以把它看作是应用程序和库可以使用的驱动之上的多媒体路由层”。PipeWire 由红帽的 Wim Taymans 创建,开发工作最早可以追溯到 2015 年,这项技术最初被认为是 “视频领域的 PulseAudio",但后来随着 PipeWire 的发展,也被扩展到了音频领域。2021 年 4 月发布的 Fedora 34 成为了第一个默认采用了这项技术的 Linux 发行版,其他桌面 Linux 发行版之后也陆续跟进。它为 Linux 带来了许多好处,首先 PipeWire 的实现方式更新,开发也更加积极,其bug相对也就更少;其次它有着更好的硬件兼容性,还减少了 CPU 的使用,并有现代化的代码基础。

相较于 PulseAudio 专注于消费级音频和 JACK 专注于专业级音频,PipeWire 的目标是为所有级别的用户工作。在其他技术中,PipeWire 通过提供在不同的缓冲区大小之间动态切换的能力来实现这一目标,以适应不同音频应用的不同延迟要求。 它使用一个摄像头组织多应用程序协作成为可能,通过安全捕获屏幕内容和远程访问解决问题到Wayland环境中的屏幕。也可以充当声音服务器,提供最小的延迟和功能,结合了PulseAudio和JACK的功能,甚至考虑了PulseAudio无法声称的专业声音处理系统的需求。另外,PipeWire提供了高级安全模型,该模型允许在单个设备级别进行访问控制,以及特定的传输方式,并简化了往来于孤立容器的声音和视频的传输组织。主要目标之一是支持Flatpak格式的独立应用程序,并在基于Wayland的图形堆栈上工作。

该项目得到Gnome的支持,并已在Fedora中得到积极使用,以在基于Wayland的环境中录制屏幕广播和屏幕共享。
小结
延迟补偿还不错,能统一音视频框架还兼容PulseAudio和Jack,朝着专业级音效去的;支持Wayland和平板,支持Flatpak之类的容器内使用,有类似PolKit的权限管理,不需要像PulseAudio那样新建音频用户组和添加用户。用户也可能对 PipeWire 的能力感兴趣,它可以直接替代现有的 Linux 音频解决方案,包括 PulseAudio 和 JACK。潜在的好处包括降低 CPU 使用率,更好地支持蓝牙设备,以及能够更好地整合使用 JACK 和 PulseAudio的应用程序。它已成为其他一些分发中的默认解决方案,特别是在 Fedora 34 和更新的版本中。
PulseEffects
它曾经在PulseAudio音频服务器工作,而在发布的5.0版本中,PulseEffects放弃对PulseAudio的支持,转向GNOME新造的多媒体架构Pipewire。相比PulseEffects,Pipewire在安全方面考虑更多,而且据说将会对专业音频有更好的支持(PulseAudio和Jack合二为一)。
可安装Pipewire对PulseAudio的兼容包,PulseAudio会被自动卸载,然后重启系统应该就能正常工作了。PulseAudio的一些小工具,比如pactl、pavucontrol在Pipewire的兼容中也可以继续使用。可将Pipewire类比Wayland。
最新版本:0.3
在这个新版本中,提到了重新设计了线程处理调度程序,进行更改后就可以启动中间层,以保证与性能与JACK2相当的JACK声音服务器的兼容性。还重新设计了API且计划对API进行所有其他更改,而不会破坏与现有应用程序的兼容性。0.3版本中包含一个会话管理器,它允许用户在PipeWire中管理多媒体节点图,以及添加新的流。虽然该管理器仅提供最简单的一组基本功能,但将来会用功能更强大,更灵活的选项(例如WirePlumber)进行扩展或替换。就其本身而言,包含的库已得到改进,以确保与PulseAudio,JACK和ALSA兼容,使PipeWire可以与旨在与其他声音系统一起使用的现有应用程序一起使用。 ALSA的库几乎可以完全使用,但是JACK和PulseAudio的库仍需要改进。
其中包含一些GStreamer插件可与PipeWire进行交互。使用PipeWire作为声源的pipewiresrc插件在大多数情况下都可以正常工作,通过PipeWire输出声音的pipewiresink插件还没有一些已知问题。PipeWire尚未准备好完全替换PulseAudio和JACK,但兼容性问题将在以后的版本中优先考虑。由于 PipeWire 已得到越来越广泛的使用,PipeWire 也得到了更多开发者的关注,2022年9月开发者 Frédéric Danis 为 PipeWire 添加的新代码为支持下一代蓝牙音频铺平了道路,初步实现了对 Bluetooth LE Audio(蓝牙低功耗音频)的支持。根据开发者的这份 GitLab 提交信息,PipeWire 目前已经获得了对 Bluetooth LE Audio 的初步支持,其中此次与 Bluetooth LE Audio 相关的提交包括这些内容:
在 media-codecs 中添加 LE Audio BAP 支持
在 LE Audio BAP 中增加 LC3 编解码器支持
在 bluez5-device 中增加 LE Audio BAP 支持
检查 BlueZ 守护程序是否支持 LE 音频
完成 BAP 音频位置的映射
为 LE Audio LC3 编解码器增加立体声支持
初始化 BAP LC3 编码器 / 解码器
其中 BAP(Basic Audio Profile)是 LE Audio 的一个重要部分。Bluetooth LE Audio 是下一代蓝牙音频,使蓝牙低功耗的音频流成为可能,与经典(BR/EDR)音频相比,它实现了新的用例并大大降低了功耗,并且大幅改进了延迟和带宽方面的性能。v0.3.68 已于2023年4月上旬发布,此版本带来一系列新功能和优化:
符号链接现在用于 pipwire 二进制文件,而不是多次重新编译相同的二进制文件。
一个新的 RTP 会话模块,它利用 Apple MIDI 协议在系统之间实现低延迟双向 MIDI,同时将 Opus 编码添加到 RTP 格式。
许多 FreeBSD 编译修复,用于改进 FreeBSD 构建支持。
现有的脉冲隧道模块已经改进了速率匹配和同步
RAOP 接收器被移植到新的 OpenSSL 函数
ACP 代码更新为新的 PulseAudio UCM 代码
此版本也有各种不同的修复,例如修复蓝牙设备断开连接时的崩溃问题。
最新版本:1
v1.4.0 现已于2025年3月上旬发布,其 API 和 ABI 与之前的 1.2.x 和 1.0.x 版本兼容。此版本包含自去年 1.2 版本以来的一些重大变化,其中包括:
client-rt.conf 已被删除,所有客户端现在都使用 client.conf 并在数据线程中被赋予 RT 优先级。
添加了 UMP(又名 MIDI2)支持,现在是 PipeWire 中携带 MIDI1 和 MIDI2 的默认格式。有辅助函数可以在旧版 MIDI 和 UMP 之间进行转换。
resampler 现在可以预先计算(在编译时)一些常见的 conversion filters。resampler 中的延迟报告已得到修复和改进。
添加了对 BAP 广播链路的蓝牙支持和对使用 ASHA 的助听器的支持。还添加了新的 G722 编解码器。改进了蓝牙中的延迟报告和配置。
当 alsa.formats 属性明确允许时,ALSA 插件现在支持 DSD 播放。
添加了 PipeWire JACK control API。
为 pipewire-pulse 添加了系统服务。
许多文档和翻译更新。
许多 SPA 宏都转换为内联函数。所有 SPA 内联函数现在也都编译到 libspa.so 库中,以便更轻松地从绑定访问它们。
将 module-filter-chain graph code 移至单独的 filter-graph SPA 插件,以便可在更多地方使用。EBUR128、param_eq 和 dcblock 插件已添加到 filter-graph 中。filter graph 现在还可以使用 fftw 进行卷积。audioconvert 插件已优化,并添加了对 audioconvert 的支持,以在处理管道中插入额外的 filter-graphs。
添加了新的辅助函数来解析 JSON 格式的描述。
增加了 RISCV CPU 支持和汇编程序优化。
现在可以配置用于记录时间戳的时钟。
将 JSON 解析器拆分为核心函数和辅助函数。
添加了对 UCM 拆分 PCM 的支持。
在 echo-cancel 中添加了对 webrtc2 的支持。
现在可以从 HDMI ELD 数据中检测 IEC958 编解码器。
浮点数和 32 位之间的转换现在保留 25 位精度,而不是 24 位。
添加了与 ofono 兼容的新 Telephony D-BUS API。
调用队列现在更加高效,可以同时从多个线程调用。
v4l2 中的时钟信息得到了改进。
添加了可与视频适配器一起使用的基于 ffmpeg 的视频转换插件。
GStreamer 元素改进了缓冲池处理和速率匹配。
combine-stream 模块现在也可以 mix streams。
link-factory 现在检查端口和节点是否属于一起。
netjack-manager 模块支持自动连接流。
native-protocol 支持 abstract sockets。
pulse server 支持在 pulse.rules 中阻止回放和捕获。
现在可以在 pulse server 中正确报告流的堵塞状态。
修复 pulse-server 中的向后跳转。
在 loopback 和 raop-sink 中添加了延迟配置支持。
ROC 模块有更多的配置选项。
SAP 模块现在仅在发生变化时发送更新的 SDP。
RTP 源现在具有待机模式,当没有接收到数据时它处于空闲状态。
RTP 流中添加了对 PTP clocking 的支持。
VBAN receiver 现在可以在检测到流时动态创建流。
改进了建立链接时的错误报告功能。
增加了对在 pw-stream 中发出事件的支持。
pw-cat 现在支持 stdin 和 stdout。
更多详情可查看官方发行公告。
官方主页:https://pipewire.org/