【译】SDP会话描述协议 rfc8866

1. 介绍

2. 术语

3. SDP用法举例

4. 需求和建议

SDP的目的是把媒体流相关的信息传递给需要的参与者。尽管SDP很通用,也能描述其他网络环境的多媒体会议,SDP主要用于互联网协议。媒体流可以是多对多,会话不是必须连续活跃的。

在多播环境,SDP主要提供两个用途,一是表示会话存在,另一个是传递足够信息以确保加入和参与会话。在单播环境,主要是后者的用途。
SDP包括如下:

  • 会话名称和目的
  • 会话的活跃时间
  • 构成会话的媒体
  • 接收媒体所需信息(地址,端口,格式等)
    由于加入会话的必需资源是有限的,还可能包括下面的信息:
  • 会话使用的带宽信息
  • 负责会话的联系人信息
    通常, SDP必定传递充分的信息(可能密钥是例外)以确保应用能够加入会话,以及告知未加入者可能需要使用的资源。(后者特性对于multicast session announcement protocol很有用)

4.1 媒体和传输

SDP包括如下媒体信息:

  • 媒体类型(video, audio等)
  • 媒体传输协议(RTP/UDP/IP, H.320等)
  • 媒体格式(H.261视频,MPEG视频等)
    媒体格式和传输协议之外,SDP还传递地址和端口信息。对于IP多播会话,包括:
  • 媒体的多播组地址
  • 媒体的传输端口
    不论是发送,接收和同时收发,地址和端口都是目标地址和目标端口。

对于单播IP会话,传递如下信息:

  • 媒体的远端地址
  • 媒体的远端端口
    地址和端口的语义取决于上下文。一般情况下,应该是发送或者接收的远端地址和远端端口。SDP是作为公告分发出去还是在offer/answer交换中协商,基于网络类型、地址类型、协议和媒体的细节可能有所不同(例如,一些地址类型或者协议可能没有端口表示)。

4.2 时间信息

会话可以是时间上无界或者有界,可能只有一段特定时间是活跃的。SDP可以传递:

  • 界定会话的一组任意起止时间列表
  • 对每一个边界的重复时间,例如“每周三上午10,持续一小时”
    时间信息是全局一致的,不管地方时或者夏令时。

4.3 获取会话的更多信息

SDP可能传递了足够信息可以来决定是否要加入一个会话。SDP包括URI(RFC3986)形式的额外的指针来表示会话的更多信息。

4.4 国际化

SDP规范推荐使用ISO10646字符集,UTF-8编码,可以表示多种不同语言。然而为了紧凑表达,SDP也允许其他诸如ISO8859-1字符集。国际化只适用于自由文本子域(会话名称和背景信息),不适用于SDP全部。

5. SDP 规范

SDP的media type记为“application/sdp”。SDP是纯文本的。SDP字段名和属性名只使用UTF-8的US-ASCII子集,但是文本字段和属性值可以使用UTF-8编码的ISO10646全集。或者“a=charset:”属性定义的其他字符集。使用UTF-8字符集全集的字段值和属性值不会直接比较,因此不需要用UTF-8标准化。选择文本形式而不是二进制编码的ASN.1或者XDR,是为了加强可移植性,确保可以用于各种形式的传输,并且允许弹性的基于文本的工具用来生成和处理SDP。然而,SDP也可能被用于会话描述有最大文本限制的环境,编码是有意压缩的。同时,由于SDP可以通过非常不可靠的方式传递或者在中间缓存环节损坏,编码设计了严格的顺序和格式,这样绝大部分会导致错误的SDP可以被尽早检测到和丢弃。

