Skip to content

Xiu,用 Rust 实现的多协议流媒体服务器 | 旋武社区 Rust 开源项目推荐

发表于:2026-10-23
Rust 新闻

摘要

本期推荐的 Rust 开源项目 Xiu,正是一款以 Rust 开发的多协议流媒体服务器,主要处理媒体接入、转发与分发。它使用 Rust 编写协议处理与流分发逻辑,并以 Tokio 组织异步 I/O 和并发任务,可以运行在 Linux、macOS 和 Windows 上。

直播和视频接入场景中,推流端和播放端使用的协议往往并不一致:OBS 常用 RTMP 推流,设备视频源常见 RTSP,网页播放则可能采用 HLS、HTTP-FLV 或 WebRTC。服务端需要处理协议差异,维护流与连接的对应关系,并将同一路音视频分发给多个订阅者。

本期推荐的 Rust 开源项目 Xiu,正是一款以 Rust 开发的多协议流媒体服务器,主要处理媒体接入、转发与分发。它使用 Rust 编写协议处理与流分发逻辑,并以 Tokio 组织异步 I/O 和并发任务,可以运行在 Linux、macOS 和 Windows 上。

01 Xiu 做了什么? ​

Xiu 的主要职责是直播流的接入、转发和分发,通过命令行参数或 TOML 配置文件启动。

在接入侧,RTMP 模块支持发布和订阅 H.264/AAC 直播流,可与 OBS、FFmpeg 等工具配合使用;RTSP 模块支持 TCP(Interleaved)与 UDP 传输,可发布、订阅 H.264、H.265、AAC 媒体流,也可以通过 HTTP API 发起远端 RTSP 拉流任务。WebRTC 部分提供 WHIP 推流与 WHEP 播放入口。

在分发侧,RTMP 输入可以转换为 HTTP-FLV、HLS,RTSP 和 WebRTC 输入可以转换为 RTMP、HTTP-FLV、HLS。

图1

围绕这些链路,项目还提供了 RTMP GOP 缓存、静态转推与回源、推拉流鉴权、HTTP 事件通知,以及 HLS 文件录制。业务系统可以通过 HTTP API 查询流和连接信息,其中音视频统计目前主要面向 RTMP、HTTP-FLV。

02 Rust 给这套服务带来了什么? ​

流媒体服务中的一些问题很具体:连接断开后,谁还在持有数据?多个任务如何更新订阅者列表?收到不完整的协议数据时,错误又如何传回调用方?在 Xiu 中,可以看到 Rust 的语言机制如何参与处理这些问题。

所有权与借用,让缓冲区的使用有明确约束 ​

Xiu 的字节读取模块使用 BytesMut 保存接收到的数据。读取方法通过 &mut self 修改缓冲区,先检查数据长度,再取出所需字节;数据不足时返回错误。

这里同时用到了两类约束:长度是否足够,由运行时检查;谁可以修改缓冲区、引用能存活多久,则由 Rust 的借用规则检查。在安全 Rust 代码中,释放后继续访问、同时持有冲突的可变引用等问题,会受到编译器限制。

对于持续解析协议头、音视频帧和分片的服务,这让开发者可以直接操作字节数据,同时减少手动管理内存生命周期的负担。连接对象和缓冲区的释放依照所有权与析构规则进行,也不需要追踪式垃圾回收器来统一回收这些 Rust 对象。

async/await 与 Tokio,组织大量等待网络数据的任务 ​

直播连接中有不少时间花在等待:等待客户端发来数据,等待网络写入完成,或者等待流中心发出事件。Xiu 使用 Tokio 的 TCP、UDP 和任务调度能力,通过 Rust 的 async/await 编写这些流程。

以 RTMP 服务为例,监听器接受连接后,会创建会话对象,再通过 tokio::spawn 运行会话处理。连接等待异步 I/O 时,运行时可以调度其他就绪任务,无需为每个连接分配一个专门等待的操作系统线程。

流中心同样使用异步任务处理媒体数据,并通过 tokio::select! 同时等待数据与退出信号。网络等待、媒体转发和任务退出因此可以在同一套异步模型下组织。Rust 的所有权规则也参与其中:async move 将任务需要的对象移入任务,任务跨线程调度时,编译器会检查相关类型是否满足传递要求。

类型与消息通道,把并发协作写进接口 ​

一路直播往往连接着多个任务:推流会话接收数据,流中心维护订阅关系,播放会话向客户端发送内容。Xiu 通过 Tokio 消息通道传递媒体数据和流事件,并用不同的 Rust 类型描述它们。

例如,下面是项目中的媒体帧定义:

rust
pub enum FrameData {
    Video { timestamp: u32, data: BytesMut },
    Audio { timestamp: u32, data: BytesMut },
    MetaData { timestamp: u32, data: BytesMut },
    MediaInfo { media_info: MediaInfo },
}

