概述

        SDP,即会话描述协议,英文全称为Session Description Protocol,是一种用于描述多媒体会话参数的文本协议(对应RFC2327)。SDP是中立于传输协议的,能够适应多种实时通信场景,比如:VoIP通话、视频会议和实时流媒体。SDP定义了一种标准的格式,用于描述会话的各种参数,包括:媒体类型、媒体格式、媒体地址等。这些参数对于会话的参与者来说至关重要,因为它们需要根据这些信息来正确配置和连接到会话。

        在RTSP框架中,SDP主要通过DESCRIBE请求和响应来交换,为客户端提供启动和控制媒体流所需的所有必要信息。

SDP基本结构

        一个完整的SDP消息是一个文本字符串,由若干行组成。每行代表一个特定的属性或参数,行与行之间通过换行符分隔。每行的格式为:<类型>=<值>。其中,<类型>是一个字符,<值>是结构化的文本串,其格式依<类型>而定。比如:v=0表示协议版本号为0。

        SDP中包含了一系列字段,每个字段都描述了会话中的一个参数或配置信息。SDP通常分为两大部分:会话级别描述和媒体级别描述。会话级别描述涵盖了整个会话的通用信息,比如:所有者、会话标识、网络地址、时间范围等。媒体级别描述则针对每个媒体流提供具体的传输协议、端口、编解码器参数等信息,确保客户端能够正确地建立和控制各个媒体流。

        SDP的整体结构如下。

(以下为会话级别描述)
v=版本号
o=所有者/创建者(用户名和会话标识符)
s=会话名(一般为会话的主题)
i=*会话信息(可选的会话描述)
u=*URI(统一资源标识符,可选的会话描述文件位置)
e=*电子邮件地址(所有者的联系信息,可选)
p=*电话号码(所有者的联系信息,可选)
c=*连接信息(网络类型、地址类型及地址)
b=*带宽信息(会话总体或单个媒体的带宽限制)
t=时间描述(会话开始和结束时间)
r=*重复时间描述(会话的重复周期)
z=*时间区域偏移(用于处理不同时区的参与者)
k=*加密密钥(如需加密会话)
a=*属性行(各种附加会话或媒体级别的属性)

(以下为媒体级别描述)
m=媒体名称(类型和传输协议) port/数目的传输地址
i=*媒体标题(可选的媒体描述)
c=*媒体连接信息(如果与会话级连接信息不同)
b=*媒体带宽信息(如果与会话级带宽信息不同)
k=*媒体加密密钥(如果与会话级加密密钥不同)
a=*媒体属性行(各种附加媒体级别的属性)

...(可能有多个媒体级别描述)

(注:带星号的字段表示可选)

会话级别描述

        这部分信息适用于整个会话,而不是针对某个特定的媒体流。会话级别字段通常出现在SDP消息的开头,常见的字段如下。

        版本(Version)

        所有者/创建者(Origin)

        会话名称(Session Name)

        会话信息(Session Information)

        URI(Uniform Resource Identifier)

        电子邮件地址(Email Address)

        电话号码(Phone Number)

        连接信息(Connection Data)

        带宽信息(Bandwidth Information)

        时间描述(Timing)

        加密密钥(Encryption Key)

        属性(Attributes)

媒体级别描述

        每个媒体流(比如:视频、音频、文本等)在SDP中都有独立的媒体级别描述段,一个会话可以包含一个或多个这样的描述段。在媒体级别描述中,常见的字段如下。

        媒体类型(Media Type)

        媒体标题(Media Title)

        连接信息(Connection Data)

        带宽信息(Bandwidth Information)

        RTP映射(RTP Mapping)

        编码参数(Format Parameters)

        控制信息(Control)

        其他媒体属性(Other Attributes)

实际案例分析

        下面,我们通过一个实际的SDP报文来进行逐行的分析和讲解。