SDP由许多如下形式的文本行组成:
=
其中是单个大小写敏感的字母,是格式取决于的结构化的文本。通常,是单个空格分隔的许多子域或者自由格式的字符串,大小写敏感,除非在特殊说明。空格分隔符不能用于"="两边,字段值是空格开头的除外。
SDP必需遵守Section 9定义的语法。以下是语法概览。
SDP由session-level的小节和紧跟其后的零至多个media description组成。session-level小节以“v=”行开始,直到第一个media description(或者整个SDP结尾,看谁先出现)。每个媒体描述以“m=”行开始,直到下一个媒体描述或者SDP结尾,看谁先出现。通常,会话级别的取值是所有媒体的默认值,除非被媒体级的对等值覆盖。

每个小节中的一些行是必需的,一些是可选的。但是一旦出现,必须按照这里给定的顺序出现。(固定的顺序增强了错误检测,简化了SDP解析器)。下面的概览中,可选的条目标记了“”。
Session description
v= (protocol version)
o= (originator 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 descriptions)
b=* (zero or more bandwidth information lines)
One or more time descriptions:
("t=", "r=" and "z=" lines; see below)
k=* (obsolete)
a=* (zero or more session attribute lines)
Zero or more media descriptions

Time description
t= (time the session is active)
r=* (zero or more repeat times)
z=* (optional time zone offset line)

Media description, if present
m= (media name and transport address)
i=* (media title)
c=* (connection information -- optional if included at
session level)
b=* (zero or more bandwidth information lines)
k=* (obsolete)
a=* (zero or more media attribute lines)
字母集合有意设计很小,而且是不可扩展的——SDP解析器必须完全忽略或者拒绝包含了其不能识别的字母类型的SDP。属性机制(“a=”,5.13小节介绍)是扩展SDP和裁剪适配特殊应用或者媒体的主要方法。一些属性有预定义的含义,但是其他的可以加入媒体特有或会话特有的属性集合。(除了媒体特有和会话特有的属性,还有属性也可能被本文档的扩展定义,例如RFC5576和RFC8864)。SDP解析器必须忽略不认识的属性。

SDP可以在“u=”,“k=”和“a=”行包含引用了外部内容的URI。这些URI可以在一些场景中解引用,使得会话描述非自包含。
Session级别的连接(“c=”)信息适用于所有的媒体描述,除非被媒体描述中的连接信息覆盖。例如,每个音频媒体描述表现如“c=IN IP4 198.51.100.1”。
例:
v=0
o=jdoe 3724394400 3724394405 IN IP4 198.51.100.1
s=Call to John Smith
i=SDP Offer #1
u=http://www.jdoe.example.com/home.html
e=Jane Doe jane@jdoe.example.com
p=+1 617 555-6011
c=IN IP4 198.51.100.1
t=0 0
m=audio 49170 RTP/AVP 0
m=audio 49180 RTP/AVP 0
m=video 51372 RTP/AVP 99
c=IN IP6 2001:db8::2
a=rtpmap:99 h263-1998/90000
包含文本的字段诸如session-name和information都是8位-字符串,可以包含除了0x00(Nul),0x0a(ASCII换行),0x00(ASCII回车)之外的任意字符。
尽管解析器应该容忍和接受单个换行结尾的行,CRLF(0x0d0a)才是被用来结束一行的。如果“a=charset:”属性没有出现,这些字符串必须按照UTF-8编码的ISO10646字符集解释。如果“a=charset:”属性出现在session-name字段,information字段,按照此选定的字符集解释。

SDP可以在“o=”,“u=”,“e=”,“c=”和“a=”行包含域名,SDP包含的任何域名必须遵守RFC1034和RFC1035。国际化域名(IDN)必须使用RFC5890定义的ASCII兼容编码表示。不能直接使用UTF-8或者其他编码表示

5.1 协议版本(“v=”)

v=0
v=行给出SDP版本,本备忘录定义了版本0。没有小版本号。

5.2 Origin(“o=”)

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

