【音视频协议篇】RTSP系列

发布于:2025-07-21 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

🌈前言🌈    

📁 RTSP协议

📂 推流过程

📂 拉流过程

📁 RTP协议

📂 H.264数据打包到RTP

📂 AAC数据打包到RTP

📁 RTCP协议

📂 媒体内同步

📂 媒体间同步

📁 SDP协议

📁 格式规范

📁 总结


🌈前言🌈    

        主要讲解RTSP, RTP, RTCP 和 SDP,这些协议概念,如何传输数据以及在传输数据过程中发挥了什么作用。

        本篇内容资源来源B站up主:北小菜 RTSP系列视频讲解,以及他分享的内容做出的总结。【音视频开发】《从零开始编写一个RTSP服务器》第1讲:RTSP协议讲解及代码实现_哔哩哔哩_bilibili

📁 RTSP协议

        RTSP,实时传输流协议,是一个应用层协议。RTSP并不会发送媒体数据,只是完成服务器和客户端之间的信令交互,RTP协议负责将媒体数据的传输,RTCP协议负责RTP数据包的监视和反馈。

        RTP和RTCP并没有规定传输层的类型,可以选择UDP或TCP,RTSP的传输层协议要求TCP。

RTSP协议:负责服务器与客户端之间的请求和响应。

RTP协议:负责服务器与客户端之间传输媒体数据。

RTCP协议:负责提供有关RTP传输质量的反馈,就是确保RTP传输的质量。

        RTSP操作的基本流程:

1. 客户端连接到流服务器并发送一个RTP描述命令(DESCRIBE)。流服务器通过一个SDP描述来进行反馈,反馈信息包括了流数量,媒体类型等信息。

2. 客户端分析SDP描述,并为会话中的每一个流发送一个RTSP建立命令(SETUP),RTSP建立命令告诉服务器,客户端接受媒体数据的端口。

3. 流媒体连接建立完成后,客户端向服务器发送一个播放命令(PLAY),服务器开始在UDP上传送媒体流(RTP包)到客户端。播放过程中客户端可以向服务器发送命令来控制快进,后退和暂停等。

4. 最后,客户端发送一个终止命令(TERADOWN)来结束流媒体会话。

📂 推流过程

1. OPTION 询问服务器端可用的方法

        Client --> Server: OPTION request,询问Server有哪些方法。

        S --> C: OPTION ressponse,回应信息的public字段中包括了提供的所有可用方法。

2. ANNOUNCE 发送媒体描述信息

        C --> S: ANNOUNCE request,C发送媒体描述信息给S

        S --> C:ANNOUNCE response,S回应媒体描述信息

3.  SETUP建立RTSP会话

        3.1 C->S: SETUP request,通过Transport头字段列出可接受的传输选项,请求S建立会话

        S->C: SETUP response,S建立会话,通过Transport头字段返回选择的具体转输选项,并返回建立的Session ID

        3.2 C->S:SETUP request

        S->C:SETUP response

4. RECORD请求传送数据

        C->S: RECORD request,C向S请求发送数据

        S->C: RECORD response,S回应该允许的信息

5. RTP数据推送

        C->S:发送流媒体数据,通过RTP协议传送数据

视频

音频

6. TEARDOWN关闭会话,退出

        C->S:TEARDOWN request,C请求关闭会话

        S->C:TEARDOWN response,S回应该请求

📂 拉流过程

1. 查询服务器端可用方法

        C->S: OPTION request,询问S有哪些方法可用

        S->C: OPTION response,S回应信息的public头字段中包括提供的所有可用方法

2. DESCRIBE得到媒体描述信息

        C->S:DESCRIBE request,要求得到S提供的媒体描述信息

        S->C:DESCRIBE response,S回应媒体描述信息,⼀般是sdp信息

3. SETUP建立RTSP会话

        3.1 S->C:SETUP response,S建立会话,通过Transport头字段返回选择的具体转输选项

        S->C:SETUP response,S建立会话,通过Transport头字段返回选择的具体转输选项

        3.2 C->S:SETUP request,通过Transport头字段列出可接受的传输选项,请求S建立会话

        S->C:SETUP response,S建立会话,通过Transport头字段返回选择的具体转输选项

4. PLAY请求开始传送数据

        C->S:PLAY request,C请求S开始发送数据

        S->C:PLAYresponse,S回应该请求的信息

5. RTP数据传送播放中

        S->C: 发送流媒体数据,通过RTP协议传送数据

6. TEARDOWN关闭会话,退出

        C->S:TEARDOWN request,C请求关闭会话

        S->C:TEARDOWN response,S回应该请求

SSRC是什么?由谁来定义,是client还是server?

        SSRC用于在RTP会话中​​唯一标识一个媒体流的同步源​​,确保接收端能够正确区分和处理多个并发流。在RTP协议中会进行讲解。

        推流是客户端自己定义的;拉流的时候是服务器发送过来的。

Session Id 由谁而来?

        Session ID(会话标识符)由服务器(Server)生成并分配给客户端​​,用于唯一标识一个媒体流控制会话。

