rtp、rtcp、rtsp、rtmp协议详解

一、协议阐释

在流媒体传输、实时通信等场景中,RTP、RTCP、RTSP、RTMP 是四个非常重要的协议,它们分别承担不同的功能,共同支撑音视频等实时数据的传输与控制。以下从定义、核心功能、工作原理、特点及应用场景等方面详细讲解:

1.1、RTP(Real-time Transport Protocol,实时传输协议)

定义

RTP 是一种用于实时传输音视频等实时数据的协议,由 IETF(互联网工程任务组)定义,主要解决实时数据在网络中传输时的时序、同步、标识等问题。它本身不提供传输可靠性保证,通常依赖底层的 UDP 协议(偶尔也用 TCP,但极少)。

核心功能

数据标识与封装:

为音视频数据(如 H.264 视频、AAC 音频)添加头部信息,包括:

· 序列号:用于接收端检测丢包和重排序;

· 时间戳:标记数据产生的时间,用于接收端同步播放(如音画同步);

· 负载类型:标识数据类型(如 H.264、PCM 音频),帮助接收端解析;

· SSRC(同步源标识符):区分不同的数据源(如多人视频会议中不同的发言人)。

实时性优先:

基于 UDP 传输(UDP 无连接、无重传机制),牺牲部分可靠性换取低延迟,适合实时场景(如视频通话、直播)。

工作原理

· 发送端:将采集的音视频数据按帧分割,添加 RTP 头部后封装为 RTP 包,通过 UDP 发送;

· 接收端:解析 RTP 包头部,利用序列号重排序、时间戳同步数据,再交给解码器播放。

特点

· 不保证可靠传输(丢包、乱序需上层或配套协议处理);

· 灵活支持多种编码格式(通过负载类型字段适配);

·通常与 RTCP 配合使用(依赖 RTCP 获取传输质量反馈)。

应用场景

· 实时音视频通话(如 Zoom、微信视频);

· 直播(如游戏直播的实时画面传输);

· 视频会议、IP 电话等。

1.2、RTCP(Real-time Transport Control Protocol,实时传输控制协议)

定义

RTCP 是 RTP 的 "配套控制协议",与 RTP 协同工作,主要负责监控 RTP 传输质量、反馈信息、同步多源流,确保实时传输的稳定性。

核心功能

传输质量监控与反馈:

接收端通过 RTCP 向发送端反馈关键指标,包括:

· 丢包率(接收包数 / 发送包数);

· 网络抖动(数据包到达时间的波动);

· 接收缓冲区状态等。发送端根据反馈调整传输策略(如降低码率、调整帧率)。

同步与标识:

· 提供时钟同步信息,辅助 RTP 解决多源流(如音频和视频)的同步问题;

· 通过 "源描述包"(SDES)传递数据源信息(如用户名、设备标识),方便区分不同发送端。

会话管理:

监控参与会话的节点状态(如加入 / 离开),确保会话稳定性。

工作原理

· RTCP 与 RTP 共用会话(同一组 IP 和端口),通常 RTP 使用偶数端口(如 5004),RTCP 使用相邻奇数端口(如 5005);

· 发送端和接收端周期性发送 RTCP 包(频率随会话规模动态调整,避免占用过多带宽);

· 发送端通过 RTCP 反馈调整编码参数或传输策略(如丢包率过高时降低码率)。

特点

· 依赖 RTP 存在,无法单独使用;

· 带宽占用低(通常不超过会话总带宽的 5%);

· 被动反馈为主(接收端主动向发送端反馈)。

应用场景

所有使用 RTP 的场景都需要 RTCP 配合,如视频会议、实时通话、直播等,用于优化传输质量。

1.3、RTSP(Real Time Streaming Protocol,实时流协议)

定义

RTSP 是一种用于控制音视频流传输的 "远程控制协议",类似 "流媒体的遥控器",主要负责发起、暂停、快进、后退等会话控制操作。它本身不传输媒体数据,媒体数据通常通过 RTP/RTCP 传输。

核心功能

会话控制:

支持客户端向服务器发送控制指令,包括:

· PLAY(播放)、PAUSE(暂停)、STOP(停止);

· SETUP(建立会话,协商传输方式,如 RTP/UDP 或 RTP/TCP);

· TEARDOWN(终止会话);

· DESCRIBE(获取媒体流描述信息,如编码格式、码率)。

媒体协商:

客户端与服务器协商媒体参数(如编码格式、传输协议),确定后通过 RTP 传输实际数据。

工作原理

基于 "客户端 - 服务器" 模型,使用 TCP(默认端口 554)传输控制指令;

