rtp、rtcp、rtsp、rtmp协议详解

一、协议阐释

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

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

定义

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

  1. 核心功能
    数据标识与封装:
    为音视频数据(如 H.264 视频、AAC 音频)添加头部信息,包括:
    · 序列号:用于接收端检测丢包和重排序;
    · 时间戳:标记数据产生的时间,用于接收端同步播放(如音画同步);
    · 负载类型:标识数据类型(如 H.264、PCM 音频),帮助接收端解析;
    · SSRC(同步源标识符):区分不同的数据源(如多人视频会议中不同的发言人)。
    实时性优先:
    基于 UDP 传输(UDP 无连接、无重传机制),牺牲部分可靠性换取低延迟,适合实时场景(如视频通话、直播)。
  2. 工作原理
    · 发送端:将采集的音视频数据按帧分割,添加 RTP 头部后封装为 RTP 包,通过 UDP 发送;
    · 接收端:解析 RTP 包头部,利用序列号重排序、时间戳同步数据,再交给解码器播放。
  3. 特点
    · 不保证可靠传输(丢包、乱序需上层或配套协议处理);
    · 灵活支持多种编码格式(通过负载类型字段适配);
    ·通常与 RTCP 配合使用(依赖 RTCP 获取传输质量反馈)。
  4. 应用场景
    · 实时音视频通话(如 Zoom、微信视频);
    · 直播(如游戏直播的实时画面传输);
    · 视频会议、IP 电话等。

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

定义

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

  1. 核心功能
    传输质量监控与反馈:
    接收端通过 RTCP 向发送端反馈关键指标,包括:
    · 丢包率(接收包数 / 发送包数);
    · 网络抖动(数据包到达时间的波动);
    · 接收缓冲区状态等。发送端根据反馈调整传输策略(如降低码率、调整帧率)。
    同步与标识:
    · 提供时钟同步信息,辅助 RTP 解决多源流(如音频和视频)的同步问题;
    · 通过 "源描述包"(SDES)传递数据源信息(如用户名、设备标识),方便区分不同发送端。
    会话管理:
    监控参与会话的节点状态(如加入 / 离开),确保会话稳定性。
  2. 工作原理
    · RTCP 与 RTP 共用会话(同一组 IP 和端口),通常 RTP 使用偶数端口(如 5004),RTCP 使用相邻奇数端口(如 5005);
    · 发送端和接收端周期性发送 RTCP 包(频率随会话规模动态调整,避免占用过多带宽);
    · 发送端通过 RTCP 反馈调整编码参数或传输策略(如丢包率过高时降低码率)。
  3. 特点
    · 依赖 RTP 存在,无法单独使用;
    · 带宽占用低(通常不超过会话总带宽的 5%);
    · 被动反馈为主(接收端主动向发送端反馈)。
  4. 应用场景
    所有使用 RTP 的场景都需要 RTCP 配合,如视频会议、实时通话、直播等,用于优化传输质量。

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

定义

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

  1. 核心功能
    会话控制:
    支持客户端向服务器发送控制指令,包括:
    · PLAY(播放)、PAUSE(暂停)、STOP(停止);
    · SETUP(建立会话,协商传输方式,如 RTP/UDP 或 RTP/TCP);
    · TEARDOWN(终止会话);
    · DESCRIBE(获取媒体流描述信息,如编码格式、码率)。
    媒体协商:
    客户端与服务器协商媒体参数(如编码格式、传输协议),确定后通过 RTP 传输实际数据。
  2. 工作原理
    基于 "客户端 - 服务器" 模型,使用 TCP(默认端口 554)传输控制指令;
    流程示例:
    · 客户端发送DESCRIBE请求,获取媒体流元数据(如 SDP 格式的描述);
    · 客户端发送SETUP请求,协商传输方式(如 RTP 端口、协议);
    · 客户端发送PLAY请求,服务器通过 RTP 开始传输媒体数据;
    · 客户端可发送PAUSE/STOP暂停或终止传输。
  3. 特点
    · 仅负责控制,不传输媒体数据(媒体数据由 RTP/RTCP 承载);
    · 支持双向交互(客户端可控制,服务器也可推送状态);
    · 适合 "按需实时流" 场景(如随时暂停、快进)。
  4. 应用场景
    · IP 摄像头、监控系统(用户远程控制摄像头的实时画面播放 / 暂停);
    · 视频点播(VOD)的实时控制(如在线课程的暂停、快进);
    · 安防监控平台(远程调取摄像头实时画面)。

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

定义

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

  1. 核心功能
    媒体数据传输:
    直接封装音视频数据(如 H.264、AAC)和元数据(如视频分辨率、码率),通过 "消息"(Message)格式传输,支持低延迟(通常 1-3 秒)。
    会话控制:
    支持连接建立、流发布(如主播推流)、流订阅(如观众拉流)等操作,通过 "命令消息"(Command Message)实现。
    协议扩展:
    衍生出多个变种,如:
    · RTMPE:加密传输(增强安全性);
    · RTMPT:封装在 HTTP 中传输(穿透防火墙);
    · RTMPS:基于 SSL/TLS 加密的 RTMP(类似 HTTPS)。
  2. 工作原理
    · 基于 TCP 建立持久连接,通过 "握手" 过程确认版本和加密方式;
    · 数据分为 "消息"(Message)和 "块"(Chunk):消息是逻辑单元(如一段视频、一条控制指令),块是传输单元(将消息拆分后按固定大小传输,减少开销);
    · 支持 "推流"(如主播向服务器发送流)和 "拉流"(如观众从服务器获取流)两种模式。
  3. 特点
    · 基于 TCP,保证数据可靠传输(但可能因重传导致延迟略高,需优化);
    · 低延迟性能较好(优于 HLS/DASH 等基于 HTTP 的协议);
    · 兼容性强(早期广泛支持,目前仍用于直播推流 / 拉流)。
  4. 应用场景
    · 直播平台(如早期的 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 用于直播推流)。

相关推荐
汤愈韬1 天前
NAT策略
网络协议·网络安全·security·huawei
汤愈韬1 天前
Full Cone Nat
网络·网络协议·网络安全·security·huawei
行业探路者1 天前
二维码标签是什么?主要有线上生成二维码和文件生成二维码功能吗?
学习·音视频·语音识别·二维码·设备巡检
汤愈韬1 天前
NAT ALG (应用层网关)
网络·网络协议·网络安全·security·huawei
汤愈韬1 天前
双向NAT
网络·网络协议·网络安全·security·huawei
Android系统攻城狮1 天前
Android16音频之获取Record状态AudioRecord.getState:用法实例(一百七十七)
音视频·android16·音频进阶
*才华有限公司*1 天前
RTSP视频流播放系统
java·git·websocket·网络协议·信息与通信
liefyuan1 天前
【RV1106】rkipc:分析(一)
音视频
aqi001 天前
FFmpeg开发笔记(九十八)基于FFmpeg的跨平台图形用户界面LosslessCut
android·ffmpeg·kotlin·音视频·直播·流媒体
广州服务器托管1 天前
比较优秀的视频音频播放器PotPlayer64-v1.7.22764绿色版
运维·windows·计算机网络·电脑·音视频·可信计算技术