Transport字段的意义?

        ​Transport字段​​是SETUP请求和响应中的核心头部字段,用于​​协商媒体流的传输参数​​,包括传输协议、端口、传输模式等。它直接决定了媒体数据(通过RTP/RTCP)如何从服务器传输到客户端。​​​​​

rtptime,npt是什么,如果解决音视频同步问题?

        这些内容会在RTCP讲完之后,有一个完整的理解。

        RTSP服务器默认端⼝是554,在客户端SETUP的时候会把自身的RTP和RTCP端口告知服务器。在RTSP的session建立后,会使用RTP/RTCP在约定好的端口上传输数据。

📁 RTP协议

        RTP,即实时传输协议,用于传送媒体数据(如音频和视频),由RTP报头和数据两部分组成,RTP数据部分称为有效载荷(payload)。

struct RtpPacket
{
    struct RtpHeader rtpHeader;
    uint8_t payload[0];
};

struct RtpHeader
{
    /* byte 0 */
    uint8_t csrcLen : 4;//CSRC计数器,占4位,指示CSRC 标识符的个数。
    uint8_t extension : 1;//占1位,如果X=1,则在RTP报头后跟有一个扩展报头。
    uint8_t padding : 1;//填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。
    uint8_t version : 2;//RTP协议的版本号,占2位,当前协议版本号为2。
 
    /* byte 1 */
    uint8_t payloadType : 7;//有效载荷类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等。
    uint8_t marker : 1;//标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。
 
    /* bytes 2,3 */
    uint16_t seq;//占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。接收者通过序列号来检测报文丢失情况,重新排序报文,恢复数据。
 
    /* bytes 4-7 */
    uint32_t timestamp;//占32位,时戳反映了该RTP报文的第一个八位组的采样时刻。接收者使用时戳来计算延迟和延迟抖动,并进行同步控制。
 
    /* bytes 8-11 */
    uint32_t ssrc;//占32位,用于标识同步信源。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的SSRC。
 
   /*标准的RTP Header 还可能存在 0-15个特约信源(CSRC)标识符
   每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源
   */
   uint32_t csrc[16];
};

V:版本号,占2位。

P:填充标志位,占1位,如果P=1,则该报文的尾部填充一个或多个额外的八位组,他们不是有效载荷的一部分。

X:扩展标志,占1位,如果X=1,则在RTP包头后跟一个扩展报头。

CC:CSRC计数器,占4位,指示CSRC标识符的个数。

M:标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记帧的开始。

PT:有效载荷类型,占7位,用于说明RTP报文中有效载荷的类型,如JPEM图像等。

序列号:占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号+1。接受者通过序列号来检测报文丢失的情况,重新排序报文,恢复数据。

时戳:占32位,反映了RTP报文的第一个八位组的采样时刻。接受者使用时间戳来计算延迟和延迟抖动,并进行同步操作。

同步信源(SSRC)标识符:占32位,用于标识同步信源。该标识符是随机选择的,参与同一个视频会议的两个同步信源不能有相同的SSRC。

特约信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报⽂有效载荷中的所有特约信源。

同步信源产生媒体流的信源,例如麦克风,摄像机,RTP混合器等。通过RTP报头的一个32位数字SSRC标识符来标识,而不依赖于网络地址,接受者根据SSRC标识符来区分不同的信源,进行RTP报文的分组。

特约信源:当混合器收到一个或多个同步信源的RTP报文后,进过混合处理产生一个新的组合RTP报文,并把混合器作为组合RTP报文的SSRC,二将原来所有的SSRC都作为CSRC传送个接受者,使得接受者知道组合报文的各个SSRC。

发送端:上层程序以分组形式将编码获得媒体数据传送给RTP通信模块,作为RTP报文的有效载荷,RTP通信模块将根据上层应用提供的参数在有效载荷前添加RTP包头,形成RTP报文,通过SOCKET接口选择UDP协议发送出去。

接收端:RTP通信模块通过SOCKET接口接受RTP报文后,将RTP包头分离出来做相应的处理,再将RTP报文的有效载荷作为数据分组传递给上层应用。

📂 H.264数据打包到RTP

        H.264是由一个有一个的NALU组成,每个NALU之间使用00 00 00 01 或 00 00 01分隔开,每个NALU的第一个字节都有特殊含义。

  1. F:禁止位,占用NALU的第一个位,当禁止位置位1时表示语法错误;

  2. NRI:参考级别,值越大,该NAL越重要

  3. Type:NAL单元数据类型,标识该NAL单元数据类型。

H.264可以有3种RTP打包方式

  1. 单NALU打包:一个RTP包包含一个NALU

  2. 聚合打包:对于较小的NALU,一个RTP包可以包含多个NALU

  3. 分片打包:对于较大的NALU,一个NALU可以分为多个RTP包发送

        采用分片打包,需要在载荷中添加两个额外的直接信息,表示同一个NALU,然后再是NALU。

