SDP 规范

SDP 规范

概述

SDP(Session Description Protocol)是一种用于描述多媒体会话的文本协议。它定义了一种标准的格式,用于在网络中传输多媒体会话的描述信息,包括会话参数、媒体类型、媒体格式、网络地址等。

一般格式要求

SDP会话描述由多行文本组成,其形式为=,其中始终为一个字符,且区分大小写,是一个结构化文本字符串,具体格式由决定,一般情况下区分大小写。“=”号两边不应许有空格,通常情况下是由单个空格字符或自由格式字符串分割的多个字段。

会话描述构成

  • 会话描述包括会话级别描述和零个或多个可选的多个媒体级别描述
  • 会话级别描述适用于整个会话和所有的媒体流
  • 媒体级别描述适用于单个媒体流
  • 会话级别描述以"v="行开始,一直到第一个媒体级别描述为止
  • 媒体级别描述以"m="行开始,一直到下一个媒体级别描述或者整个会话描述的结尾
  • 会话级别描述可以理解为整个会话中所有media的默认值,但是可以通过媒体级别描述设置同名字段对其进行覆盖

具体字段说明

Protocol version
v=0

"v="字段给出会话描述协议的版本,没有次版本号

Origin
o=    

在 SDP(Session Description Protocol)中,“o”(Origin)字段用于标识会话的发起者和会话的唯一标识符,

全局唯一标识一个session.

"o"字段由以下几个字段组成:

  1. 用户名(username):指定会话的发起者的用户名或标识符。通常是一个字符串,用于识别会话的发起者。通常为用户在发起会话主机的登录名称,如果发起主机不支持用户ID的概念,该字段的value会是"-",但是该字段的value值不能包含空格。
  2. 会话ID(session ID):一个唯一的会话标识符,用于识别会话的特定实例。它通常是一个数字或随机生成的字符串,分配方法由创建工具决定,建议使用网络时间协议NTP时间戳来唯一确定。
  3. 会话版本(session version):一个整数值,用于标识会话的版本号。每当会话发生重大变化时(例如媒体流的添加或删除),会话版本号都会增加,同时建议使用NTP时间戳。
  4. 网络类型(network type):指定网络类型,如 “IN”(Internet)。
  5. 地址类型(address type):指定地址类型,如 “IP4”(IPv4)或 “IP6”(IPv6)。
  6. 连接地址(connection address):指定会话发起者的连接地址。对于 IPv4,通常是一个点分十进制的 IP 地址;对于 IPv6,通常是一个冒号分隔的 IP 地址。

使用实例,一个示例的 Origin 字段可能如下所示:

o=john 1234567890 1 IN IP4 192.168.1.100

这表示会话由用户名为 “john” 的用户发起,会话 ID 为 “1234567890”,会话版本为 “1”,网络类型为 “IN”(Internet),地址类型为 “IP4”(IPv4),连接地址为 “192.168.1.100”。

Origin 字段的信息可以帮助会话的参与者了解会话的发起者和会话的唯一标识符,以便正确建立和管理会话。

Session Name
s=

“s”(Session Name)字段用于指定会话的名称或标题。它提供了一个简短的描述,用于标识会话的目的或内容,位于 SDP 描述文件的开头部分。它可以包含文本、数字、符号和空格,通常是一个简短的字符串,每个会话描述必须只有一个“s=”的字段。
Session Name 字段的作用是为会话提供一个易于理解和识别的名称。它可以描述会话的主题、活动、媒体内容或任何其他相关信息。例如,一个会议的会话名称可以是会议的名称,一个音频流的会话名称可以是音频流的描述,一个视频会话的会话名称可以是视频内容的描述等。
例如,一个示例的 Session Name 字段可能如下所示:

s=Conference Call

这表示会话的名称为 “Conference Call”,用于标识该会话是一个会议呼叫。

Session Name 字段的信息对于会话参与者很重要,它提供了关于会话内容的简要描述,帮助参与者了解会话的目的,并有助于正确识别和选择特定的会话进行参与。

Session description

Session Description 字段的格式如下:

i=
  • “i”(Session Description)字段用于提供会话的详细描述信息。它提供了关于会话的更多上下文和说明,帮助参与者更好地理解会话的内容、目的和特性。
  • Session Description 字段是一个可选字段(RFC2327中说到不建议省略),它位于 SDP 描述文件的开头部分。它可以包含任何文本信息,通常是一段详细的描述。
  • Session Description 字段的作用是提供有关会话的更详细的描述信息,以便参与者可以了解会话的特性和细节。它可以包括会话的目的、活动、参与者、媒体内容、时间安排、安全性要求、网络要求等等。
  • 例如,一个示例的 Session Description 字段可能如下所示:
i=Conference Call for Project Update

这表示会话的详细描述为 “Conference Call for Project Update”,用于提供有关会议呼叫的更详细信息,例如会议的目的是进行项目更新。

Session Description 字段的信息对于会话参与者很重要,它提供了更全面的会话描述,帮助参与者更好地了解会话的内容和目的,并为参与者提供正确的上下文。这有助于参与者做出适当的决策,确定是否要参与该会话。

URI
u=<uri>
  • URI字段用于指定会话的统一资源标识符(Uniform Resource Identifier),它表示一个资源的唯一标识符,例如一个网络地址、一个文件路径或一个API端点。
  • URI字段通常用于指定会话中的相关资源,例如媒体流的源地址、会话控制的终端地址等。
  • 此字段为可选字段,但是要是存在,必须在第一个媒体描述字段之前,并且每个会话最多只有一个URI字段。
  • 以下是URI字段的示例:
v=0
o=- 1234567890 1 IN IP4 192.168.1.1
s=SDP Example
u=http://example.com/my-sdp-description
c=IN IP4 192.168.1.1
t=0 0
m=audio 5004 RTP/AVP 0
a=rtpmap:0 PCMU/8000

在上面的例子中,URI字段指定了SDP会话描述的资源位置,即http://example.com/my-sdp-description。这个URI可以用来获取会话描述信息或其他相关资源。

