这是一个非常经典且功能强大的开源流媒体库,尤其在 RTSP/RTSPS/RTP 协议领域,可以说是“事实标准”之一,即使现在有更现代的方案,但理解 Live555 对于学习流媒体技术、维护旧系统或进行二次开发仍然非常有价值。

什么是 Live555?
Live555 是一个用 C++ 编写的、跨平台的开源流媒体库,它的核心功能是实现 RTSP 协议,支持创建 RTSP 服务器、RTSP 客户端,以及处理底层的 RTP/RTCP 数据包传输。
你可以把它想象成一个“流媒体瑞士军刀”:
- 对于服务器端:它可以接收客户端的 RTSP 请求(如
DESCRIBE,SETUP,PLAY),管理媒体会话,并将音视频数据打包成 RTP 包进行发送。 - 对于客户端:它可以向服务器发送 RTSP 请求,接收并解析 RTP 数据包,然后将解码后的音视频数据呈现给用户(显示在屏幕上或播放出来)。
它的核心优势在于:
- 协议支持完善:对 RTSP/RTP/RTCP/SIP 等协议的支持非常标准和健壮。
- 跨平台:支持 Windows, macOS, Linux, iOS, Android 等多种操作系统。
- 开源免费:基于 LGPL 协议,可以自由地用于商业或非商业项目,只需注意其动态链接的要求。
- 稳定可靠:经过长期发展,被广泛应用于各种项目中,稳定性有保障。
Live555 的工作原理(核心流程)
理解 Live555,最关键的是理解它如何处理一个典型的 RTSP 直播会话,这个过程通常分为服务器端和客户端。