流程示例:

· 客户端发送DESCRIBE请求,获取媒体流元数据(如 SDP 格式的描述);

· 客户端发送SETUP请求,协商传输方式(如 RTP 端口、协议);

· 客户端发送PLAY请求,服务器通过 RTP 开始传输媒体数据;

· 客户端可发送PAUSE/STOP暂停或终止传输。

特点

· 仅负责控制,不传输媒体数据(媒体数据由 RTP/RTCP 承载);

· 支持双向交互(客户端可控制,服务器也可推送状态);

· 适合 "按需实时流" 场景(如随时暂停、快进)。

应用场景

· IP 摄像头、监控系统(用户远程控制摄像头的实时画面播放 / 暂停);

· 视频点播(VOD)的实时控制(如在线课程的暂停、快进);

· 安防监控平台(远程调取摄像头实时画面)。

1.4、RTMP(Real-Time Messaging Protocol,实时消息传输协议)

定义

RTMP 是 Adobe 公司开发的用于音视频和数据实时传输的协议,最初用于 Flash 播放器,后成为流媒体领域的常用协议。它既传输控制消息,也直接传输媒体数据,基于 TCP(默认端口 1935)保证可靠性。

核心功能

媒体数据传输:

直接封装音视频数据(如 H.264、AAC)和元数据(如视频分辨率、码率),通过 "消息"(Message)格式传输,支持低延迟(通常 1-3 秒)。

会话控制:

支持连接建立、流发布(如主播推流)、流订阅(如观众拉流)等操作,通过 "命令消息"(Command Message)实现。

协议扩展:

衍生出多个变种,如:

· RTMPE:加密传输(增强安全性);

· RTMPT:封装在 HTTP 中传输(穿透防火墙);

· RTMPS:基于 SSL/TLS 加密的 RTMP(类似 HTTPS)。

工作原理

· 基于 TCP 建立持久连接,通过 "握手" 过程确认版本和加密方式;

· 数据分为 "消息"(Message)和 "块"(Chunk):消息是逻辑单元(如一段视频、一条控制指令),块是传输单元(将消息拆分后按固定大小传输,减少开销);

· 支持 "推流"(如主播向服务器发送流)和 "拉流"(如观众从服务器获取流)两种模式。

特点

· 基于 TCP,保证数据可靠传输(但可能因重传导致延迟略高,需优化);

· 低延迟性能较好(优于 HLS/DASH 等基于 HTTP 的协议);

· 兼容性强(早期广泛支持,目前仍用于直播推流 / 拉流)。

应用场景

· 直播平台(如早期的 YouTube Live、国内直播平台的推流环节);

· 互动直播(如游戏直播、电商直播);

· 实时互动应用(如在线教育的师生互动画面)。

1.5、四者对比与关系总结

协议

核心功能

传输内容

底层协议

典型场景

与其他协议的关系

RTP

实时媒体数据传输

音视频帧

UDP 为主

视频通话、直播数据传输

依赖 RTCP 反馈质量

RTCP

监控 RTP 传输质量、反馈信息

控制指令、统计

UDP 为主

配合 RTP 使用

RTP 的 "控制助手"

RTSP

媒体流控制(播放 / 暂停等)

控制指令

TCP

IP 摄像头、点播控制

媒体数据通过 RTP/RTCP 传输

RTMP

音视频 + 控制消息传输

媒体数据 + 指令

TCP

直播推流 / 拉流

独立协议,不依赖 RTP/RTCP

1.6、总结

· RTP+RTCP :构成实时媒体传输的 "传输 + 控制" 核心,解决 "怎么传" 和 "传得怎么样" 的问题;

· RTSP :解决 "怎么控制传输" 的问题(如播放 / 暂停),需配合 RTP/RTCP 传输数据;

· RTMP :一套独立的 "传输 + 控制" 方案,适合低延迟流媒体场景,无需依赖其他协议。

理解四者的分工,有助于在流媒体系统设计(如直播、视频会议)中选择合适的协议组合。

二、协议的内容

以下从协议结构、核心字段、工作流程、扩展机制等技术细节层面,进一步深入解析 RTP、RTCP、RTSP、RTMP 协议:

2.1、RTP(Real-time Transport Protocol)

1. 协议结构(RTP 头部)

复制代码

0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|V=2|P|X| CC |M| PT | Sequence Number |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Timestamp |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| synchronization source (SSRC) Identifier |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| contributing source (CSRC) List (0 to 15 items) |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Payload Data |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

RTP 头部最小为 12 字节,可扩展,结构如下(按网络字节序排列):

字段

长度(位)

含义说明

Version(V)