通过使用URI字段,SDP可以与其他资源或服务进行集成,并提供更多的上下文信息和相关资源的访问方式。

Email Address and Phone Number
e=
p=

"e="字段用于指定与会议或会话相关的电子邮件地址,它可以用于提供会话的联系人或相关信息的联系方式,而"p="字段用于指定与会议或会话相关的电话号码,它可以用于提供会话的联系人或相关信息的电话联系方式。

  • 电子邮件字段(“e=”):这个字段用于提供会议或会话的联系人的电子邮件地址。可以在会议描述的会话级别或媒体级别中使用该字段。如果存在多个电子邮件字段,可以提供多个电子邮件地址。

例如:

v=0
o=- 1234567890 1 IN IP4 192.168.1.1
s=SDP Example
[email protected]
c=IN IP4 192.168.1.1
t=0 0
m=audio 5004 RTP/AVP 0
a=rtpmap:0 PCMU/8000

在上面的例子中,"[email protected]"指定了与会议相关的电子邮件地址。

  • 电话号码字段(“p=”):这个字段用于提供会议或会话的联系人的电话号码。可以在会议描述的会话级别或媒体级别中使用该字段。如果存在多个电话号码字段,可以提供多个电话号码。

例如:

v=0
o=- 1234567890 1 IN IP4 192.168.1.1
s=SDP Example
p=+1234567890
c=IN IP4 192.168.1.1
t=0 0
m=audio 5004 RTP/AVP 0
a=rtpmap:0 PCMU/8000

在上面的例子中,"p=+1234567890"指定了与会议相关的电话号码。

  • 其他说明
    • 如果存在这些字段,这些字段应该在第一个媒体描述字段之前
    • 一个会话可以有多个电子邮件和电话字段
    • 电子邮件和电话号码可以有一个可选的自由文本字符串与之关联,通常给出可能联系的人的姓名,格式如下:[email protected](Mark Handley) ,同时电子邮件和电话号码也可以使用RFC822名称引用约定,格式如下:e=Mark Handley
    • 电话号码的格式应该按照传统的国际标准给出 传统的国际电话号码格式遵循以下标准:
      1. 开头的加号符号 (+):表示国际呼叫的前缀。
      2. 国家代码:标识电话号码所属的国家或地区。
      3. 区号(可选):标识电话号码所属的地区或城市。
      4. 本地号码:表示电话号码的其余部分。

在这些元素之间,可以使用空格、连字符或括号进行分隔,以提高可读性。以下是传统的国际电话号码格式的示例:

  1. 美国电话号码:`+1 123-456-7890`
  2. 英国电话号码:`+44 20 1234 5678`
  3. 中国电话号码:`+86 10 12345678`

请注意,具体的国家或地区可能会有不同的电话号码格式约定,因此实际的电话号码格式可能会有所变化。在编写SDP会话描述时,应该按照所在国家或地区的电话号码格式习惯来提供电话号码信息。

Connection Data

“c=” 字段的语法格式:

c= 

其中,各个参数的含义如下:

  1. : 指定会话所使用的网络类型,目前定义的唯一值是 “IN”,表示互联网。

  2. : 表示连接地址类型,可以是 “IP4”(IPv4地址)或 “IP6”(IPv6地址),目前只定义了 “IP4”,表示IPv4地址。

  3. : 表示连接地址,即会话的网络连接点。对于 IPv4 地址,使用点分十进制表示法;对于 IPv6 地址,使用冒号分隔的十六进制表示法。对于IPv4地址,通常使用的是类D的IP组播地址。如果会话不是组播方式,那么连接地址可以是完全合格的域名(fully-qualified domain name)或单播IP地址,用于指定预期的数据源、数据中继或数据接收点。如果单播数据流经过网络地址转换器(network address translator),建议使用完全合格的域名而不是单播IP地址。此外,连接地址还可以包含其他可选的子字段,具体取决于地址类型字段的值。

对于使用IP组播连接地址的会议,除了连接地址外,还必须指定存活时间(time to live,TTL)值。TTL和地址共同定义了在该会议中发送的组播数据包的范围。TTL值必须在0-255的范围内。TTL值通过斜线分隔符与地址一起附加在连接地址后面。

连接数据还支持层次或分层编码方案。在这种编码方案中,来自单个媒体源的编码被分成多个层次。接收方可以通过仅订阅这些层次中的一部分来选择所需的质量(和带宽)。这样的分层编码通常使用多个组播组进行传输,以允许组播修剪,以防止不需要的流量传递到只需要特定层次的站点。连接地址的格式可以使用以下表示法:

//

如果未指定地址数,则默认为1。分配的组播地址是在基础地址之上连续分配的。多个地址将被分配在基础地址之上。例如,"c=IN IP4 224.2.1.1/127/3" 表示使用224.2.1.1、224.2.1.2和224.2.1.3这三个地址,并使用TTL为127。这与在媒体描述中包含多个 “c=” 行的语义相同。等同效果如下:

c=IN IP4 224.2.1.1/127
c=IN IP4 224.2.1.2/127
c=IN IP4 224.2.1.3/127

需要注意的是,多个地址或多个 “c=” 行只能在每个媒体的基础上指定,而不能在会话级别的 “c=” 字段中使用。

另外,对于IP单播地址,不允许使用斜线表示法。

因此,连接数据字段提供了关于会话的网络连接信息,包括网络类型、地址类型和连接地址。它允许会话参与方确定如何连接到会话的媒体流,并支持组播和分层编码方案。

附:

在媒体描述层面,如果需要指定多个连接地址,可以通过在每个媒体描述中使用多个 “c=” 行来实现。每个 “c=” 行将包含单独的连接数据。

以下是一个示例,展示了在媒体描述层面使用多个 “c=” 行的情况:

m=audio 5004 RTP/AVP 0
c=IN IP4 192.168.1.1
c=IN IP4 192.168.1.2

m=video 5006 RTP/AVP 31
c=IN IP4 192.168.1.3
c=IN IP4 192.168.1.4

