RTSP 流媒体实战:服务器搭建与协议基础

  • 1-RTSP服务器搭建.mp4
  • 2-RTSP基本原理.mp4
  • 3-RTP协议讲解.mp4

一句话总览

这组三节课的主线是:先搭一个可运行的 RTSP 流媒体服务器,再通过抓包理解 RTSP 如何控制播放流程,最后深入到 RTP 报文格式,理解真正承载音视频数据的包长什么样。

RTSP 本身更像“遥控器”:负责告诉服务端要查询、建立会话、开始播放、暂停或结束。真正传输音视频负载的是 RTP,RTCP 则用于传输质量反馈和同步控制。SDP 常出现在 DESCRIBE 响应里,用来描述媒体会话信息,例如编码格式、媒体类型、端口、控制 URL 等。

RTSP、RTP、RTCP、SDP 在协议栈中的位置

1. RTSP 服务器搭建

第一节课围绕 ZLMediaKit 搭建 RTSP 服务。演示环境是远程 Linux 主机,通过浏览器查看项目说明,通过终端进入源码目录、查看第三方库、编译并启动 MediaServer

ZLMediaKit 源码与构建目录

搭建流程可以概括为:

  1. 准备 Linux 环境和编译依赖。
  2. 获取 ZLMediaKit 源码,注意子模块或第三方依赖也要拉齐。
  3. 进入构建目录执行 CMake/Make 构建。
  4. 进入 release/linux/Debug 或对应输出目录。
  5. 启动 MediaServer
  6. 检查 554 等端口是否被占用。
  7. 通过推流、拉流或抓包验证服务是否真正工作。

课程中比较重要的一点是端口问题。RTSP 默认端口通常是 554,如果启动时报 address already in usepermission denied,要先判断是端口被占用,还是普通用户没有权限监听低端口。

MediaServer 启动与 554 端口检查

常见排查命令:

sudo lsof -i:554
sudo kill -9 <pid>
sudo ./MediaServer

如果服务启动失败,优先看三类信息:

启动失败时继续检查端口与配置

2. RTSP 基本原理

RTSP 的核心作用是建立和控制实时媒体会话。它不是用来直接传输大块音视频数据的协议,而是通过一组类似 HTTP 风格的请求命令来控制服务端。

典型 RTSP 请求序列如下:

OPTIONS  -> 查询服务端支持哪些方法
DESCRIBE -> 获取媒体描述信息,通常返回 SDP
SETUP    -> 为某一路音频/视频建立传输通道
PLAY     -> 开始播放
PAUSE    -> 暂停播放
TEARDOWN -> 释放会话资源

OPTIONS

OPTIONS 用来询问服务器支持哪些 RTSP 方法。抓包里通常能看到服务端返回 Public 字段,列出 DESCRIBESETUPPLAYTEARDOWN 等能力。

DESCRIBE

DESCRIBE 是理解一条 RTSP 地址的关键步骤。客户端请求某个 rtsp://... URL 后,服务端通常返回 SDP。SDP 里会描述这个流有哪些媒体轨道、使用什么编码、时钟频率是多少,以及后续 SETUP 应该访问哪个控制路径。

Wireshark 中的 RTSP 交互与 DESCRIBE/SDP

SDP 中常见字段:

v=  协议版本
o=  会话所有者
s=  会话名称
t=  会话时间
m=  媒体类型、端口、传输协议、payload type
a=  附加属性,例如 codec、control、fmtp

SETUP

SETUP 用来给具体媒体轨道建立传输通道。音频和视频通常会分别 SETUP,因为它们可能对应不同的 track。

这里最关键的是 Transport 字段。它决定 RTP 数据怎么传:

课程里强调了多组传输通道:RTSP 负责控制,RTP video/RTP audio 负责媒体数据,RTCP 负责控制与反馈。

RTSP 涉及多组传输通道

PLAY 和 TEARDOWN

PLAY 之后,服务端开始发送 RTP 数据。客户端继续通过 RTP 序列号、时间戳、payload type 等字段还原媒体帧。

TEARDOWN 用来释放会话。实际开发中不要忽略它,因为服务器端需要回收 session、socket、端口和相关缓存。

RTSP 会话结束与 TEARDOWN

3. RTP 协议讲解

RTP 是真正承载实时音视频数据的协议。它通常跑在 UDP 上,也可以通过 RTSP 的 TCP 连接进行 interleaved 传输。

一个 RTP 包由两部分组成:

RTP Header + RTP Payload

Header 负责描述这份媒体数据的顺序、时间、类型和来源;Payload 才是实际的音频或视频数据片段。

RTP 报文格式

RTP 固定头部中最重要的字段:

字段含义
VRTP 版本,常见为 2
Ppadding 标志,表示末尾是否有填充
Xextension 标志,表示是否有扩展头
CCCSRC 个数
Mmarker 标志,含义依媒体类型而定,视频里常用于标记一帧结束
PTpayload type,表示负载类型,例如 H.264、AAC、JPEG 等
sequence number序列号,每发送一个 RTP 包递增,用于检测丢包和乱序
timestamp时间戳,用于播放同步和抖动处理
SSRC同步源标识,用来区分同一个会话中的不同媒体源
CSRC贡献源标识,混音或混流场景可能使用

RTP Header 字段说明

4. RTP 打包与还原

RTP 不保证一个视频帧正好对应一个网络包。真实情况通常是:

RTP 负载封装模型

调试 RTP 时,Wireshark 里尤其要关注:

Wireshark 中查看 RTP 负载字节

5. RTSP、RTP、RTCP、SDP 的关系

可以把这几个协议按职责分开记:

协议职责典型出现位置
RTSP控制播放会话OPTIONSDESCRIBESETUPPLAYTEARDOWN
SDP描述媒体会话DESCRIBE 响应体
RTP承载音视频数据PLAY 之后持续传输
RTCP传输统计、同步、质量反馈与 RTP 配套

RTSP 控制“什么时候播、播哪一路、怎么传”;SDP 说明“这路流是什么”;RTP 负责“把音视频数据送过去”;RTCP 负责“反馈传输质量和同步信息”。

6. 开发和排错速查

服务器侧

客户端侧

抓包侧

7. 总结下

RTSP = 控制协议,像遥控器
SDP  = 媒体说明书,告诉你有几路流、什么编码、怎么 setup
RTP  = 媒体数据包,真正装音频/视频
RTCP = RTP 的控制与反馈通道

抓包时按这个顺序看:

OPTIONS -> DESCRIBE -> SETUP(video/audio) -> PLAY -> RTP data -> TEARDOWN

搭服务器时按这个顺序查:

源码/依赖 -> 编译输出 -> 配置文件 -> 端口监听 -> 拉流验证 -> Wireshark 抓包

评论

...

正在读取评论。