视频帧、音频帧和媒体信息各自携带对应字段,接收方通过模式匹配处理。发布、订阅、取消订阅等操作也被定义为事件类型。接口中传递什么数据、处理什么事件,可以直接从类型定义看出来,编译器也能检查调用是否匹配。

需要共享的订阅者映射和统计数据,则使用 Arc 与 Mutex 管理:前者支持多个任务共同持有对象,后者约束共享可变状态的访问。协议处理接口 TStreamHandler 声明了 Send + Sync,使跨线程使用的要求成为接口的一部分。

这些机制给并发代码提供了可检查的规则,也方便维护者沿着“谁持有对象、谁发送消息、谁修改状态”追踪数据流。锁竞争、队列积压等运行时问题,仍需要结合实际负载观察和改进。

Cargo workspace 与 trait,支撑多协议共同演进 ​

Xiu 将应用、协议和基础组件组织在同一个 Cargo workspace 中。application/xiu 负责配置与服务启动;protocol/ 下分别实现各类协议;library/streamhub 连接发布者与订阅者;字节读写、媒体封装、H.264 解析和日志等能力放在基础库中。

图2

Rust 的 trait 为这些模块提供了共同接口。例如,网络读写通过 TNetIO 抽象,TCP 与 UDP 分别实现;流中心通过 TStreamHandler 与协议侧协作。模块之间的调用由编译器进行类型检查,调整接口时,可以及时发现受影响的调用位置。

这种组织方式也让贡献者能从一个相对集中的模块开始:研究 RTMP 握手时进入对应协议目录,排查分发问题时查看流中心,处理字节解析问题时回到基础库。Cargo 统一管理这些 crate 的依赖、构建与测试。

项目的协议处理和流分发逻辑主要由 Rust 实现,音频处理也使用了 audiopus、fdk-aac 等库。上述语言与工程机制,为资源管理、并发协作和持续维护提供了基础;具体吞吐量、内存占用与播放延迟,则取决于码率、协议、网络和部署配置,需要在相应条件下测量。

03 从一路直播开始了解项目 ​

阅读代码之前,可以先从源码编译 Xiu,再在本地观察一条完整的推流与播放链路。

获取源码并编译 ​

先准备 Git 和 Rust 工具链(包含 Cargo),下面以 Linux / macOS 终端为例:

bash
git clone https://github.com/harlanc/xiu.git
cd xiu
# 在仓库根目录编译 xiu 可执行程序
cargo build --release

Cargo 会下载依赖并编译程序,首次构建耗时取决于网络和机器配置。完成后,可执行文件位于 target/release/xiu;在 Windows 上编译得到的对应文件为 target/release/xiu.exe。

先查看帮助信息,确认程序可以运行:

bash
./target/release/xiu -h

随后启动 RTMP、HTTP-FLV 和 HLS 服务:

bash
./target/release/xiu -r 1935 -f 8080 -s 8081 -l info

也可以从 GitHub Releases 下载对应平台的可执行文件,直接运行。

推流与播放 ​

准备一段含有 H.264 视频、AAC 音频的 test.mp4,另开终端使用 FFmpeg 推流:

bash
ffmpeg -re -stream_loop -1 -i test.mp4 \
  -c:v copy -c:a copy -f flv \
  rtmp://127.0.0.1:1935/live/test

随后使用 FFplay 播放 HTTP-FLV:

bash
ffplay http://127.0.0.1:8080/live/test.flv

沿着这条链路,可以依次查看 RTMP 会话如何发布流、流中心如何登记订阅者,以及 HTTP-FLV 模块如何接收并发送媒体数据。配置文件示例位于 application/xiu/src/config/examples,其他协议的使用方法见官网文档。

04 入驻旋武社区,欢迎开发者参与 ​

Xiu 现已入驻旋武社区,并采用 MIT 协议开源。 无论你是熟悉 Rust 网络编程、有音视频经验,还是刚开始接触项目,都能找到切入点:改进连接管理与异步任务、检查协议兼容性与时间戳处理,或者从运行示例、补充文档、整理复现步骤入手。

真实设备与播放器上的反馈同样有价值——把推流方式、编码、环境配置和复现步骤记录清楚,就能为排查和回归测试提供依据。功能建议与实现方案欢迎在 Issue 中讨论,代码、测试和文档改进欢迎提交 PR。

项目地址:https://xuanwu.openatom.org/articles/project/xiu

官方网站:https://rustxiu.com


旋武社区 Rust 开源项目推荐栏目,持续发掘国内优质 Rust 开源项目。Xiu 已收录至旋武社区项目库,欢迎大家前往社区官网项目页(https://xuanwu.openatom.org/project )查阅更多项目信息,也欢迎向我们投稿推荐有意思的 Rust 项目。

旋武开源社区: https://xuanwu.openatom.org

致力于在中国普及和发展 Rust 编程语言,培育中国 Rust 专家,繁荣 Rust 生态。