在上述示例中,会话包含两个媒体描述,分别是音频(audio)和视频(video)。每个媒体描述中都有多个 “c=” 行,分别指定了不同的连接地址。音频媒体描述中的连接地址为 192.168.1.1 和 192.168.1.2,而视频媒体描述中的连接地址为 192.168.1.3 和 192.168.1.4。

通过在每个媒体描述中指定多个 “c=” 行,可以灵活地定义不同媒体的连接地址,以满足特定的需求。

Bandwidth

b字段是SDP(会话描述协议)中用于指定会话或媒体流所需带宽的字段。它是可选的,并用于提供关于会话或媒体流所需带宽的信息。

b字段的语法格式为:

b=:
  • 表示以每秒千比特(kbps)为单位的带宽数值。

  • 是一个单个的字母数字单词,用于说明带宽数值的含义。

SDP定义了两个初始的带宽修饰符:

  1. CT(Conference Total):与MBone(多播骨干网络)上的每个TTL(Time To Live)或特定的多播管理范围区域相关联的隐含最大带宽。如果会话或媒体在会话中的带宽与范围的隐含带宽不同,应为会话提供一个’b=CT:…'行,以指定所使用的带宽的建议上限。这主要用于大致判断两个或多个会议是否可以同时存在。
  2. AS(Application-Specific Maximum):该带宽被解释为应用程序特定的最大带宽,即应用程序对最大带宽的概念。通常情况下,它与应用程序的“最大带宽”控制设置相一致。

需要注意的是,CT给出了所有媒体在所有站点上的总带宽。AS给出了单个站点上单个媒体的带宽,尽管可能有多个站点同时发送。

此外,SDP还提供了扩展机制,允许工具编写者通过在修饰符前添加"X-"来定义实验性的带宽修饰符。这样的修饰符应以字母数字形式存在,并且SDP解析器应忽略未知修饰符的带宽字段。

综上所述,b字段在SDP中用于指定会话或媒体流的带宽需求。它提供了带宽数值和修饰符,用于描述会话的最大带宽限制,以及应用程序特定的带宽要求

Times

t字段(时间字段)是SDP(会话描述协议)中用于指定会话的起始时间和持续时间的字段。它描述了会话的时间范围,以便参与者可以确定何时开始和结束会话。

t字段的语法格式为:

t= 
  • "t="字段的第一个和第二个子字段分别表示会议的开始时间和结束时间。这些值是以秒为单位的网络时间协议(NTP)时间值的十进制表示。要将这些值转换为UNIX时间,需要减去2208988800的十进制值。
  • 一个会话可以在多个不规则间隔时间段内活动,因此可以使用多个"t="字段来指定会话的开始时间和结束时间。每个额外的"t="字段表示会话的一个附加时间段,在该时间段内会话将处于活动状态。如果会话在固定时间活动,则应在"t="字段之后使用"r="字段(参见下文)。在这种情况下,"t="字段指定重复序列的开始和结束时间。
    • 附:
      多个不规则间隔时间段指的是会话在不同的时间段内进行活动,而这些时间段之间的间隔是不规律的、不均匀的。这意味着会话的活动时间不是按照固定的模式或周期性发生,而是在不同的时间点上进行。

举个例子,假设一个会议会话有以下活动时间段:

  1. 2023年6月10日上午10点到上午12点
  2. 2023年6月15日下午2点到下午4点
  3. 2023年6月20日上午9点到中午11点

在这个例子中,会话在不同的日期和时间段内进行活动,并且这些时间段之间没有固定的模式或间隔。因此,需要使用多个"t="字段来指定每个时间段的开始时间和结束时间,以准确地描述会话的活动时间。

这种不规则间隔时间段的使用可以让参与者了解会话在不同时间点的活动情况,并能够根据自己的可用性安排参与。

  • 如果将停止时间设置为零,则表示会话没有边界,尽管会话在开始时间之后才会变为活动状态。如果开始时间也为零,则会话被视为永久会话,即没有明确的结束时间
    • 例子
t=0 0

如果"t=“字段的开始时间和结束时间都设置为零(即"t=0 0”),它表示会话被视为永久会话,即没有明确的结束时间。

这意味着会话将保持持续活动状态,没有固定的终止时间。会话可以随时开始,并且没有设定的结束点。这种类型的会话在某些场景下可能有用,例如持续性的服务或资源共享。

然而,需要注意的是,使用永久会话应该谨慎,并且在用户界面中应该明确地向用户展示会话的状态和持续时间。因为永久会话不提供关于会话何时终止的信息,这可能导致计划和安排方面的困难。在一些情况下,可能需要根据新的可用信息来修改会话的结束时间。

因此,对于使用"t=0 0"表示永久会话的情况,建议在用户界面中清楚地显示会话的状态和预期持续时间,并提供其他相关信息,以便参与者能够合理安排自己的时间。

Repeat Times

r字段(重复时间字段)用于指定会话的重复时间。它可以与t字段一起使用,以指定会话在特定时间重复活动的模式。r字段的语法格式如下:

r=  

这里是各个部分的解释:

  • :指定重复的时间间隔。它表示会话在每次重复之间的时间间隔。可以使用以秒为单位的值,也可以使用更便于阅读的格式,如天(d)、小时(h)或分钟(m)。
  • :指定每个重复期间的活动持续时间。它表示会话在每个重复时间段内的持续时间。同样,可以使用以秒为单位的值,也可以使用更便于阅读的格式。
  • :指定相对于会话开始时间的偏移量列表。它表示相对于会话开始时间的时间偏移量,用于确定每个重复期间的确切时间。偏移量可以是以秒为单位的正数或负数。
    例子:如果会话从今天8点开始(2023年6月7号),每周的周三、周四、周五早上8点重复活动
t=1623052800 0
r=604800 3600 24h 48h 72h

首先,我们将今天的日期转换为UNIX时间戳。2023年6月7日的UNIX时间戳为1623052800秒。

