引言
随着物联网(IoT)和智能设备的快速发展,实时音视频传输在嵌入式系统中变得越来越重要。无论是智能摄像头、无人机,还是工业监控设备,都需要高效、低延迟的流媒体传输解决方案。在众多协议中,RTSP(Real-Time Streaming Protocol)因其灵活性和广泛的支持,成为嵌入式系统中实现流媒体传输的首选。
介绍 SmolRTSP,一款基于 Rust 的轻量级 RTSP 服务器库,专为资源受限的嵌入式系统设计。内容涵盖 RTSP 协议原理、SmolRTSP 核心架构模块、嵌入式平台部署流程、与 Live555 等方案的对比分析以及性能优化建议。旨在帮助开发者在 STM32MP1 等嵌入式设备上实现低延迟、高灵活性的音视频流传输,解决资源受限下的实时流媒体挑战。

随着物联网(IoT)和智能设备的快速发展,实时音视频传输在嵌入式系统中变得越来越重要。无论是智能摄像头、无人机,还是工业监控设备,都需要高效、低延迟的流媒体传输解决方案。在众多协议中,RTSP(Real-Time Streaming Protocol)因其灵活性和广泛的支持,成为嵌入式系统中实现流媒体传输的首选。
RTSP 是一种应用层协议,专为控制流媒体服务器而设计。它允许客户端发送类似于播放、暂停、停止等控制命令,以实现对音视频流的实时控制。需要注意的是,RTSP 本身并不传输媒体数据,而是通过 RTP(Real-time Transport Protocol)进行数据传输,RTCP(Real-time Control Protocol)则用于传输控制信息。

RTSP 采用客户端 - 服务器模型,通信过程通常包括以下步骤:
这些命令使得客户端可以灵活地控制媒体流的播放,实现如快进、暂停、停止等功能。

在嵌入式系统中实现 RTSP 服务器面临诸多挑战:
因此,需要一种轻量级、易于实现的 RTSP 服务器解决方案,以满足嵌入式系统的需求。
SmolRTSP 是一个符合 RTSP 1.0 标准的轻量级服务器库,专为嵌入式设备设计。它支持 TCP 和 UDP 传输,允许使用任何数据载荷格式,提供了灵活的 API,便于开发者在资源受限的环境中实现 RTSP 功能。
SmolRTSP 适用于多种嵌入式系统场景,包括但不限于:
SmolRTSP 被设计为一个模块化、低资源消耗、高度可定制的 RTSP 服务库。其核心遵循简洁性与实用性原则,适合运行在裸机或嵌入式 Linux 系统之上。
下图为 SmolRTSP 的典型架构:

SmolRTSP 是使用 Rust 编写的,因此需要如下工具链支持:
对于 STM32MP1、全志 V851、RK3588S 等主流嵌入式 SoC,SmolRTSP 完全可在 256MB 内存内流畅运行。
| 集成场景 | 描述 | 对接方式 |
|---|---|---|
| 与自研视频编码器集成 | 传入帧缓冲区,由 SmolRTSP 负责打包 RTP 并推送 | 提供原始帧接口(YUV/H264 buffer) |
| 与摄像头驱动对接 | 视频采集线程实时推送帧 | 使用 mmap/V4L2 捕获帧后送入 SmolRTSP |
| 与媒体服务器协同 | 作为上游推流服务端供 FFmpeg/OBS 拉流 | 直接监听 socket,标准 SDP 描述支持 |
| WebRTC/RTMP 同时推送 | 与其他协议并行传输流媒体 | 可复用相同视频采集层,只需单独注册 socket 推送 |
fn start_streaming() {
// 初始化摄像头
let video_capture = V4l2Capture::new("/dev/video0");
// 启动 SmolRTSP 服务
let server = SmolRTSPServer::bind("0.0.0.0:8554");
loop {
// 读取一帧图像
let frame = video_capture.read_frame();
// 编码为 H264(假设使用软编)
let encoded = h264_encode(frame);
// 推送到 RTSP 会话
server.broadcast_rtp(encoded);
}
}
注意:SmolRTSP 本身不包含 H264 编码器,需结合外部库(如 x264、OpenH264、FFmpeg)进行编码。
| 问题 | 原因 | 调试方法 |
|---|---|---|
| 客户端连接后无数据 | 未正确调用 broadcast_rtp / 会话未建立 | 打印 SessionManager 状态,确认 SETUP 是否完成 |
| 播放黑屏卡顿 | 时间戳错误 / I 帧丢失 / 编码器问题 | 使用 Wireshark 抓包 + FFplay 对比延迟 |
| 编译失败 | Rust 工具链不匹配 | 使用 rustup target add 安装交叉编译目标 |
在嵌入式系统中选择 RTSP 服务框架时,开发者面临多个选项,如 Live555、EasyRTSPServer、FFserver 等。
| 项目 | SmolRTSP | Live555 | EasyRTSPServer | FFserver |
|---|---|---|---|---|
| 语言 | Rust | C++ | C++ | C |
| 占用内存 | 约 100–200KB | 1MB+ | 5MB+ | 已废弃 |
| 嵌入式适配 | 极佳 | 一般(需裁剪) | 偏重 | 不推荐 |
| 开发灵活性 | 可完全自定义流 | 偏重通用 API | 固定流结构 | 维护中止 |
| RTP 发送性能 | 中等偏高 | 优秀 | 优秀 | 一般 |
| 编码器依赖 | 无(需外接) | 内置支持部分 | 内置 | 内置 |
| 多协议支持 | RTSP only | 支持 RTCP/RTP 全链路 | 支持 RTMP 扩展 | 支持多种(但不维护) |
结论:如果你是做嵌入式、对资源占用敏感、想高度定制,SmolRTSP 是非常适合的选择。但如果你需要现成支持 RTMP / HLS / HTTPS 等多协议,Live555 等可能更合适。
| 瓶颈环节 | 原因 | 优化建议 |
|---|---|---|
| RTP 延迟波动 | 定时器不稳定 / 网络抖动 | 使用定时线程 + 高优先级 socket |
| 编码开销高 | 软件编码器效率低 | 使用硬件 H264 编码器(如 VENC) |
| 会话上下文耗内存 | 大量客户端时堆积 | 限制最大连接数 + 超时回收 |
| 线程上下文切换频繁 | IO/编码未解耦 | 使用异步 + 单线程数据管线结构 |
| 应用场景 | 描述 | 推荐配置 |
|---|---|---|
| 家庭智能摄像头 | 插电摄像头/电池门铃 | 使用 V4L2 + YUV 采集 + SmolRTSP |
| 无人机图传系统 | 实时流传输 | 接入硬编码 + 定制 SDP |
| 工业巡检终端 | 多通道图像上传 | 多进程协同推流,每路独立 socket |
| 宠物投喂器/可视门锁 | 边缘视频嵌入 | 单线程极简推送架构(帧率≤15) |
如果你希望在嵌入式系统中运行一个高效、定制化的 RTSP 服务端,而不是用传统重型服务器框架,SmolRTSP 值得尝试。
| 优点 | 缺点 |
|---|---|
| 极简设计,易于嵌入 | 不带编码器,需要外部 H264 支持 |
| 完全开源,接口灵活 | 缺乏 UI 管理界面(需命令行调试) |
| 占用资源小,适合边缘设备 | 文档相对简略,需要看源码理解架构 |
工程建议:
GitHub:GitHub - OpenIPC/smolrtsp: A lightweight real-time streaming library for IP cameras 技术文档:SmolRTSP: SmolRTSP

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online