v=0
o=- 1586545639965536 1586545639965536 IN IP4 192.168.50.100
s=H.264 Video Stream
i=Live video from Camera 1
u=http://www.example.com/camera1.html
t=0 0
a=tool:LIVE555 Streaming Media v2016.04.09
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:H.264 Video Stream
a=x-qt-text-inf:Live video from Camera 1
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42001E;sprop-parameter-sets=Z0LAH9kAUAWdAAADABAAAAMApG4H4Q==,aO48gA==
a=control:trackID=1

        v=0:表示SDP遵循版本0的规范。

        o=- 1586545639965536 1586545639965536 IN IP4 192.168.50.100:用户名为-,此处服务器未填写实际用户名。会话标识符和会话描述的版本均为NTP时间戳。网络类型为IN,表示Internet。地址类型为IP4,表示IPv4地址。地址为192.168.50.100,即服务器的IP地址。

        s=H.264 Video Stream:显示会话的主题,此处为H.264 Video Stream。

        i=Live video from Camera 1:提供会话的详细描述,此处为Live video from Camera 1。

        u=http://www.example.com/camera1.html:指向有关会话的外部资源链接,此处可能为摄像头详情页。

        t=0 0:表示会话没有固定的开始和结束时间(无限期有效)。

        a=tool:LIVE555 Streaming Media v2016.04.09:工具名称和版本,表明使用LIVE555 Streaming Media工具,版本为v2016.04.09。

        a=type:broadcast:会话类型,此处为broadcast,表示广播会话。

        a=control:*:控制URL通配符,*表示所有控制命令都适用于该会话。

        a=range:npt=0-:表示可用播放范围,npt=0-意味着从会话开始(0秒)到无穷大(即整个会话)。

        a=x-qt-text-nam:H.264 Video Stream:为QuickTime兼容性提供额外的会话名,内容与s字段相同。

        a=x-qt-text-inf:Live video from Camera 1:为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:500:指定媒体流所需的带宽,此处为500 kbps。

        a=rtpmap:96 H264/90000:映射PT为96的负载类型到H.264编码,采样率为90000 Hz(表示视频帧率为90 kHz,实际为假定的值,视频帧率通常以fps为单位)。

        a=fmtp:96:提供PT为96的H.264编码的详细参数。

        packetization-mode=1:表示采用单NALU(网络抽象层单元)模式。

        profile-level-id=42001E:指定H.264的Profile和Level,此处为Baseline Profile,Level 3.1。

        sprop-parameter-sets:包含两个参数集(SPS和PPS),它们是解码视频流所必需的额外参数。

        a=control:trackID=1:指定媒体流的控制URI,trackID=1表示客户端可以通过此标识符对视频流进行独立的控制操作。

SDP在RTSP中的应用

        在RTSP中,SDP主要通过以下三种方式发挥作用。

        DESCRIBE请求与响应

        客户端发送DESCRIBE请求给服务器,服务器返回包含SDP描述的响应。客户端解析SDP以了解媒体流的详细信息,比如:编解码器、传输协议、端口等,并据此设置后续的SETUP请求。

        媒体协商

        客户端根据SDP提供的媒体格式列表选择支持的编解码器,并在SETUP请求中告知服务器。服务器确认选择后,双方基于选定的编解码器进行媒体传输。

        会话控制

        客户端通过解析SDP中的a=control属性,得知每个媒体流的控制路径,从而能独立地对音频、视频等不同媒体流执行PLAY、PAUSE等操作。

总结

        在RTSP的交互过程中,SDP起着传递会话参数的作用。当客户端向服务器发送DESCRIBE请求时,服务器会返回一个包含SDP描述的响应。这个SDP描述包含了会话的所有必要参数,比如:媒体类型、传输协议、媒体格式等。总的来说,SDP是流媒体传输中不可或缺的一部分。它提供了描述多媒体会话的标准格式和必要参数,使得参与者能够正确地配置和连接到会话。

04-15 10:02