😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 SDP (会话描述协议)🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰:2024-07-09 08:31:22
本文未经允许,不得转发!!!
目录
- 🎄一、概述
- 🎄二、SDP 语法结构
- 🎄三、SDP 描述解析
- 3.1 会话级别描述(Session description)
- 3.1 媒体级别描述(Session description)
- 🎄四、SDP 抓包分析
- 🎄五、总结
🎄一、概述
SDP,全称Session Description Protocol,会话描述协议,是一种用于描述多媒体会话参数的文本协议。
SDP对应的官方文档是RFC2327 ,文档链接:SDP: Session Description Protocol。
SDP定义了一种标准的格式,用于描述会话的各种参数,这些参数对于会话的参与者来说至关重要,因为它们需要根据这些信息来正确配置和连接到会话。SDP可包括以下媒体信息:
- 媒体类型(音频、视频等);
- 传送协议(RTP/UDP/IP, H.320等);
- 媒体格式(H264视频,AAC音频等);
- 传输地址和端口;
在RTSP框架中,SDP协议主要在响应DESCRIBE
请求时,为客户端提供启动和控制媒体流所需的所有必要信息。
🎄二、SDP 语法结构
SDP完全是文本形式的,采样UTF-8(RFC 2044)编码的ISO 10646字符集。选用文本形式,是为了提高便携性和传送方式的多样性。
一个SDP会话描述由多个形式为
<type>=<value>
的文本行组成。
<type>
:一般是一个字符,并且区分大小写。
<value>
:是一个结构化的文本字符串,其格式取决于<type>
。
另外,在=
两侧都不能有空格。
SDP通常分为两大部分:会话级别描述(Session description)和媒体级别描述(Media description)。会话级别描述涵盖了整个会话的通用信息,比如:所有者、会话标识、网络地址、时间范围等。媒体级别描述则针对每个媒体流提供具体的传输协议、端口、编解码器参数等信息,确保客户端能够正确地建立和控制各个媒体流。
下面是RFC2327中给出的SDP结构,其中带星号*
表示可选的。
Session description
v= (protocol version)
o= (owner/creator and session identifier).
s= (session name)
i=* (session information)
u=* (URI of description)
e=* (email address)
p=* (phone number)
c=* (connection information - not required if included in all media)
b=* (bandwidth information)
One or more time descriptions (see below)
z=* (time zone adjustments)
k=* (encryption key)
a=* (zero or more session attribute lines)
Zero or more media descriptions (see below)
Time description
t= (time the session is active)
r=* (zero or more repeat times)
Media description
m= (media name and transport address)
i=* (media title)
c=* (connection information - optional if included at session-level)
b=* (bandwidth information)
k=* (encryption key)
a=* (zero or more media attribute lines)
下图是中文的,可以对比学习:
🎄三、SDP 描述解析
3.1 会话级别描述(Session description)
-
版本号 (version)——必选
版本号是必选的,指定SDP消息遵循的协议版本。目前SDP仅有一个正式版本,即v=0v=0
-
所有者/创建者(Origin)——必选
"会话发起者"行的语法格式如下:o=<username> <session id> <version> <network type> <address type> <address>
共6个部分,每部分以单空格区分。
<username>
始发主机用户名,如果始发主机不支持用户标识的概念,则该字段填“-”。中不能包含空格。<sess-id>
是一个数字串。建议使用时间戳以保证唯一性。<sess-version>
当前会话描述的版本号。如果会话数据做了修改,则这个会话的版本号要增加,具体做法取决于开发工具。建议但不强制要求使用时间戳。<nettype>
描述网络类型。目前先定义"IN",它表示互联网,其他值待定。<addrtype>
描述网络地址类型,这里先定义两种取值:“IP4"和"IP6”。<unicast-address>
描述创建会话的主机地址。
总之,o=给出了这个版本会话描述的全球唯一标识。
-
会话名称(Session Name)——必选
s=
字段描述会话名称,是基于文本的。每个会话描述中有且仅有一个s=字段,且不能为空。如果一个会话没有实际意义,可以这样表述:s=(通过一个空格来表示会话名称)
。格式如下:s=<session name>
-
会话信息(Session Information)
提供会话的更详细描述或说明,可以包含额外的上下文信息、摘要、版权声明等。这是一个扩展字段,用于增强参与者对会话的理解,格式如下:i=<session information>
-
URI(Uniform Resource Identifier)
指向外部资源的统一资源标识符(URI),比如:网页、文档或其他相关材料,这可以为参与者提供会话的补充信息或进一步指导。格式如下:u=<uri>
-
电子邮件地址(Email Address)
提供所有者或会话管理员的电子邮件联系方式,以便参与者在需要时能够通过电子邮件进行沟通。格式如下:e=<email-address>
-
电话号码(Phone Number)
提供所有者或会话管理员的电话联系方式,作为另一种与会话相关的辅助联系方式。格式如下:p=<phone-number>
-
连接信息(Connection Data)
描述会话使用的网络类型、地址类型以及连接地址,这些信息用于帮助参与者找到并接入会话。在网络类型和地址类型与o=字段相同的情况下,这一字段可以省略。比如:“c=IN IP4 236.255.1.1”表示会话使用Internet网络,地址类型为IPv4,连接地址为组播地址236.255.1.1。格式如下:c=<nettype> <addrtype> <connection-address>
-
带宽信息(Bandwidth Information)
指定会话所需的总体带宽或特定类型的带宽。<bwtype>
可以是AS(应用层信号,Application-Specific),表示总体带宽需求,或者是CT(会议总带宽,Conference Total)等特定类型。<bandwidth>
是带宽值,单位为kpbs。比如:“b=AS:1024”表示会话请求1024 kbps的总体带宽。格式如下:b=<bwtype>:<bandwidth>
-
时间描述(Timing)
格式:t=<start-time> <stop-time>
作用: 定义会话的开始时间和结束时间,时间以NTP格式的绝对时间戳表示,单位为秒。如果<stop-time>
为0,表示过了<start-time>
之后,会话一直持续。如果<start-time>
和<stop-time>
都为0,表示持久会话。 -
加密密钥(Encryption Key)
格式:k=<method>[:<encryption key>]
-
属性(Attributes)
格式:a=<attribute>[:<value>]
作用: a=字段用于携带会话级的其他属性或参数,比如:会话控制信息、安全设置、服务质量要求等。属性可以是预定义的标准属性,也可以是扩展属性,多个属性可以单独列出多行。
3.1 媒体级别描述(Session description)
SDP可以包含许媒体描述(Session description)。 每个媒体描述都以“m=”字段开始,然后到下一个“m=”字段或到会话结束时 描述终止 。媒体字段也有几个子字段:
- 媒体描述(Media description)——必选
定义了媒体流的基本属性,包括:类型、接收端口、传输协议以及支持的编解码器列表。格式如下:m=<media> <port> <transport> <fmt list>
<media>
:媒体类型,取值为:audio、video、text、application等,用于标识媒体流的内容类别。<port>
:接收媒体流的端口号。如果是单播传输,通常是一个具体的端口号。如果是组播传输,可能是端口范围。<number of ports>
:可选部分,用于指定端口数量,通常用于RTP/RTCP复用同一个端口范围的情况。<proto>
:传输协议,取值为:RTP/AVP、RTP/SAVP等。<fmt list>
:媒体格式列表,即RTP负载类型(Payload Type,PT),每个PT对应一种编解码器或编码格式。具体格式为逗号分隔的整数列表,比如:“96, 97, 98”。
- 媒体标题(Media title)
格式:i=<media title>
作用: 可选字段,提供媒体流的简短标题或说明,帮助参与者理解媒体流的内容 - 连接信息(Connection Information)
格式:c=<nettype> <addrtype> <connection-address>
作用: 在与会话级别c=字段不同的情况下,提供媒体流的特定连接信息。这些信息包括:网络类型、地址类型以及连接地址,用于指导客户端如何访问媒体流。如果与会话级别c=字段相同,则可以省略。 - 带宽信息(Bandwidth Information)
格式:b=<bwtype>:<bandwidth>
作用: 指定媒体流所需的特定带宽类型和带宽值。与会话级别b=字段类似,但针对单个媒体流。比如:“b=AS:512”表示该媒体流请求512 kbps的应用层带宽。 - 密钥(Encryption Key)
- 属性(Attributes)
格式:a=<attribute>[:<value>]
常见的媒体描述属性:a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encoding parameters>]
将RTP负载类型(payload type)映射到具体的编码名称、采样率(或时钟频率)以及可能的编码参数。a=fmtp:<format> <format specific parameters>
这个属性允许特定的格式参数能在SDP不能识别它们的前提下依然能够传递。这种格式必须是媒体定义的格式中的一种a=control:<URI>
在RTSP中,a=control:字段尤为重要,它提供了媒体流的控制URI。客户端可以通过该URI对特定媒体流执行独立的控制操作,如PLAY、PAUSE等。比如:“a=control:trackID=1”表示该媒体流的控制路径为“trackID=1”,客户端可以通过向服务器发送如“PLAY rtsp://example.com/path/to/stream/trackID=1”这样的命令来单独控制该媒体流。
🎄四、SDP 抓包分析
下面是RTSP取流过程中,服务端响应DESCRIBE
方法的一个SDP截图:
v=0
:表示版本号0;o=- 1720014950032000 1 IN IP4 192.168.3.225
:表示 主机不支持用户名,会话ID为 8913478,会话版本为1,网络类型为internet,地址类型为IPv4,所有者网络地址为192.168.3.225。s=LIVE555 Streaming Media v2016.07.19
:会话名称为 LIVE555 Streaming Media v2016.07.19;t=0 0
:<start-time>
和<stop-time>
都为0,表示持久会话a=tool:LIVE555 Streaming Media v2016.07.19
:创建SDP的工具的名称和版本号;
a=type:broadcast
:会议类型为 broadcast;
a=control:*
:控制URL通配符,*表示所有控制命令都适用于该会话。
a=range:npt=0-
:表示可用播放范围,npt=0-意味着从会话开始(0秒)到无穷大(即整个会话)
a=x-qt-text-nam:LIVE555 Streaming Media v2016.07.19
:为QuickTime兼容性提供额外的会话名,内容与s字段相同
a=x-qt-text-inf:1080
:为QuickTime兼容性提供额外的会话信息,内容与i字段相同m=video 0 RTP/AVP 96
:video,表示这是一个视频媒体流;端口为0表示使用动态端口分配,实际端口在SETUP请求中确定;传输协议为RTP/AVP,表示使用RTP(实时传输协议)传输,通过UDP进行封装,并允许在会话中协商负载类型;负载类型为96,表示视频流使用编号为96的负载类型,对应H.264编码。c=IN IP4 0.0.0.0
:网络类型为IN,表示Internet。地址类型为IP4,表示IPv4地址。地址为0.0.0.0,通常表示接收端地址待定,实际地址在SETUP请求中确定。b=AS:5000
:指定媒体流所需的带宽,此处为5000 kbpsa=rtpmap:96 H264/90000
:映射PT为96的负载类型到H.264编码,采样率为90000 Hz(表示视频帧率为90 kHz,实际为假定的值,视频帧率通常以fps为单位)。a=fmtp:96 packetization-mode=1;profile-level-id=64002A;sprop-parameter-sets=Z2QAKq2EAQwgCGEAQwgCGEAQwgCEO1A8ARPyoA==,aO48sA==
:提供PT为96的H.264编码的详细参数;packetization-mode=1
表示采用单NALU(网络抽象层单元)模式;profile-level-id=64002A
:指定H.264的Profile和Level;sprop-parameter-sets
包含两个参数集(SPS和PPS),它们是解码视频流所必需的额外参数。a=control:track1
:指定媒体流的控制URI,trackID=1表示客户端可以通过此标识符对视频流进行独立的控制操作m=audio 0 RTP/AVP 97
:audio,表示这是一个音频流;端口为0表示使用动态端口分配,实际端口在SETUP请求中确定;传输协议为RTP/AVP,表示使用RTP(实时传输协议)传输,通过UDP进行封装,并允许在会话中协商负载类型;c=IN IP4 0.0.0.0
:网络类型为IN,表示Internet。地址类型为IP4,表示IPv4地址。地址为0.0.0.0,通常表示接收端地址待定,实际地址在SETUP请求中确定。b=AS:768
:指定媒体流所需的带宽,此处为768 kbpsa=rtpmap:97 PCMA/48000/2
:映射PT为97的负载类型到PCMA编码;采样率为48000HZ,双通道;
a=control:track2
:指定媒体流的控制URI,trackID=2表示客户端可以通过此标识符对视频流进行独立的控制操作
🎄五、总结
本文主要介绍 SDP(会话描述协议)的格式、语法结构、描述解析等。
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁
参考:
从零开始精通RTSP之SDP格式详解
SDP协议总结