接下来,我们来计算偏移量。偏移量是相对于会话开始时间的时间差。

  • 周三早上8点距离会话开始时间的时间差是:(2023年6月8日的UNIX时间戳 - 会话开始时间的UNIX时间戳) = (1623139200秒 - 1623052800秒) = 86400秒 (24小时)
  • 周四早上8点距离会话开始时间的时间差是:(2023年6月9日的UNIX时间戳 - 会话开始时间的UNIX时间戳) = (1623225600秒 - 1623052800秒) = 172800秒 (48小时)
  • 周五早上8点距离会话开始时间的时间差是:(2023年6月10日的UNIX时间戳 - 会话开始时间的UNIX时间戳) = (1623312000秒 - 1623052800秒) = 259200秒 (72小时)

因此,正确的t和r字段应为:

t=1623052800 0 r=604800 3600 24h 48h 72h

这样会话将从2023年6月7日开始,并在每周的周三、周四、周五早上8点重复活动。第一个偏移量是24小时,表示会话开始后的第二天早上8点。
注意:
根据SDP(Session Description Protocol)规范,目前无法直接使用单个SDP重复时间来指定月度和年度重复。相反,应该使用单独的"t"字段来明确列出会话时间。

这意味着如果您需要指定每月或每年的重复活动,您需要使用多个"t"字段来明确列出每个会话时间。例如,如果您想要每月的第一天和每年的特定日期重复活动,您需要在SDP中使用多个"t"字段来指定这些时间。

例如,如果您希望会话在每月的第一天和每年的1月1日重复活动,您的SDP可以如下所示:

t=startTime1 stopTime1

t=startTime2 stopTime2

其中,startTime1和stopTime1表示每月重复活动的起始和结束时间,而startTime2和stopTime2表示每年重复活动的起始和结束时间。

请注意,虽然SDP规范不直接支持单个字段指定月度和年度重复,但您可以使用多个"t"字段来满足您的需求。

Time Zones

用于指定会话的重复时间中存在的时区调整,按理用不上,暂时不做说明。

Encryption Keys

SDP中的"k"字段用于传输加密密钥,以保护会话中的媒体流。"k"字段可以在第一个媒体条目之前出现,表示该加密密钥适用于会话中的所有媒体流,或者可以针对每个媒体条目单独包含.

"k"字段中的方法指示使用外部手段或提供编码的加密密钥来获取可用密钥。

以下方法已定义:

  1. k=clear: 加密密钥以原始形式包含在此密钥字段中。
  2. k=base64: 加密密钥包含在此密钥字段中,但已经进行了Base64编码,因为其中包含SDP不允许的字符。
  3. k=uri: 在此密钥字段中包含了一个类似于WWW客户端使用的统一资源标识符(URI)。该URI指向包含密钥的数据,并且可能需要额外的身份验证才能返回密钥。当向给定的URI发出请求时,回复的MIME内容类型指定了回复中密钥的编码方式。为了减少对WWW服务器的请求同步,应在用户希望加入会话时才获取密钥。
  4. k=prompt 此SDP描述中不包含密钥,但是该密钥字段所引用的会话或媒体流已加密。用户在尝试加入会话时应提示输入密钥,并使用用户提供的密钥解密媒体流。

使用场景说明:
场景:音频/视频会议的加密通信

在音频/视频会议中,参与者可能希望通过使用加密来确保其通信的机密性。SDP的"k"字段可以用于在会话描述中传递加密密钥。

具体步骤:

  1. 会话的发起方创建SDP描述并包含"k"字段。
  2. “k"字段中使用合适的加密方法(例如"k=clear”、“k=base64"或"k=uri”)来指定如何获得密钥。
  3. 如果使用了"k=clear"或"k=base64",则加密密钥可以直接在"k"字段中包含或进行编码。
  4. 如果使用了"k=uri",则在"k"字段中提供指向包含密钥的URI。
  5. 发起方将SDP描述发送给其他参与者。
  6. 接收方接收到SDP描述并解析其中的"k"字段,获取加密密钥。
  7. 使用获得的密钥对会话中的媒体流进行解密,以确保安全性和机密性。

通过使用"k"字段传递加密密钥,会话中的所有参与者都能够使用相同的密钥来加密和解密媒体流,从而实现加密通信。这样可以防止未经授权的访问和窃听者对媒体流的敏感内容进行截获和解读,从而确保通信的安全性和隐私性。

Media Annoucements

"m"字段用于描述媒体流(如音频、视频、文本等)在会话中的传输信息。会话描述可以包含多个媒体描述,每个媒体描述以一个"m="开始到下一个“m=”字段或者会话描述结束时为止。每个媒体描述包含多个子字段。

"m"字段的格式如下:

m=   

  • :指定媒体流的类型,目前定义的有"audio" “video” “application” “data” “control”。

  • :指定用于传输媒体流的端口号。传输端口的含义取决于相关“c=”字段中指定的网络类型

    以及下面中指定的传输协议。

    • 对于UDP传输,其端口范围应该是1024到65535,如果为RTP协议,端口应该为偶数,对应的+1端口由RTCP使用。
    • 如果需要将层次编码的流发送到单播地址,可能需要指定多个传输端口
      • 场景
        假设在一个视频会议中,有参与者连接到会议服务器,他们的网络带宽和设备性能各不相同。为了提供适应性的视频传输,会议服务器可以使用层次编码来提供多个质量级别的视频流。 在这种情况下,如果使用单播地址将层次编码的视频流发送给每个参与者,可能需要指定多个传输端口。这样做的目的是让每个参与者能够选择他们所需的质量级别并接收相应的视频流。 例如,会议服务器可以将会议的视频流分成三个质量级别:高、中和低。服务器可以使用层次编码将视频分成基本层和增强层。基本层包含最基本的图像信息,增强层包含额外的增强信息。 服务器可以在不同的传输端口上发送不同质量级别的视频流。例如,服务器可以将高质量级别的视频流发送到端口5000,中质量级别的视频流发送到端口5002,低质量级别的视频流发送到端口5004,RTCP使用5001。 这样,参与者可以根据自己的带宽和设备性能选择接收相应质量级别的视频流。对于带宽较高和性能较好的参与者,他们可以选择接收高质量级别的视频流。对于带宽较低和性能较差的参与者,他们可以选择接收低质量级别的视频流。 通过指定多个传输端口,并在会议描述中明确说明每个端口对应的质量级别,参与者可以根据自身情况选择合适的视频质量级别,从而提供更好的用户体验和适应不同的网络条件。
        m=video 5000/3 RTP/AVP 31 32 33 5001
        在这个示例中,m字段表示会议服务器使用单播地址发送视频流,并使用三个传输端口来传输视频。端口范围从5000开始,一共有三个端口可用。RTP/AVP表示使用RTP协议传输视频流。fmt list中的值为31、32和33,分别代表三种不同质量级别的视频流编码格式。在最后面,指定了一个额外的传输端口5001用于RTCP
  • :指定传输协议,用于在会话中传输媒体流,传输协议值取决于c字段的address type。常见的协议包括"RTP/AVP"(实时传输协议/音频视频传输协议)和"TCP"(传输控制协议)等。

    • 为什么需要指定传输协议,这里使用vat PCM 和RTP PCM为例子,要是不指定传输协议就无法区别这两种编码格式相同的音频
      指定传输协议可能导致无法区分vat PCM和RTP PCM这样的相同标准媒体格式。尽管它们在网络协议上使用相同的传输协议(例如UDP),但在SDP中明确指定传输协议有助于确保会话描述中的媒体数据能够准确地被解释和处理。通过指定传输协议,会话目录能够知道如何启动适当的工具、中继器、混音器或记录器来处理特定的媒体数据。如果没有指定传输协议,会话目录可能无法准确地识别和处理相同标准媒体格式的不同传输方式,因为它们可能具有不同的处理要求和特性。因此,指定传输协议有助于确保在会话中能够正确地区分和处理不同的媒体格式,以提供正确的媒体体验和满足特定的传输需求。
  • :指定支持的媒体格式或编解码器的列表。每个格式或编解码器由一个整数表示,并用空格分隔。例如,"0 8 18"表示支持媒体格式0、8和18。对于音频和视频,一般为RTP中定义的媒体有效负载类型payload type 。

    • 为什么会有多个fmt list
      在SDP中,m字段中的fmt list用于指定媒体流的格式。每个fmt list由一个或多个格式标识符(format identifier)组成,用空格分隔。这些格式标识符用于标识媒体流所使用的编码或格式。

多个fmt list可以用于表示同一媒体流的多个编码或格式选项。这样做的目的是为了提供在不同设备或网络条件下的适应性传输。每个fmt list可以包含不同的编码或格式,例如不同的视频编码器、音频编码器或传输协议。这样,接收方可以根据其支持的编码和设备能力来选择最适合的媒体格式。

在选择媒体格式时,发送方和接收方需要就共同支持的格式达成一致。通常,发送方会提供多个fmt list选项,接收方根据自身能力从中选择一个最佳的格式。选择的格式信息可以在SDP中的a字段(属性字段)中进一步指定和协商。

需要注意的是,不同媒体类型(如音频、视频)可能具有不同的fmt list,因为它们可能使用不同的编码和格式。因此,在SDP中的每个m字段中,可以指定不同媒体类型的fmt list。

综上所述,m字段中的多个fmt list提供了多个媒体格式选项,允许发送方和接收方根据各自的支持和能力选择最适合的格式,以实现适应性传输和最佳的媒体体验。

  • 第一个fmt list
    在SDP中,第一个fmt list通常被视为默认格式。它表示在没有进一步协商或指定的情况下,所选择的媒体格式。当接收方没有明确指定所需的格式时,发送方将使用默认格式。

默认格式的选择可以基于一些因素,如广泛支持的编码格式、常见的设备兼容性或特定的应用需求。发送方可以在m字段中的第一个fmt list中提供默认的格式选项,并期望接收方能够支持或适应这些选项。

然而,需要注意的是,SDP协议本身并没有强制规定默认格式的选择或使用。它主要提供了一种协商机制和语法,使发送方和接收方能够就媒体格式达成一致。因此,实际上的默认格式选择可能是特定应用、设备或协议的实现细节。

在实际应用中,发送方和接收方之间的协商和协调是至关重要的,以确保双方能够以最佳的格式进行媒体传输。如果接收方需要使用特定的格式,它可以通过SDP中的a字段或其他协商方式明确指定所需的格式,而不依赖于默认格式。

综上所述,第一个fmt list通常被视为默认格式,但其选择和使用可以根据具体应用、设备或协议的实现而有所变化。


  • "rtpmap"是媒体描述字段(m字段)中的一个属性,用于定义RTP(Real-time Transport Protocol)中的媒体格式和编码参数。对于指定的每种媒体格式最多定义一个rtpmap

rtpmap属性的格式如下:

rtpmap: / [/]

其中:

  • :指定RTP有效负载类型的编号,可以是静态有效负载(一般情况下不会使用)或动态有效负载的编号。
  • :指定媒体编码的名称,例如"PCMU"表示G.711 μ-law音频编码。
  • :指定媒体编码的时钟速率,以每秒钟的样本数表示,例如"8000"表示8 kHz音频采样率。
  • :可选字段,用于指定额外的编码参数,例如视频编码的分辨率或比特率。对于音频流可以指定音频通道的数量,如果通道数量唯一可以省略。

rtpmap的主要使用场景是在SDP中指定媒体流的编码格式和参数,以便接收方能够正确解码和处理媒体数据。它在协商和交互过程中起着关键的作用,确保发送方和接收方使用相同的编码和参数配置。

当使用动态有效负载类型时,可以使用rtpmap属性来指定具体的编码格式。对于静态有效负载类型,通常使用固定的编号和对应的默认编码格式。

以视频编码为例,如果要在SDP中指定H.265(HEVC)作为编码格式,需要遵循以下步骤:

  1. 确定H.265的动态有效负载类型编号(Payload Type):首先,需要查看RTP规范或相关文档,确定H.265在RTP中使用的动态有效负载类型编号。通常,这些编号是由标准或协议规范定义的。
  2. 在SDP的媒体描述字段(m字段)中使用rtpmap属性:在m字段中,使用rtpmap属性来指定H.265的编码格式和参数。