“o=”行给定会话提出者,会话ID和会话版本:
username 是登录到发起主机的用户,或者如果发起主机不支持用户ID概念,那就是“-”。username不可以包含空白字符
sess-id 是数字,username sess-id nettype addrtype和unicast-address元组构成会话的全局唯一ID。sess-id分配方法由创建工具决定,但是推荐使用从UTC 1900 1.1起的以秒为单位的时间戳,以确保唯一性。
sess-version是会话实例的版本。其用法由创建工具决定,当会话有修改的时候,sess-version增加。同样建议使用时间戳。
nettype 给定网络类型的文本字符串。“IN”表示“Internet”,将来也可以注册其他的值。(见section 8)
addrtype 给出地址类型的文本字符串。最开始,只定义了“IP4”和“IP6”,将来也可以定义其他值。(见section 8)
unicast-address 机器上创建会话的地址。对于IP4地址,要么是机器的FQDN(fully qualified domain name),要么是点号分隔的十进制数字表示。对于IP6,要么是FQDN,要么是RFC5952第4小节定义的地址表示。IP4和IP6都应该给出FQDN,除非无法获取,此时应该替换为全局唯一的地址。

由于隐私,有时希望混淆会话提出者的username和IP地址。如果这是个问题,只要按照不影响全局唯一性的方式选择,可以选取任意的username和unicast-address填充o=行。

5.3 会话名称(“s=”)

s=
“s=”行是文本的会话名称。每个会话描述有且仅有一个“s=”行。该行不可为空。如果会话没有有意义的名称,推荐使用单个空格或者“-”。如果出现会话级别的属性“a=charset:”,它制定了“s=”行的字符集。如果没有出现会话级别的属性“a=charset:”,“s=”行必须包含UTF-8编码的ISO10646字符集字符。

5.4 会话信息(“i=”)

“i=”行提供文本格式的会话信息。每个会话描述最多一个会话级别的“i=”行,每个媒体描述中最多一个“i=”行。除非提供媒体级别的“i=”行,否则会话级别的“i=”行适用于该媒体描述。如果出现会话级别的属性“a=charset:”,它制定了“i=”行的字符集。如果没有出现会话级别的属性“a=charset:”,“i=”行必须包含UTF-8编码的ISO10646字符集字符。
每个媒体描述最多有一个“i=”行,在媒体定义中,“i=”行主要用于给媒体流打标签。因此,当单个会话有多个具有相同媒体类型的媒体流时,“i=”行是最可能有用的。例如两个不同的白板,一个是幻灯片一个是问题反馈。
“i=”行是用来提供自由形式的人类可读的描述,不适合自动化解析其内容。

5.5 URI(“u=”)

u=
“u=”行提供URI(RFC3986).URI应该是指向额外的关于该会话的人类可读的信息。该行是可选的。每个会话描述不允许出现多于一个“u=”行。

5.6 Email地址和电话号码(“e=”和“p=”)

e=
p=
“e=”行和“p=”行指定负责该会话的人的联系信息。不一定是创建该会话的人。“e=”行和“p=”行是可选的。
如果“e=”行和“p=”行出现,必须在第一个媒体描述之前。一个会话描述可以有多个“e=”行和“p=”行。
电话好吗应该以国际公开电信号码的形式给出,以“+”开头。可以使用空格和连字符分隔。例如:
p=+1 617 555-6011
Email和电话号码都可以带一个可选的自由文本,一般给出联系人的名字。如果出现必须用圆括号包围。例如:
e=j.doe@example.com (Jane Doe)
也允许另一种名字引用习惯,例如:
e=Jane Doe j.doe@example.com
字符集规则与“i=”行相同。

5.7 连接信息(“c=”)

