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 用于直播推流)。

相关推荐
猫头虎2 小时前
新手小白如何快速检测IP 的好坏?
网络·人工智能·网络协议·tcp/ip·开源·github·php
简鹿办公2 小时前
如何查询并访问路由器的默认网关(IP地址)?
网络协议·智能路由器·怎样查看路由器ip
小西↬2 小时前
vite+vue3+websocket处理音频流发送到后端
javascript·websocket·音视频
音视频牛哥4 小时前
Android RTMP推送|轻量级RTSP服务同屏实践:屏幕+音频+录像全链路落地方案
音视频·大牛直播sdk·android同屏方案·安卓无纸化会议·安卓无纸化同屏·无纸化同屏rtmp·无纸化会议rtsp
寒士obj4 小时前
HTTPS的工作原理
网络协议·http·https
渡我白衣5 小时前
Linux网络编程:UDP 的DictServer
linux·网络·网络协议·udp
AQin10125 小时前
IP 🆚 MAC,你分得清吗?
后端·网络协议
深度学习实战训练营6 小时前
中英混合的语音识别XPhoneBERT 监督的音频到音素的编码器结合 f0 特征LID
人工智能·音视频·语音识别
WADesk---瓜子6 小时前
用 AI 自动生成口型同步视频,短视频内容也能一人完成
人工智能·音视频·语音识别·流量运营·用户运营