2

版本号,当前为 2(RFC 3550 定义)

Padding(P)

1

填充位,1 表示包尾部有填充字节(用于对齐加密块,调整载荷长度为整数字节),最后 1 字节标识填充长度。

Extension(X)

1

扩展位,1 表示头部后有扩展字段(用于自定义扩展字段,如加密信息)

CSRC Count(CC)

4

CSRC 列表长度(0~15,标识贡献源数量)

Marker(M)

1

标记位,含义由负载类型定义(如视频帧结束、音频静音开始)

Payload Type(PT)

7

负载类型,标识数据格式(如 PCMU 音频 = 0,H.264 视频 = 96,动态分配需协商)

Sequence Number

16

序列号,每发送一个包 + 1,接收端用于检测丢包和重排序(初始值随机)

Timestamp

32

时间戳,单位由负载类型定义(如音频采样率、视频帧率),用于同步播放和抖动计算

SSRC

32

同步源标识符,随机生成,唯一标识一个数据源(如麦克风、摄像头),通常为随机生成的 32 位整数,确保在会话中唯一。

CSRC List

32×CC

贡献源列表,记录对当前数据有贡献的其他源((如混音场景中,多个音频源混合后,记录每个原始源的 SSRC),最多 15 个

示例:一个 H.264 视频 RTP 包的 PT=96,M=1 表示该包是一帧的最后一个分片,Timestamp 随帧采集时间递增。

2. 负载封装规则

· 对于小于 MTU(由底层 UDP 的 MTU 限制,通常不超过 1500 字节)的媒体帧(如音频帧):直接封装为一个 RTP 包;

· 对于大于 MTU 的媒体帧(如视频关键帧):需分片封装,通过 RTP 序列号和 M 位标识分片顺序和结束(如 H.264 的 FU-A 分片机制)。

3. 关键机制

· 同步机制:接收端通过 SSRC 区分不同源流(如音频和视频),再通过各自的 Timestamp 计算播放时差,实现音画同步;

-· 时间戳是 RTP 实现实时同步的核心机制。发送端根据数据的采样时间生成时间戳(如音频每 10ms 采样一次,时间戳增量为采样率 ×10ms);

-· 接收端通过时间戳计算数据的播放顺序和间隔,避免因网络延迟波动导致的播放卡顿(如将先采样的数据先播放)。

· 抖动补偿:接收端维护缓冲区,根据 RTP 包到达时间与 Timestamp 的差值(抖动)动态调整播放延迟,避免卡顿。

4. 丢包与重排序(序列号)

· 序列号从 0 开始,每发送一个报文递增 1;

· 接收端通过序列号检测丢包(如收到序列号 5 后直接收到 7,说明 6 丢失)和重排序(如收到 7 后收到 6,需重新调整顺序)。

5. 多源区分(SSRC 与 CSRC)

· SSRC:每个发送端(如麦克风)生成唯一的 32 位 SSRC,接收端通过 SSRC 区分不同来源的数据流(如会议中区分多个发言人);

· CSRC:当数据经过混合(如音频混音器),混合器会将原始发送端的 SSRC 填入 CSRC 列表,接收端可识别 "贡献源"。

6. 载荷类型标识(PT)

PT 字段值与编码格式的映射需预先协商(如通过 SIP/SDP 协议),例如:

· PT=0:PCMU(G.711 μ-law 音频);

· PT=96:H.264 视频(动态分配,非固定)。

接收端根据 PT 值选择对应的解码器,确保数据正确解析。

7. 扩展与变种

· RTP 扩展头部:通过 X 位启用,可添加私有字段(如传输层时间戳、加密信息);

· 安全扩展 SRTP:基于 RTP 的加密扩展(Secure RTP),提供数据机密性、完整性和身份认证,广泛用于需要安全的场景(如 VoIP、视频会议、金融会议、医疗会诊)。

8. RTP 的工作流程

会话初始化 :通过 SIP、RTSP 等协议协商会话参数(如 IP 地址、端口、编码格式、PT 映射关系等)。

数据封装 :发送端将编码后的实时数据(如音频帧)封装为 RTP 报文(添加头部字段:时间戳、序列号、SSRC 等)。

底层传输 :RTP 报文通过 UDP 发送(通常 RTP 用偶数端口,RTCP 用奇数端口,如 RTP=5004,RTCP=5005)。

接收处理 :接收端解析 RTP 头部,通过序列号重排序、检测丢包,通过时间戳同步播放,通过 PT 字段选择解码器。

控制反馈:RTCP 定期发送统计信息(如丢包率、延迟),发送端根据反馈调整传输策略(如降低码率以减少丢包)。

9、RTCP 的作用(与 RTP 的配合)

RTCP 是 RTP 的 "控制伙伴",主要功能包括:

· 状态反馈 :发送端通过 RTCP 的 RR(接收报告)获取接收端的丢包率、延迟等信息,动态调整发送策略;

· 时钟同步 :通过 SR(发送报告)中的 NTP 时间戳,帮助接收端校准本地时钟,确保音视频同步;

· 会话管理 :通过 SDES(源描述)传递参与者信息(如用户名),通过 BYE 报文通知离开会话。

RTCP 报文的发送频率较低(通常每 5~10 秒一次),且流量远小于 RTP(约占会话总流量的 5%)。

10、RTP 的应用场景

RTP 广泛用于需要实时交互的场景:

· VoIP(网络电话) :如 Skype、Zoom 的语音传输;

· 视频会议 :如 Teams、腾讯会议的音视频传输;

· 实时流媒体 :如直播平台的视频推送(配合 RTSP);

· 在线游戏:如实时语音聊天、游戏画面同步。

11、RTP 与相关协议的关系

RTP 的工作依赖于其他协议的配合,形成完整的实时传输体系:

· 底层传输协议 :通常使用 UDP(用户数据报协议),因 UDP 无连接、低延迟的特性更适合实时场景(TCP 的重传机制会导致延迟增加,不适合实时数据)。

· 控制协议 RTCP :与 RTP 配套使用,负责传输控制信息(如网络状态反馈、时钟同步、参与者管理等),帮助发送端调整传输参数(如码率)。

· 会话初始化协议 :如 SIP(会话初始协议)、RTSP(实时流协议),负责建立和管理 RTP 会话(如协商 IP 地址、端口、编码格式等)。

· 编码协议:RTP 仅封装数据,实际的音视频数据需先经过编码(如 H.264、G.711 等),RTP 报文中的 "载荷类型" 字段会标识编码格式。

12、总结

RTP 是实时数据传输的 "基石",通过头部字段提供时序、同步、标识等关键信息,配合 RTCP 实现动态调整,结合 UDP 满足低延迟需求。其核心价值在于为实时应用提供标准化的封装与控制机制,但不保证可靠性,需依赖上层协议(如应用层重传、FEC 前向纠错)和 RTCP 共同保障传输质量。

了解 RTP 的结构与原理,对于开发实时音视频应用、排查传输问题(如卡顿、不同步)具有重要意义。

2.2、RTCP(Real-time Transport Control Protocol)

1. 协议结构(RTCP 包通用头部)

RTCP 所有包共享一个通用头部,其结构如下(按 32 位字对齐,从左到右为高位到低位):

复制代码

0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|V=2|P| RC | PT | length |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

所有 RTCP 包均以 8 字节固定头部开始:

字段

长度(位)

含义说明

Version(V)

2

同 RTP,固定为 2,与 RTP 数据包中的该值相同。

Padding(P)

1

同 RTP,填充位,若为 1,表示包尾有填充字节,填充的最后八位用于计算应该忽略多少填充字节。

Reception Report Count(RC)

5

接收报告块数量(仅 SR/RR 包有效),包含在该数据包中的接收方报告块的数量,有效值为 0 - 31

Packet Type(PT)

8

包类型(如 SR=200,RR=201,SDES=202,BYE=203,APP=204)

Length

16

包长度(以 32 位字为单位,值 = 实际字节数 / 4 - 1),(以 32 位字为单位)减 1,包含头和任意填充

2. 核心包类型及结构

SR(Sender Report,发送端报告):发送端(如服务器)周期性发送,包含自身发送统计:

复制代码

通用头部(8字节) + SSRC(4字节,发送端标识) + NTP时间戳(8字节,绝对时间) +

RTP时间戳(4字节,与RTP包Timestamp对应) + 发送包数(4字节) + 发送字节数(4字节) +

接收报告块(0~31个,每个24字节,记录对其他源的接收统计)

作用:帮助接收端同步本地时钟(通过 NTP 与 RTP 时间戳映射),监控发送端状态。

RR(Receiver Report,接收端报告):接收端(如客户端)发送,反馈接收质量:

复制代码

通用头部(8字节) + SSRC(4字节,接收端标识) + 接收报告块(0~31个,每个24字节)

每个报告块包含:

· 源 SSRC(4 字节,目标发送端标识);

· 丢包率(8 位,0~100%);

· 累计丢包数(24 位);

· 最高序列号(32 位,用于计算收到的包数);

· 抖动(32 位,网络延迟波动,单位 RTP 时间戳);

· 最后 SR 时间戳(32 位,最近一次收到 SR 的 NTP 时间戳高 32 位);

· SR 到报告的延迟(32 位,收到 SR 到发送 RR 的时间差)。

SDES(Source Description,源描述) :附加数据源的文本信息(如用户名、邮箱、设备名),格式为 "类型 - 长度 - 值"(TLV)。

BYE :通知会话成员离开(可选携带离开原因)。

APP:自定义应用消息(如网络状况告警)。

3. 带宽控制机制

· RTCP 总带宽占用不超过会话总带宽的 5%,其中发送端占用 25%,接收端占用 75%;

· 发送间隔动态调整:会话成员越多,间隔越长(公式:T = 500ms × e^(成员数 / 15),最小 500ms,最大 10s)。

4. RTCP 协议详细讲解

功能 :

· 提供数据分发质量反馈 :RTCP 为应用程序提供会话质量或广播性能质量的信息,每个 RTCP 信息包封装发送端和 / 或接收端的统计报表,如发送的包数目、丢失的包数目和包的抖动等,发送端可根据这些反馈调整传输速率。

· 确定 RTP 用户源 :RTCP 为每个 RTP 用户提供一个全局唯一的规范名称(Canonical Name,CNAME)。当 RTP 中的同步源标识符(SSRC)因冲突或程序重启发生改变时,接收者可利用 CNAME 来跟踪参与者,还可用于在相关 RTP 连接中的几个数据流之间建立联系,实现音视频同步。

· 控制 RTCP 传输间隔 :每个对话成员定期发送 RTCP 信息包,随着参与者增加,为防止 RTCP 信息包占用过多网络资源导致拥塞,需限制其流量,一般控制信息所占带宽不超过可用带宽的 5%。应用程序根据参与者总数调整 RTCP 包的发送速率。

· 传输最小进程控制信息 :该功能对于参与者可任意进入和离开的松散会话进程十分有用,可用于传送最少会话控制信息,如在用户界面显示参与者标识。

分组类型:

· 发送端报告(Sender Report,SR) :由发送 RTP 数据报的应用程序或终端发出,用于周期性地向所有接收端报告发送端的信息,包括该 RTP 流的 SSRC、最新产生的 RTP 分组的时间戳和绝对时钟时间、发送的分组数和字节数等。

· 接收端报告(Receiver Report,RR) :由接收但不发送 RTP 数据报的应用程序或终端发出,接收端每收到一个 RTP 流就产生一个 RR 分组,内容包括所收到的 RTP 流的 SSRC、分组丢失率、最后一个 RTP 分组的序号、分组到达时间间隔的抖动等。

· 源点描述(Source Description,SDES) :给出会话中参加者的描述,包含参加者的规范名 CNAME,还可能包括用户名、邮件地址、电话等信息。

· 结束(BYE) :用于通知会话中的其他成员将退出会话。

· 特定应用(APP):使应用程序能够定义新的分组类型,以满足特定的应用需求。

2.3、RTSP(Real Time Streaming Protocol)

1. 协议格式(基于 HTTP/1.1 语法)

RTSP 消息分为请求消息(客户端→服务器)和响应消息(服务器→客户端),格式类似 HTTP,但指令和状态码不同。

· 请求格式:方法 URL RTSP/版本\r\n头部字段\r\n\r\n消息体

· 响应格式:RTSP/版本 状态码 原因\r\n头部字段\r\n\r\n消息体

请求消息结构:

复制代码

请求行(Request-Line)

消息头(Headers)

空行(CRLF)

消息体(可选,如SDP数据)

例如:例如:PLAY rtsp://example.com/stream RTSP/1.0

响应消息结构:

复制代码

状态行(Status-Line)

消息头(Headers)

空行(CRLF)

消息体(可选,如SDP数据或错误信息)

· 状态行格式 :RTSP版本 状态码 原因短语

例如:RTSP/1.0 200 OK

· 常用状态码 :

· 2xx(成功):200 OK(成功)、201 Created(会话建立)。

· 4xx(客户端错误):404 Not Found(流不存在)、405 Method Not Allowed(方法不支持)。

· 5xx(服务器错误):500 Internal Server Error(服务器内部错误)。

2. 核心方法(Method)

方法

作用说明

OPTIONS

客户端查询服务器支持的方法(如 "OPTIONS rtsp://example.com/stream RTSP/1.0")

DESCRIBE

客户端获取媒体流描述(通常为 SDP 格式,包含编码、轨道、传输方式等)

SETUP

建立会话,协商传输参数(如 "Transport: RTP/AVP;unicast;client_port=5004-5005" 指定 RTP 用 5004 端口,RTCP 用 5005)

PLAY

启动媒体传输(可带 Range 参数指定播放范围,如 "Range: npt=0-" 表示从开始播放)

PAUSE

暂停传输(保留会话状态,可通过 PLAY 恢复)

TEARDOWN

终止会话,释放资源

ANNOUNCE

客户端向服务器推送流描述(用于 "推流" 场景,如摄像头向服务器发布实时流)

GET_PARAMETER

查询媒体参数(如 "GetParamater: rtsp://.../stream RTSP/1.0" 获取当前码率)

SET_PARAMETER

设置媒体参数(如调整音量、帧率)

3. 会话建立流程(以拉流为例)

OPTIONS :客户端→服务器:"支持哪些方法?" 服务器返回支持的方法列表;

DESCRIBE:客户端→服务器:"给我流的详细信息" 服务器返回 SDP(如:

复制代码

v=0

o=- 123456 1 IN IP4 192.168.1.100

s=LiveStream

m=video 0 RTP/AVP 96 # 视频流,动态负载类型96(H.264)

c=IN IP4 0.0.0.0

a=rtpmap:96 H264/90000 # 90000为时间戳单位(Hz)

m=audio 0 RTP/AVP 97 # 音频流,动态负载类型97(AAC)

a=rtpmap:97 MPEG4-GENERIC/44100/2

SETUP :客户端→服务器(针对每个媒体轨道):"用 RTP/UDP 传输,我的端口 5004(RTP)和 5005(RTCP)" 服务器确认并分配端口,返回 Session ID;

PLAY :客户端→服务器:"开始传输" 服务器通过 RTP 发送媒体数据,客户端通过 RTCP 反馈;

TEARDOWN:客户端→服务器:"结束会话" 释放资源。

4. RTSP 的核心特点

客户机 - 服务器架构

· 客户端(如媒体播放器)向服务器发送控制指令。

· 服务器(如流媒体服务器)响应指令并管理媒体流。

无状态性

· 协议本身不维护会话状态,状态由客户端和服务器各自保存(如播放位置、速率);

· 但通过Session头部字段绑定会话(类似 HTTP Cookie)。

双向通信

支持客户端到服务器(指令)和服务器到客户端(响应 / 通知)的通信。

多播支持

SETUP 时可指定multicast参数,实现一对多传输(适合直播)。

与 RTP/RTCP 的配合

RTSP 负责 "控制"(如启动 / 停止流),RTP 负责 "传输" 媒体数据,RTCP 负责反馈传输质量。

5. RTSP 的主要功能

· 会话建立与终止:通过SETUP指令建立媒体流传输通道,TEARDOWN终止会话。

· 媒体控制:PLAY(播放)、PAUSE(暂停)、STOP(停止)、SEEK(定位播放位置)等。

· 参数协商:协商传输协议(如 RTP/UDP、RTP/TCP)、编码格式(如 H.264、AAC)、端口等。

· 媒体描述获取:通过DESCRIBE指令获取媒体流的元数据(如 SDP 格式的描述)。

6. RTSP 头部结构(通用消息头示例)

RTSP 消息头由多个键值对(Header-Name: value)组成,分为通用头、请求头、响应头和实体头。以下是常见头部字段及结构示例:

头部类型

字段示例

说明

通用头

CSeq: 3

序列号,匹配请求与响应(递增,确保有序)。

Session: 12345678

会话标识,SETUP后由服务器分配,用于标识当前会话。

请求头

Range: npt=0-

播放范围(如从 0 秒开始播放,npt表示正常播放时间)。

Transport: RTP/AVP; unicast; client_port=5004-5005

传输协议(RTP/AVP)、模式(单播)、客户端端口(RTP/RTCP 端口)。

响应头

Content-Type: application/sdp

消息体格式(如 SDP 描述媒体信息)。

Server: Wowza Streaming Engine

服务器标识。

7. RTSP 通信流程示例(简化)

· 客户端发送OPTIONS→服务器返回支持的方法(如PLAY、SETUP)。

· 客户端发送DESCRIBE→服务器返回 SDP(包含媒体编码、流地址等)。

· 客户端发送SETUP→服务器确认传输通道(分配会话 ID、协商端口)。

· 客户端发送PLAY→服务器通过 RTP 开始传输媒体流。

· 客户端发送PAUSE→服务器暂停传输。

· 客户端发送TEARDOWN→服务器终止会话。

RTSP 头部结构图(请求消息示例)

以下是一个PLAY请求的头部结构示意图,展示了请求行、通用头、请求头的组织方式:

复制代码

// 请求行

PLAY rtsp://example.com/live/stream RTSP/1.0\r\n

// 消息头(键值对)

CSeq: 4\r\n // 序列号(匹配响应)

Session: 789abcdef\r\n // 会话ID(SETUP时分配)

Range: npt=30-\r\n // 从30秒开始播放

User-Agent: VLC/3.0.18\r\n // 客户端标识

// 空行(结束头部)

\r\n

// 消息体(可选,此处无内容)

其中,\r\n是换行符,用于分隔字段和结束头部。响应消息结构类似,仅将请求行替换为状态行(如RTSP/1.0 200 OK\r\n)。

RTSP 通过上述结构和流程,实现了对实时媒体流的灵活控制,广泛应用于 IP 摄像头、视频监控、流媒体播放等场景。

2.4、RTMP(Real-Time Messaging Protocol)

RTMP 是由 Adobe 公司开发的一套用于实时数据传输的协议,最初用于 Flash 播放器与服务器的音视频交互,后被广泛应用于直播、视频点播等场景。它支持低延迟的媒体流传输,可直接传输音频、视频及元数据(如字幕、时间戳),并包含一套完整的握手、消息封装和流控制机制。

协议结构

1. RTMP 的核心特点

基于 TCP 的可靠传输

· 依赖 TCP 协议(默认端口 1935),确保数据有序、无丢失(通过重传机制),适合对稳定性要求高的场景(如直播)。

多数据流复用

· 支持在单一 TCP 连接中传输多个流(如视频流、音频流、控制流),通过Chunk(分块)机制复用,提高传输效率。

低延迟优化

· 相比 HTTP 流(如 HLS),RTMP 延迟通常可控制在 1-3 秒,适合互动直播(如弹幕、连麦)。

支持多种数据类型

· 媒体数据(视频:H.264/H.265;音频:AAC/MP3)、控制指令(如播放、暂停)、元数据(如编码信息、时长)。

客户端 - 服务器架构

· 包含 "客户端→服务器"(发布流)和 "服务器→客户端"(拉取流)两种模式,支持推流(如主播推流到服务器)和拉流(如观众从服务器拉取)。

2. RTMP 的核心组成

RTMP 协议栈可分为握手层、消息层和分块层(Chunk Layer),各层功能如下:

握手层(Handshake)

· 建立 TCP 连接后,客户端与服务器需完成三次握手(C0/C1、S0/S1、C2、S2),交换协议版本、时间戳、随机数据等信息,确认双方兼容性。

消息层(Message Layer)

定义数据的逻辑结构,每个消息包含消息类型(如视频、音频、命令)、时间戳、流 ID(标识不同流)和 ** payload**(实际数据)。

· 命令消息(Command Message):控制指令(如连接、发布、播放);

· 数据消息(Data Message):元数据(如视频宽高、码率);

· 音频消息(Audio Message):音频帧数据;

· 视频消息(Video Message):视频帧数据;

· 共享对象消息(Shared Object Message):同步客户端与服务器的对象状态(如聊天消息)。

分块层(Chunk Layer)

· 为适应 TCP 传输,将消息拆分为更小的Chunk(分块,默认最大 128 字节),减少头部开销。通过 Chunk Header 标识分块所属的消息,实现数据复用和流量控制。

复制代码

基本头(1~3字节):包含Chunk Stream ID(CSID,标识分块流,区分不同消息流,用于复用)和Chunk Type(分块类型,决定消息头部的长度)

消息头(0~11字节):根据块类型Chunk Type决定长度,包含消息时间戳、长度、类型ID、消息流ID,用于还原原始消息。

扩展时间戳(0~4字节):时间戳超过3字节时使用,当时间戳超过0xFFFFFF(约 4.29 秒)时,额外存储的完整时间戳。

块数据( payload ):消息内容分片,长度不超过Chunk Size(默认 128 字节,可通过协议控制消息修改)。

RTMP 头部结构图(分块头部示例)

RTMP 的核心头部是Chunk Header,其结构因Chunk Type不同而变化(共 4 种类型)。以下以最完整的Type 0(首次传输消息的分块)为例,展示头部结构:

复制代码

// 基本头部(Basic Header,2字节示例,CSID=3)

0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7

+---------------+---------------+

| 0 0 0 0 0 0 1 1 | CSID=3 | // 前2位为00(Type 0),后6位+第2字节共14位表示CSID

+---------------+---------------+

// 消息头部(Message Header,11字节)

0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7

+---------------+---------------+---------------+---------------+

| Timestamp (3字节) | // 消息时间戳(如0x00012345)

+---------------+---------------+---------------+---------------+

| Payload Length (3字节) | // 消息总长度(如0x000A0000,655360字节)

+---------------+---------------+

| Message Type ID (1字节) | // 消息类型(如0x09表示视频)

+---------------+---------------+---------------+---------------+

| Message Stream ID (4字节,小端序) | // 消息流ID(如0x00000001)

+---------------+---------------+---------------+---------------+

// 扩展时间戳(4字节,可选)

0 1 2 3 4 5 6 7 ...(共4字节)

+---------------+...

| Extended Timestamp (完整4字节) | // 当Timestamp字段为0xFFFFFF时,此处存储实际时间戳

+---------------+...

// Chunk Data(数据部分,长度≤Chunk Size)

+---------------+...

| Chunk Data (消息片段) | // 拆分后的音视频数据或命令数据

+---------------+...

分块头部类型说明

· Type 0 :完整头部(11 字节消息头部),用于首次传输一个新消息的分块。

· Type 1 :省略Message Stream ID(7 字节消息头部),用于同一消息的后续分块(时间戳为相对值)。

· Type 2 :仅包含时间戳增量(3 字节),用于同一消息且payload长度和消息类型不变的分块。

· Type 3:无消息头部,仅依赖基本头部,用于同一消息且所有参数不变的分块(最高效)。

3. RTMP 的消息类型与结构

RTMP 消息是数据传输的基本单元,结构如下:

字段

长度(字节)

说明

消息类型 ID

1

标识消息类型:1-7:协议控制消息(如设置_chunk_size);- 8-9:音频 / 视频数据;- 15-20:命令消息(如connect、play)。

payload 长度

3

消息体(payload)的字节数(大端序)。

时间戳

4

消息生成的时间戳(毫秒),用于音视频同步。

消息流 ID

3

标识消息所属的流(如不同的直播流),大端序,可自定义。

payload

可变

实际数据(如视频帧、音频帧、命令 JSON)。

4. 握手过程(RTMP 握手需交换 3 个包)

· C0/S0:1 字节,版本号(如 3 表示 RTMP 1.0);

· C1/S1:1536 字节,包含时间戳(4 字节)、随机数(1528 字节)、零填充(4 字节);

· C2/S2:1536 字节,复制对端 C1/S1 的时间戳和随机数,附加本地处理时间。

握手成功后建立持久 TCP 连接,开始传输块数据。

5. RTMP 的典型通信流程

① TCP 连接建立 :客户端与服务器建立 TCP 连接(默认端口 1935)。

② 握手 :交换 C0/C1、S0/S1、C2/S2 数据包,确认协议版本(如 RTMP 1.0)。

③ 连接与流初始化:

· 客户端发送connect命令→服务器返回连接成功_result(含服务器信息)。

· 客户端发送createStream命令→服务器分配流 ID。

④ 推流 / 拉流:

· 推流:客户端通过publish命令发布流(指定流名),服务器确认后进入推流状态,开始发送音视频 Chunk。

· 拉流:客户端通过play命令请求拉流,服务器开始发送音视频 Chunk。

⑤ 流控制 :通过setChunkSize(修改分块大小)、acknowledgement(确认接收)等协议控制消息调整传输参数。

⑥ 断开连接:客户端发送closeStream和disconnect命令,终止会话。

6. 变种协议

· RTMPE:基于 Adobe 私有加密算法(RC4)加密消息,无需 SSL;

· RTMPS:在 RTMP 基础上添加 TLS/SSL 加密(类似 HTTPS),端口 443;

· RTMPT:将 RTMP 封装在 HTTP POST 请求中,穿透防火墙(端口 80),延迟较高;

· RTMFP:基于 UDP 的 P2P 变种,减少服务器负载(用于低延迟互动场景)。

2.5、总结:技术细节对比

协议

核心载体

关键标识 / 字段

延迟特性

典型端口

RTP

媒体数据帧

SSRC、Timestamp、序列号

低(依赖 UDP)

动态分配

RTCP

控制 / 统计信息

SR/RR 报告、丢包率、抖动

辅助 RTP 优化

RTP+1

RTSP

控制指令

Session ID、SDP 描述

控制指令低延迟

554

RTMP

消息 + 块

块流 ID、消息类型、Session

中低(1~3 秒)

1935

这些协议从不同层面解决了实时音视频传输的核心问题:RTP 关注 "数据怎么传",RTCP 关注 "传得好不好",RTSP 关注 "怎么控制传",RTMP 则是 "传输 + 控制" 的一体化方案。实际应用中常根据场景组合使用(如 RTSP+RTP/RTCP 用于监控,RTMP 用于直播推流)。