c=
“c=”行包含建立网络连接的必要信息。会话描述必须包含每个媒体描述中至少一个“c=”行或者会话级别的一个“c=”行。可以包含一个会话级别的“c=”行,和额外的媒体描述里的媒体级别“c=”行,这种情况下对应的媒体级别的“c=”行覆盖会话级别的“c=”行。
nettype 是网络类型,IN表示互联网。
addrtype是地址类型,本被网络只定义IP4和IP6。
connection-address是连接地址,根据addrtype后面可以有子字段。
addrtype是IP4或者IP6时,连接地址定义如下:

  • 如果会话是multicast,连接地址是IP multicast group 地址。如果会话不是multicast,那么连接地址包含数据源的单播地址,数据时延,或者由另一个属性值(5.13小节)决定的data sink(数据目的地)。不希望通过multicast广播交换会话描述包含单播地址,尽管不禁止这样。
  • 使用IP4 multicast连接地址的会话必须包含TTL,跟在multicast地址之后,使用斜线分隔,TTL值在0-255范围,尽管TTL必须提供,multicast流量已经废弃了对它的使用。
    IP6 multicast不使用TTL,因此TTL值不可以出现在IP6 multicast。

5.8 带宽信息(“b=”)

b=:
可选的“b=”行表示提议的用于会话或者媒体的带宽。

5.9 活跃时间(“t=”)

t=
“t=”行是描述会话的起止时间。如果会话在多个不规则时间段活跃,可以使用多个时间描述。如果会话在规则的重复时间活跃,可以使用repeat description(“r=”)。下面的例子指定两个活跃区间:
t=3724394400 3724398000 ; Mon 8-Jan-2018 10:00-11:00 UTC
t=3724484400 3724488000 ; Tue 9-Jan-2018 11:00-12:00 UTC
两个“t=”行的第一个和第二个子域分别指定会话的起止时间(笔者注,分号之后是本文档的注释)。这些是1900 1 1 UTC起的秒数表示。如果要转化为UTC时间,减去220898800。
有些时间表示会终止于2036年,由于SDP使用任意长度的十进制表示,没有这个问题。SDP的实现需要准备好处理这些比较大的数值。
如果stop-time设置为零,那么会话是无界的,但是直到start-time之后才变为active。如果start-time也为0,会话被认为是永久的。
用户接口应该强烈地抑制创建无边界的和永久的会话,因为它们没有会话何时结束的信息,难于调度。

5.10 重复时间(“r=”)

r=
“r=”行指定会话的重复时间。如果需要表达复杂的调度,可以使用多个r=行。

5.11 time zone adjustment(“z=”)

z= ....
“z=”行是可选的,是它紧跟的“r=”行的修饰符,不适用于任何其他字段。

5.12 密钥(“k=”)

k=
k=:
“k=”行已经过时,不能再使用。出现在本文档是为了遗留问题。SDP不能包含“k=”行。

5.13 属性(“a=”)

a=
a=:
属性(attributes)是扩展SDP的主要方式。属性可以用于会话级别的属性,媒体级别的属性,或者两者都用。(媒体级别和会话级别之外的属性可以在本文档的扩展中定义,例如RFC5576和RFC8864)
媒体描述可以包含任意数量的媒体描述特有的“a=”行,这些是媒体级别的attribute,为媒体描述增加信息。attribute字段可以添加到第一个媒体描述之前,会话级别的attribute传递适用于整个会话的额外信息,而不是单个媒体描述。
attribute字段可以是两种形式:

  • "a="形式,这些是二值属性,传递的是会话的属性。例如"a=recvonly"
  • "a=:"形式,例如白板可以有值"a=orient:landscape"
    Attribute解释依赖于调用的媒体工具。因此,会话描述的接收者在其对会话描述的一般解释和对特定属性的解释中应该是可配置的。
    Attribute名称必须使用ISO-10646/UTF-8的ASCII子集。Attribute值是8位-字符串,可以包含除了0x00(Nul),0x0a(ASCII换行),0x00(ASCII回车)之外的任意字符。
    尽管解析器应该容忍和接受单个换行结尾的行,CRLF(0x0d0a)才是被用来结束一行的。如果“a=charset:”属性没有出现,这些字符串必须按照UTF-8编码的ISO10646字符集解释。如果“a=charset:”属性出现在session-name字段,information字段,按照此选定的字符集解释。
    Attribute必须注册到IANA,如果收到不能理解的Attribute,接收者必须忽略。