A. 服务器端工作流程
假设我们要用 Live555 搭建一个摄像头直播服务器:
-
创建媒体环境:
- 你需要创建一个
UsageEnvironment对象,它管理着整个程序的内存、任务调度等底层环境。
- 你需要创建一个
-
创建 RTSP 服务器:
- 创建一个
RTSPServer对象,并绑定一个监听端口(默认为 554)。
- 创建一个
-
定义“媒体会话”:
(图片来源网络,侵删)- 这是核心,你需要为每个直播流(一个摄像头)创建一个
ServerMediaSession对象。 - 在这个
ServerMediaSession中,你需要告诉 Live555 这个流包含哪些“子会话”(Subsession),通常是视频和音频。 - 对于每个子会话(例如视频流),你需要创建一个具体的“媒体源”对象,
MPEG1or2VideoServerMediaSubsession或H264VideoFileServerMediaSubsession,这个对象负责从哪里读取数据(比如从摄像头设备、视频文件等)。
- 这是核心,你需要为每个直播流(一个摄像头)创建一个
-
注册会话:
- 将创建好的
ServerMediaSession对象注册到RTSPServer中,并给它一个唯一的名字(myCamera),这样,客户端就可以通过这个名字来访问这个流。
- 将创建好的
-
等待客户端连接:
服务器进入事件循环,等待客户端的 RTSP 请求。
-
处理客户端请求:
- 当客户端连接并发送请求时,Live555 内部的事件驱动机制会自动处理。
DESCRIBE:服务器返回一个 SDP (Session Description Protocol) 文件,描述了流的详细信息(编码格式、传输方式等)。SETUP:客户端请求建立某个子会话(如视频流)的传输通道,服务器会选择一个 RTP 端对(一个用于发送数据,一个用于发送控制信息 RTCP),并返回这些端口信息。PLAY:客户端开始播放,服务器开始从你定义的“媒体源”读取数据,打包成 RTP 包,通过指定的端口发送给客户端。
B. 客户端工作流程
假设我们要用 Live555 播放一个 RTSP 直播流:
-
创建媒体环境:和服务器端一样,首先创建
UsageEnvironment。 -
创建 RTSP 客户端:
- 创建一个
RTSPClient对象,并提供 RTSP 服务器的 URL(rtsp://192.168.1.100/myCamera)。
- 创建一个
-
发送请求:
- 客户端向服务器发送
DESCRIBE请求,获取 SDP 描述。 - 解析 SDP 文件,了解有哪些子会话(视频、音频)及其编码格式。
- 客户端向服务器发送
-
建立传输通道:
- 对每个子会话,客户端发送
SETUP请求,这个请求中,客户端会告诉服务器它希望接收数据的端口(RTP 端口)。 - 服务器确认后,数据传输通道就建立好了。
- 对每个子会话,客户端发送
-
开始播放:
- 客户端发送
PLAY请求。 - 服务器开始发送 RTP 数据包。
- 客户端发送
-
接收和处理数据:
- Live555 的底层会监听指定的 RTP 端口,接收数据包。
- 接收到的数据包会被传递给一个“数据接收器”(
MediaSink),H264VideoRTPSource会将 RTP 包解析成 H264 的 NALU。 - 你需要创建一个“数据接收器”并把它连接到“数据源”上,这个
MediaSink通常是你自己实现的,它的afterGettingFrame()函数会在收到一帧完整的音视频数据时被调用,在这个函数里,你可以将数据送去解码和播放。
Live555 的优缺点
优点:
- 功能专注且强大:在 RTSP/RTP 领域非常成熟,处理了大量的细节和边界情况。
- 学习价值高:代码结构清晰,是学习流媒体协议的绝佳范例。
- 高度可定制:你可以继承它的类(如
ServerMediaSubsession)来实现自己的数据源(例如从网络摄像头、硬件采集卡等获取数据)。 - 社区支持:虽然不如一些新框架活跃,但遇到问题在网上搜索,通常能找到解决方案。
缺点:
- 架构相对老旧:基于 C++98,使用了事件驱动模型,对于习惯了现代异步编程(如 Node.js, Go)的开发者来说,理解其回调机制可能需要一些时间。
- 功能单一:它只专注于 RTSP/RTP 协议,如果需要 HLS、DASH、WebRTC 等现代协议,需要自己额外开发或集成其他库。
- 开发门槛较高:它是一个库,不是一个开箱即用的软件,你需要自己编写代码来搭建服务器和客户端,并处理数据的最终呈现(解码和播放)。
- 性能优化空间:对于超大规模的并发直播,它的架构可能不是最优选择,需要仔细优化。
典型应用场景
- IP 摄像头/NVR 厂商:很多安防设备的固件内部就集成了 Live555,用于实现 RTSP 服务器功能,让用户可以通过 VLC 等客户端直接预览摄像头画面。
- 视频会议系统:作为早期的视频会议软件(如某些版本的开源项目)的核心组件,用于处理音视频流的传输。
- 流媒体网关:在直播架构中,一个设备需要接收一种格式的流(如 RTSP),然后转换成另一种格式(如 RTMP)转发出去,Live555 常被用作接收端。
- 教育和研究:用于学习和实验 RTSP 协议,或作为毕业设计、课程设计的项目基础。
如何开始?(简单示例)
Live555 官方网站提供了详细的文档和示例代码,这是最好的学习资料。
官方网站: http://live555.com/liveMedia/
关键资源:
- Documentation: 文档目录,强烈建议阅读
index.html。 - Public Streaming Test Servers: 一些公开的 RTSP 服务器地址,你可以用它们来测试你的客户端程序。
- testProgs: 示例程序源码,这是最宝贵的资源。
testOnDemandRTSPServer: 一个简单的 RTSP 服务器示例,可以从文件或摄像头推流。openRTSP: 一个功能强大的 RTSP 客户端示例,可以播放 RTSP 流并保存成文件。playCommon:openRTSP和其他客户端程序使用的通用代码。
编译步骤:
- 下载源码。
- 进入
live目录,运行genMakefiles脚本生成 Makefile(genMakefiles linux)。 - 运行
make进行编译。 - 编译成功后,可执行文件(如
testOnDemandRTSPServer,openRTSP)会生成在mediaServer或testProgs目录下。
一个简单的命令行示例:
假设你有一个名为 test.264 的 H264 视频文件,想通过 RTSP 播放它:
-
启动服务器:
./testOnDemandRTSPServer -t test.264
这会在 554 端口启动一个服务器,流的名称是
test.264。 -
用客户端播放: 在另一个终端,运行
openRTSP:./openRTSP rtsp://localhost:554/test.264
它会接收数据,并尝试在终端打印出帧的信息,你也可以使用 VLC 播放器,打开网络串流,输入
rtsp://localhost:554/test.264。
Live555 是一个功能强大、稳定可靠的 RTSP 协议实现库,它虽然不是最现代、最易用的直播解决方案,但它在特定领域(尤其是 RTSP 交互)的地位不可替代,对于需要深入理解流媒体协议、进行底层开发或维护现有 RTSP 系统的开发者来说,Live555 仍然是一个非常有价值的工具。