例如: m=video 5004 RTP/AVP 98 a=rtpmap:98 H265/90000

在这个例子中,"98"是H.265的动态有效负载类型编号,"H265"是编码名称,"90000"是时钟速率(即H.265的时间戳单位)。

  1. 根据需要添加其他编码参数:根据H.265的特定要求,可以使用其他可选的编码参数来进一步定义编码配置,如分辨率、比特率等。这些参数可以通过扩展rtpmap属性或其他属性字段来指定。

需要注意的是,为了确保协商的成功,发送方和接收方必须共享相同的动态有效负载类型编号和对应的编码格式。因此,在协商媒体会话之前,发送方和接收方应该预先协商好使用的动态有效负载类型编号和对应的编码格式。

另外,需要注意的是,不同的SDP会话中的动态有效负载类型编号可以是不同的,只要在同一会话中的发送方和接收方共享相同的编号和编码格式即可。

总结来说,rtpmap属性在SDP中的使用场景是指定媒体流的编码格式和参数,包括动态有效负载类型编号和对应的编码名称、时钟速率等信息。可以使用rtpmap属性来指定H.265作为编码格式,并确保发送方和接收方共享相同的动态有效负载类型编号和编码配置。

其他字段
  1. 属性 a=cat: 用于表示会话的类别,并使用点分层次结构进行表示。该属性的目的是使接收方能够根据类别对会话进行过滤,以便只选择感兴趣的会话。

使用场景:

  • 多会话分类:在多会话环境中,例如多路视频会议或多个媒体流的传输中,通过为每个会话指定不同的类别,可以帮助接收方区分和选择特定类型的会话。例如,可以将音频会话和视频会话分别标记为不同的类别。
  • 会话过滤:接收方可以根据类别对会话进行过滤,以便只选择感兴趣的会话。例如,接收方可以仅选择与特定主题相关的会话,而忽略其他类别的会话。

通过使用点分层次结构,可以创建具有更精细的分类结构的会话类别。例如,可以使用以下示例类别:a=cat:conference.videoa=cat:conference.audio,其中 conference 是顶级类别,videoaudio 是子类别。这样,接收方可以根据需要选择特定的子类别。

总之,a=cat: 属性提供了一种机制,允许发送方对会话进行分类,并使接收方能够根据类别对会话进行过滤和选择,以实现更精确的控制和管理。

  1. 属性 a=keywds: 用于提供描述会话目的的关键词。它帮助接收方根据关键词选择感兴趣的会话。关键词可以是与会话主题、内容或特定需求相关的词汇。

使用场景:

  • 会议主题:在多方会议或协作环境中,可以通过关键词描述会议的主题。接收方可以根据关键词过滤并选择符合其兴趣领域的会议。
  • 媒体内容:对于传输多种类型的媒体,例如音频、视频或文档,可以使用关键词描述媒体内容。接收方可以根据关键词选择感兴趣的媒体流。
  • 特定需求:某些会话可能需要满足特定需求,如安全性、可靠性或特定协议支持。通过关键词指定这些需求,接收方可以根据关键词选择符合要求的会话。

关键词可以是单个词或短语,根据具体需求而定。发送方应根据会话的特点和目的选择适当的关键词来描述会话。接收方可以使用这些关键词来筛选和选择合适的会话。

例如,假设有两个会话,一个是关于音乐的音频会议,另一个是关于体育的视频会议。可以使用以下示例关键词:

  • 对于音频会议:a=keywds:music, audio, conference
  • 对于视频会议:a=keywds:sports, video, conference

这样,接收方可以根据自己的兴趣选择适合他们的会议。

总之,a=keywds: 属性允许发送方提供描述会话目的的关键词,以帮助接收方根据关键词选择感兴趣的会话。这提供了一种灵活的机制,使会话的选择和过滤更加精确和个性化。

  1. 属性 a=tool: 用于指定创建会话描述的工具的名称和版本号。这个属性提供了一种透明的方式,让接收方知道会话描述是由哪个工具生成的。

进一步详细说明:

  • 工具名称:指定生成会话描述的工具的名称,可以是软件应用程序、库、脚本等。
  • 版本号:指定生成会话描述工具的版本号,用于标识工具的具体版本。

使用场景:

  • 兼容性检查:接收方可以根据会话描述中指定的工具名称和版本号来检查其是否与自己的系统或工具兼容。如果接收方使用与指定工具不兼容的版本或不支持的工具,则可以采取相应的措施或进行适当的处理。
  • 特定功能支持:某些工具可能具有特定的功能或扩展,通过指定工具的名称和版本号,可以让接收方知道该会话描述中可能包含的特定功能或扩展,并做出相应的处理或决策。

例如,假设有两个会话描述,一个是由工具 “ConferenceMaker” 的版本号 “2.0” 生成的,另一个是由工具 “MeetingBuilder” 的版本号 “1.5” 生成的。可以使用以下示例属性:

a=tool:ConferenceMaker 2.0
a=tool:MeetingBuilder 1.5

这样,接收方就可以知道会话描述是由哪个工具生成的,并据此进行兼容性检查或识别可能的特定功能。

总之,a=tool: 属性允许发送方指定创建会话描述的工具的名称和版本号。这为接收方提供了有关会话描述生成工具的透明信息,以支持兼容性检查和特定功能的识别。

  1. 属性 a=ptime: 用于指定媒体中每个数据包表示的时间长度,以毫秒为单位。该属性通常用于音频数据的编码和分组,它提供了关于音频数据包时长的建议信息。

进一步详细说明:

  • 数据包时间长度:指定每个音频数据包所表示的时间长度,以毫秒为单位。它描述了音频数据在时间上的切片大小。
  • 建议性质:该属性不是解码RTP或vat音频所必需的信息,而是对音频编码和分组提供的建议。它可用于指示接收方在音频编码和分组时应该考虑的时长。

使用场景:

  • 音频编码和分组:发送方可以使用该属性来建议接收方在进行音频编码和分组时应该采用的时间长度。这对于保持音频数据的同步和连续性非常重要。
  • 媒体流处理:接收方可以根据该属性确定处理音频流的方式,例如缓冲区大小、播放时长控制等。根据指定的时间长度,接收方可以进行适当的流处理和同步操作。