5.14 媒体描述(“m=”)

m= ...
会话描述可以包含许多媒体描述。每个媒体描述以“m=”行开头,终止于下一个“m=”行或者会话描述结尾。媒体字段有几个子字段:
media 是媒体类型。本文档定义了值“audio”、“video”、“text”、“application”和“message”。这个列表通过其他备忘录扩展。例如RFC6466定义了“image”媒体类型。
port 是媒体流发送的传输端口。传输端口的含义依赖于相关的“c=”行指定的网络和媒体字段的proto子字段定义的传输类型。媒体应用使用的其他端口(诸如RTCP(RFC3550)端口)可以从基准的端口算出,或者可以在单独的attribute中指定(例如,定义在RFC3605的“a=rtcp:”)。
如果RTP和RTCP使用不连续的端口或者不服从RTP偶数RTCP奇数的规则,必须使用“a=rtcp:”。应用如果是奇数,还出现了“a=rtcp:”属性,被请求发送数据时,不可以从RTP端口减1:也就是说必须发送RTP到指定端口,发送RTCP到“a=rtcp:”属性指定的端口。
对于分层编码发送到单播地址的应用,可能必须指定多个传输端口。这通过“c=”行中IP多播地址类似的方式实现:
m= / ...
这种情况下,使用的端口依赖于传输协议。对于RTP,默认使用偶数端口传输数据,加一之后的奇数用于属于该RTP会话的RTCP,表示RTP会话的数量。例如:
m=video 49170/2 RTP/AVP 31
指定端口49170和49171构成一对RTP/RTCP,49172和49173构成第二对RTP/RTCP。RTP/AVP是传输协议,31是格式(见下文的
本文档不包含声明不连续端口的多层次编码流的机制。(目前没有定义好的属性可以完成,RFC3605定义的“a=rtcp:”不处理层次化的编码。)如果有需求遇到声明不连续端口问题,那么必须定义一个新的attribute属性来完成。
如果"c="指定了多个地址,“m=”行指定了多个端口,意味着端口到地址的一一映射。例如:
m=video 49170/2 RTP/AVP 31
c=IN IP4 233.252.0.1/127/2
意味着地址233.252.0.1被端口49170/49171使用,233.252.0.2被49172/49173使用。如果多个“c=”指定的多个地址也是类似的映射。例如:
m=video 49170/2 RTP/AVP 31
c=IN IP6 ff00::db8:0:101
c=IN IP6 ff00::db8:0:102
ff00::db8:0:101被端口49170/49171使用, ff00::db8:0:102被端口49172/49173使用。

本文档没有给出多个媒体描述分配同样媒体地址的含义。这样做不能隐含地把这些媒体描述分到一组。应该使用一个显式的分组框架(例如RFC5888)来表达这个语义。例如RFC8843。

proto 是传输协议。传输协议的含义依赖于相关联的“c=”行的地址类型子字段。因此,带有IP4的“c=”行表明传输协议运行在IPv4上。定义了下面的传输协议,但是也可以通过IANA注册新的协议来扩展。

  • udp:表示数据通过UDP直接传输,没有额外的装帧。
  • RTP/AVP:表示运行在UDP上的RTP Profiling for Audio and Video Conferences with Minimal Control(RFC3551)下使用的RTP(RFC3550)。
  • RTP/SAVP:表示运行子UDP上的Secure Real-time Transport Protocol(RFC3711)
  • RTP/SAVPF:表示运行在UDP上的带有Extended SRTP Profile for RTCP-Based Feedback 的SRTP
    媒体格式之外额外指定传输协议的主要原因是,即使网络协议相同,同样的标准媒体格式可以通过不同的传输协议传输,一个经典的例子是vat(MBone的刘翔的多媒体音频工具)PCM音频和RTP PCM音频,另一个可能TCP/RTP PCM音频。另外,可能中继和监控工具是传输协议特定的但不依赖于格式的。

是媒体格式。第四个和任意后续子字段描述了媒体格式。媒体格式的解释依赖于子字段取值。
如果子字段是“RTP/AVP”或者”RTP/SAVP“,子字段包含RTP的负载类型。如果给出了一列敷在类型,意味着这些负载类型都可以用于该会话,这些负载类型是按优先级排序的,越靠前越优先。当列出多个负载类型的时候,第一个可接受的负载格式应该用于该会话。对于动态负载类型分配,应该使用“a=rtpmap:”来映射RTP负载类型到表示负载格式的媒体编码名称。“a=fmtp:”也可以用来指定格式参数。
如果子字段是udp,子字段必须引用一个媒体类型,能够描述“audio”、”video“、”text“、”application“或者”message“这些顶级媒体类型下的格式。媒体类型注册应该定义用于UDP传输的包格式。
对于使用其他协议的媒体,子字段是协议特定的。解释的规则必须在注册新协议的时候定义好。
RFC4855的第3小节表明,RTP 规格中定义的负载类型(编码)名称一般是大写的,而媒体的子类型字段一般是小写的。还表明这两类名称在各自的领域都是大小写敏感的,类似于媒体类型字符串和SDP“a=fmtp:”属性。

6. SDP attributes

下面的属性已经被定义。由于应用开发者可以按需要添加新的attribute,这个列表不是详尽的。

6.1 cat(category)

  a=cat:foo.bar

该属性指定会话的点分隔的层次化分类。这是的接收者通过类别过滤掉不想要的会话。没有类别的中心化注册表。这个属性过时了,不应该使用。如果收到应该忽略。

6.2 keywds(keywords)

  a=keywds:SDP session description protocol

类似“a=cat:”,用于辅助接收者区分想要的会话。已过时。

6.3 tool

  a=tool:foobar V3.2

指定用来创建会话描述的工具的名称和版本。

6.4 ptime(packet time)

  a=ptime:20

指定一个包中媒体表示的毫秒数。可能支队音频数据有效,但是也可以用于其他类型的媒体,如果他们用起来有意义。解码RTP或者vat音频不必知道“a=ptime”,只是用于编码打包音频的建议

6.5 macptime(maximum packagt time)

  a=maxptime:20

指定每个包可以封装的最大的媒体量,毫秒为单位。以包来表示的媒体应该计算时间之和,对基于帧的编解码,时间应该是帧大小的整数倍。这个属性可能只对音频数据有意义,但是如果对其他类型有意义也可以使用。注意这个属性在RFC2327引入之后,没有更新的失信会忽略这个属性。

6.6 rtpmap

语法
rtpmap-value = payload-type SP encoding-name
"/" clock-rate [ "/" encoding-params ]
payload-type = zero-based-integer
encoding-name = token
clock-rate = integer
encoding-params = channels
channels = integer
该属性从RTP负载类型映射到其编码名称。也提供时钟频率信息和编码参数。注意负载类型数字是7-bit表示,限制范围在闭区间[0,127]。
尽管RTP规格能够使用负载类型数字到负载格式的静态分配,但是更普遍的用法是使用“a=rtpmap:”进行动态分配。作为静态负载类型的例子,考虑u-law PCM编码的单通道视频,采样率kHz。这是完整定义在RTP规格中的,负载类型0,所以不需要“a=rtpmap:”属性,通过UDP端口49232发送的媒体流可以指定为:
m=audio 49232 RTP/AVP 0
例子,动态负载类型的16-bit线性编码的立体声,采样16kHz。如果我们希望使用RTP/AVP负载类型98,需要额外的信息来解码:
m=audio 49232 RTP/AVP 98
a=rtpmap:98 L16/16000/2
最多一个“a=rtpmap:”属性可被用于定义特定媒体格式。因此,可能有如下:
m=audio 49230 RTP/AVP 96 97 98
a=rtpmap:96 L8/8000
a=rtpmap:97 L16/8000
a=rtpmap:98 L16/11025/2
RTP指定使用动态负载类型的规格必须定义一套有效的编码名称和注册编码名称的方法,如果规格使用UDP的话。“RTP/AVP”和“RTP/SAVP”规格在“m=”行的顶级媒体类型之下,把媒体子类型用于编码名称。上面的例子中,媒体类型是“audio/L8”和“audio/L16”。

对于音频流,编码参数表明音频通道数量。该参数是可选的,如果通道数是1也是可以省略的。
对于视频流,目前没有编码参数。
未来可以定义更多编码参数,但是不应该添加编解码特定的参数。添加到“a=rtpmap"属性的参数,应该是为了选择媒体参与会话时所需要的那些属性。编解码特定的参数应该添加到其他属性(例如“a=fmtp:”)。
注意RTP音频格式一般不包含每个包采样数的信息。如果需要非默认的打包,使用“a=ptime”属性。

6.7 媒体方向

"a=recvonly", "a=sendrecv", "a=sendonly", or "a=inactive" 最多可以在会话级别出现一次,并且每个媒体描述最多出现一次。
如果出现在媒体描述,那它适用于那个媒体描述。如果不出现在媒体描述,那么如果有会话级别的那个属性,它适用于该媒体描述。
如果媒体描述没有出现,也没有会话级别的,那应该假设默认是"a=sendrecv"。
下面SDP例子中,"a=sendrecv"适用于第一个audio媒体,"a=inactive"适用于其他的。
v=0
o=jdoe 3724395000 3724395001 IN IP6 2001:db8::1
s=-
c=IN IP6 2001:db8::1
t=0 0
a=inactive
m=audio 49170 RTP/AVP 0
a=sendrecv
m=audio 49180 RTP/AVP 0
m=video 51372 RTP/AVP 99
a=rtpmap:99 h263-1998/90000

6.7.1 recvonly

指定工具应该receive-only模式启动,只适用于媒体,不适用于控制协议。RTCP正常发送。

6.7.2 sendrecv

6.7.3 sendonly

sendonly mode,只适用于媒体,不适用于控制协议。

6.7.4 inactive

指定工具按inactive模式启动。只适用于媒体,不适用于控制协议。

6.8 orient

语法
orient-value = portrait / landscape / seascape
portrait = %s"portrait"
landscape = %s"landscape"
seascape = %s"seascape"
; NOTE: These names are case-sensitive.
例子:
a=orient:portrait
一般只是用于白板或者展示工具,指定工作台在屏幕上的方向,允许的值是“portrait”“landscape”“seascape”

6.9 type

6.10 charset

例如
a=charset:ISO-8859-1
指定的字符集必须是IANA字符集注册中心注册过的,例如ISO-8859-1。

6.11 sdplang

6.12 lang

6.13 framerate

该属性给定最大的视频帧率,是用于视频数据编码的推荐值。允许十进制的小数值,只是为了视频媒体定义的。

6.14 quality

该属性给出编码质量的整数建议值。用于指明帧率和静态图片质量之间的trade-off策略。对于视频的0-10的含义:

  • 10 可以给出的最好的静态图片质量
  • 5 默认的行为
  • 0 设计可以认为可用情况下的最差的静态图片质量

6.15 fmtp

例子
a=fmtp:96 profile-level-id=42e016;max-mbps=108000;max-fs=3600
该属性允许特殊格式的特定参数能够在SDP不理解的情况下传输。这些格式必须是媒体特定的格式,每种格式最多可以有一个该属性。“a=fmtp”可以用于为任意协议和和格式指定参数,只要他们定义了参数的用法。

7. 安全考虑

8. IANA考虑

9. SDP语法

10. 从RFC4566的改动总结

11 参考

posted on 2021-05-07 22:38  还好可以改名字  阅读(542)  评论(0编辑  收藏  举报