📂 AAC数据打包到RTP

        AAC的打包方式就是从ADTS帧取出ADTSS头部,取出AAC数据,每一帧数据打包到RTP包,在RTP载荷总前4个字节是有特殊含义的,然后再是AAC数据。

        第一个字节为0x00,第二字节为0x10,第三个字节和第四个字节保存AAC Data的大小,最多只能保存13bit,第三个字节保存数据大小的高8位,第四个四节的高5位保存数据大小的低5位。

📁 RTCP协议

        RTCP,实时传输控制协议,是实时传输协议RTP的一个姊妹协议。RTP使用一个偶数UDP端口,RTCP则是使用RTP的下一个端口。两个联合工作,RTP实施实际的数据传输,RTCP负责将控制包传送到电话中的每个人。主要功能是RTP正在提供的服务质量反馈。

        我们来重点看一下SR报文格式:

        有两个重要的域名:NTP timestamp 和 RTP timestamp

📂 媒体内同步

1. npt:Normal Play Time,正常播放时间,是播放啥时间轴上的相对时间,单位是秒,表示媒体内容从开始播放起经过的时间。

2. rtptime:是媒体采样时刻,32位整数,单位由媒体类型决定。不同媒体流的RTP时间戳独立增长,初无法直接比较。接收者使用时戳来计算延迟和延迟抖动,并进行同步控制。

        npt是影片开始的相对时间,rtptime是会话开始的相对时间。在客户端计算播放时间戳的公式如下:

        nptUs = (current_rptTime - start_rtptime)

        start_rtptime 与 start_npt 分别是 PLAY 请求的 Response 中的 rtptime 和 npt 。
        current_rtpTime 是当前收到的 RTP 包头中的 rtptime 。
        scale 为 PLAY 请求的 Response 中的 scale 值。在正常播放的情况下为 1 ,快速播放时⼤于 1 ,当处于反向扫描模式时小于 -1。

📂 媒体间同步

        上面的处理方法是媒体内的同步,如果实现媒体间的同步(不同设备的同步),还需要RTCP的SR中的RTP timestamp和NTP timestamp。

ntp: NTP是​​全局绝对时间基准​​,64位值(高32位为秒,低32位为小数),从1900年1月1日0时起算。

        采集媒体时,同时记录​​RTP时间戳​​和对应的​​NTP时间​​,并通过RTCP SR包发送给接收端。

这样我们就可以将不同系统或设备的时间标记对齐到统一的时间基准上,确保数据在时序上的一致性。

📁 SDP协议

        Session Description Protocol 会话描述协议,在流媒体通信中负责携带媒体信息,这样通信双方能够协商好双方具有的媒体能力。通过SDP会荷载到其他信令协议中:SIP,RTSP,其中WebRTC中没有明确规定信令协议,但会荷载到offer,answer报文中。

        通过SDP,通信双方可以知道对方的:支持的音视频解码器,网络信息以及其他重要信息。SDP在WebRTC或voip通话汇总具有重要的作用,通过文本对媒体信息进行描述。其本身并不传递媒体数据,而是用于参与媒体会话的双方进行媒体协商。

📁 格式规范

        SDP提供了描述从会话信息到可能的会话参与者的格式。一个会话基本会有许多媒体流组成,因此会话描述包含了许多与每个媒体流相关的参数说明,此外还包括了与会话整体相关的通用信息。

        所以SDP消息既包含了会话级参数,又包括了媒体级参数。

  • 一个会话级描述(会话层)

会话的名称和目的
会话存活时间
会话中包括多个媒体信息

v=(协议版本)
o=(所有者/创建者和会话标识符)
s=(会话名称)
c= * (连接信息 ― 如果包含在所有媒体中,则不需要该字段)
t=会话存活时间
a = * (0 个或多个会话属性行
  • 多个媒体级描述(媒体层)

媒体格式
传输协议
纯属IP和端口
媒体负载类型


m=(媒体名称和传输地址)
c=*(连接信息 ― 如果包含在所有媒体中,则不需要该字段)
b=*(带宽信息)
a = * (0 个或多个会话属性行)

字段含义详解:

1、version 必选

2、session name 必选

s= [sission name] 会话名,s=-表示忽略会话

3、origion/owner 必选

o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>

例子:o=- 6474257184349789314 2 IN IP4 127.0.0.1

4、connection 可选

c=<network type><address type><connection address>

例子:c=IN IP4 0.0.0.0

5、media 必须

m=<media><port><transport><fmt/payload type list>

例子:m=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126

6、attributes 可选

a=<TYPE> 或a=<TYPE>:<VALUE>

例子:a=frameate:<帧速率>

7、rtpmap 可选(重要)

a=rtpmap:<fmt/payload type><encoding name>/<clock rate>[/<encodingparameters>]

例子:a=rtpmap:111 opus/48000/2

8、fmtp 可选

a=fmtp:<format/payload type> paramerters

例子:a=fmtp:101 apt=100

📁 总结

        以上,就是我整理的目前RTSP系列协议详解,重点介绍了RTSP系列协议的概念,起到什么作用。

        如果有不对的地方,欢迎大家在评论区指出,一起学习。


网站公告

今日签到

点亮在社区的每一天
去签到