例如,如果音频数据包的时间长度建议为20毫秒,可以使用以下属性:

a=ptime:20

这样,接收方就可以根据建议的音频数据包时间长度进行相应的音频编码和分组操作,以确保音频流的正常播放和同步。

总之,a=ptime: 属性用于指定媒体中每个数据包所表示的时间长度,主要用于音频数据的编码和分组。它提供了建议性的时长信息,以支持音频流的处理和同步操作。

  1. 属性 a=recvonly 表示工具应以只接收模式启动(如果适用)。它可以作为会话属性或媒体属性。

属性 a=sendrecv 表示工具应以发送和接收模式启动。这在需要与默认为仅接收模式的工具进行交互式会议时很有用。它可以作为会话属性或媒体属性。

属性 a=sendonly 表示工具应以仅发送模式启动。当需要使用不同的单播地址作为流量源和目的地时,可以使用两个媒体描述符,一个使用sendonly,另一个使用recvonly。它可以作为会话属性或媒体属性。

进一步详细说明:

  • a=recvonly 属性用于指示工具仅在接收模式下运行,即只接收来自其他参与者的媒体流,而不发送自己的媒体流。这在仅需要接收数据而无需发送数据的场景中很有用。
  • a=sendrecv 属性用于指示工具在发送和接收模式下同时运行,即既可以发送自己的媒体流,也可以接收其他参与者的媒体流。这在需要与其他参与者进行实时交互的交互式会议中非常常见。
  • a=sendonly 属性用于指示工具仅在发送模式下运行,即只发送自己的媒体流,而不接收其他参与者的媒体流。这对于需要将媒体流发送到指定的目的地而不接收其他参与者媒体流的场景非常有用。

使用场景:

  • 视频会议:在视频会议中,某些参与者可能只需要接收其他参与者的视频流以进行观看,而无需发送自己的视频流。这时可以使用 a=recvonly 属性来指定只接收模式。
  • 语音广播:在语音广播中,广播主机通常只发送音频流而不接收来自听众的音频流。这时可以使用 a=sendonly 属性来指定只发送模式。
  • 单向传输:在某些情况下,需要在不同的单播地址上发送和接收媒体流。通过使用两个媒体描述符,一个使用 a=sendonly,另一个使用 a=recvonly,可以指定分别使用不同的发送和接收模式。

总之,a=recvonlya=sendrecva=sendonly 是用于指定工具启动模式的属性。它们在不同的会话和媒体场景中使用,以控制媒体流的发送和接收行为。

  1. 属性 a=type: 用于指定会议的类型,例如 broadcast(广播)、meeting(会议)、moderated(主持)和 test(测试)。它可以作为会话属性,并且不依赖于字符集。

进一步详细说明:

  • broadcast(广播)类型的会议是指一对多的会议形式,其中一个参与者(广播主机)发送媒体流,而其他参与者(听众)接收媒体流。这种类型的会议通常用于主持演讲、在线讲座或直播活动。
  • meeting(会议)类型的会议是指多对多的会议形式,所有参与者可以发送和接收媒体流,实现实时交互和讨论。这种类型的会议通常用于团队会议、远程协作和视频会议等场景。
  • moderated(主持)类型的会议是指在会议中有一个主持人(或多个主持人)负责控制和管理会议,包括决定哪些参与者可以发送媒体流、进行发言或进行特定操作。这种类型的会议通常用于研讨会、学术会议或组织重要会议时需要有主持人进行管理的场景。
  • test(测试)类型的会议是指用于测试和评估工具、协议或系统性能的会议。这种类型的会议通常用于开发、调试和验证阶段,以确保工具或系统能够按预期运行。

使用场景:

  • 在线讲座:一个广播类型的会议可用于在线讲座,其中演讲者作为广播主机发送媒体流,而观众作为听众接收媒体流。
  • 团队会议:一个会议类型的会议可用于团队会议,所有参与者都可以发送和接收媒体流,实现实时的协作和交流。
  • 学术会议:一个主持类型的会议可用于学术会议,主持人可以控制会议的流程,指定发言顺序,并管理参与者的媒体流。
  • 协议测试:一个测试类型的会议可用于测试和评估新开发的通信工具、协议或系统的性能和功能。

总之,a=type: 属性用于指定会议的类型,不同的类型适用于不同的会议场景,包括广播、会议、主持和测试。

  1. a=charset:: 指定用于显示会话名称和信息数据的字符集。默认情况下,使用UTF-8编码的ISO-10646字符集。可以使用其他字符集,如ISO-8859-1。字符集是会话级属性,如果存在该属性,必须在第一个媒体字段之前。字符集必须是在IANA注册的字符集之一。

  2. 属性 a=sdplang: 用于指定会话描述的语言,它可以作为会话级属性或媒体级属性。如果会话描述或媒体使用多种语言,可以提供多个 sdplang 属性,其中属性的顺序表示语言的重要性顺序。

属性 a=lang: 用于指定会话的默认语言,它也可以作为会话级属性或媒体级属性。如果指定了媒体级语言属性,它将覆盖会话级语言属性。与 sdplang 类似,可以提供多个 lang 属性。

进一步详细说明:

  • a=sdplang: 属性用于指定会话描述的语言。语言标签通常采用 BCP 47 标准,例如 “en” 表示英语,“fr” 表示法语。如果会话描述中涉及多种语言,可以按重要性顺序提供多个 sdplang 属性。接收方可以根据这些属性来确定优选的语言进行处理。
  • a=lang: 属性用于指定会话的默认语言。如果会话中的特定媒体流具有不同的语言,可以使用媒体级属性 lang 来覆盖会话级属性。同样地,可以按照重要性顺序提供多个 lang 属性。

使用场景:

  • 多语言会话:如果会话中的描述信息、指令或者媒体流需要支持多种语言,可以使用 sdplang 属性来指定语言。接收方可以根据语言标签选择合适的语言进行处理和呈现。
  • 多语言媒体:对于包含多个媒体流的会话,每个媒体流可能使用不同的语言。通过使用媒体级属性 lang,可以指定每个媒体流的默认语言,以覆盖会话级的默认语言设置。

总之,a=sdplang: 属性用于指定会话描述的语言,而 a=lang: 属性用于指定会话的默认语言。它们可以用于支持多语言会话和多语言媒体的场景。

  1. 属性 a=framerate: 用于指定最大的视频帧率(帧/秒),它仅适用于视频媒体。该属性提供了视频流的帧率信息,用于指导接收方在解码和播放视频时使用的帧率。

进一步详细说明:

  • a=framerate: 属性用于指定视频流的最大帧率,以帧/秒为单位。例如,a=framerate:30 表示视频流的最大帧率为每秒 30 帧。
  • 这个属性通常用于向接收方提供关于视频流的帧率信息,以便其在播放或处理视频时进行适当的设置。

使用场景:

  • 视频会议:在视频会议中,发送方可以使用 a=framerate 属性指定视频流的最大帧率。接收方可以根据这个属性来设置视频解码器的帧率以保持一致的播放体验。
  • 视频流媒体:在实时视频流媒体应用中,通过指定帧率属性,可以确保接收方以正确的帧率播放视频,以避免过快或过慢的播放速度。

总之,a=framerate: 属性用于指定最大的视频帧率,并提供了视频流的帧率信息。它在视频会议和视频流媒体等场景中起到指导接收方的作用,以确保视频以正确的帧率进行播放。

  1. 属性 a=quality: 用于提供编码质量的建议,以整数值表示。它可以用于指定音频或视频编码的期望质量级别,供接收方在解码和播放时参考。

进一步详细说明:

  • a=quality: 属性中的 值表示编码质量级别,通常是一个整数。具体的取值范围和解释可能因编码器而异,不同的编码器可能具有不同的质量级别标度。
  • 该属性提供了对编码质量的建议,但并不保证接收方会按照该建议进行处理。接收方可能会根据自身的编码器和解码器特性,以及网络带宽等因素做出适当的调整。

使用场景:

  • 视频流媒体:在视频流媒体应用中,发送方可以使用 a=quality 属性提供对视频编码质量的建议。接收方可以根据这个属性来选择合适的解码参数,以达到期望的视觉质量。
  • 音频通信:在音频通信应用中,发送方可以使用 a=quality 属性提供对音频编码质量的建议。接收方可以根据这个属性来选择合适的解码参数,以实现期望的音频质量。
    以下是一个具体的使用例子:

假设我们有一个音频会话,发送方希望向接收方提供关于音频编码质量的建议。发送方可以在 SDP 会话描述中添加以下行:

a=quality:8

在这个例子中,属性值 8 表示编码质量的建议。具体的意义可能因编码器而异,因此发送方和接收方需要在应用程序或协议层面进行协商和解释。

接收方在解析 SDP 会话描述时,可以提取 a=quality 属性的值,并据此进行相应的配置。例如,接收方可以根据建议的编码质量级别选择适当的解码算法或缓冲区大小。

需要注意的是,a=quality 属性的具体含义和应用取决于应用程序、编码器和协议的实现。因此,在具体使用中,发送方和接收方应进行适当的协商和解释,以确保正确理解和应用编码质量的建议。

这个例子展示了如何使用 a=quality 属性来提供编码质量的建议,以便在音频会话中向接收方传递有关编码质量的信息。这样可以帮助接收方根据建议进行适当的配置和处理,以提供更好的音频传输体验。

总之,a=quality: 属性用于提供对编码质量的建议,以整数值表示。它在视频流媒体和音频通信等场景中提供了对编码质量的建议,供接收方参考并选择合适的解码参数。请注意,接收方可能会根据自身的条件进行调整,并不保证完全按照建议进行处理。

  1. 属性 a=fmtp: 用于在SDP会话描述中传递特定格式的参数,而无需SDP理解这些参数的具体含义。它提供了一种机制,使得使用特定格式的媒体能够传递格式相关的配置信息。

进一步详细说明:

  • a=fmtp 属性由两部分组成,格式为
  • 指定了应用这些参数的媒体格式(例如音频编码器、视频编码器等)。
  • 是特定格式的参数,其具体含义由格式本身定义。这些参数通常是特定格式的编解码器或处理器所需的配置选项。

使用场景:

  • 音频/视频编码器参数:某些音频或视频编码器可能需要特定的配置参数,以控制编码和解码的行为。通过 a=fmtp 属性,发送方可以将这些特定参数传递给接收方,以确保双方使用相同的编码参数。
  • 编解码器扩展参数:一些媒体格式可能支持扩展参数,用于在特定的应用场景中定义和控制媒体处理的行为。通过 a=fmtp 属性,可以传递这些扩展参数给接收方,以实现特定的功能需求。

具体的例子如下:

假设发送方希望传递以下参数给接收方:

  • 编码配置文件:baseline
  • GOP(Group of Pictures)大小:30
  • 码率控制模式:恒定比特率(CBR)

发送方可以在 SDP 会话描述中添加以下行:

a=fmtp:123 profile-level-id=42e01f;packetization-mode=1;max-mbps=108000;max-fs=3600;max-cpb=4000;max-dpb=2000;max-br=4000;gop-size=30;bitrate-mode=cbr

其中,123 是 H.264 的媒体格式标识符,而 profile-level-idpacketization-modemax-mbpsmax-fsmax-cpbmax-dpbmax-brgop-sizebitrate-mode 是特定于 H.264 编码器的参数。

接收方在解析 SDP 会话描述时,可以识别并提取 a=fmtp 属性中的参数,并根据这些参数来配置自己的 H.264 编码器,以确保发送方和接收方在编码参数上保持一致。

这个例子展示了如何使用 a=fmtp 属性传递特定格式的参数,以便在视频会话中定义和控制编码器的行为。通过传递这些参数,发送方和接收方可以保持一致的编码配置,从而实现更好的视频传输质量和兼容性。

你可能感兴趣的:(SDP,开源协议)