Skip to main content

6. SDP属性 (SDP Attributes)

定义了以下属性。由于应用程序编写者可能根据需要添加新属性,因此此列表并非详尽无遗。新属性的注册程序在第8.2.4节中定义。语法使用ABNF [RFC7405]提供,其中一些规则在第9节中进一步定义。

6.1. cat (类别 Category)

名称: cat

: cat-value

使用级别: 会话 (session)

字符集依赖: 否 (no)

语法:

cat-value = category
category = non-ws-string

示例:

a=cat:foo.bar

此属性给出会话的点分隔层次类别。这是为了使接收者能够按类别过滤不需要的会话。没有类别的中央注册表。此属性已过时,不应(SHOULD NOT)使用。如果收到,应该(SHOULD)忽略。

6.2. keywds (关键词 Keywords)

名称: keywds

: keywds-value

使用级别: 会话 (session)

字符集依赖: 是 (yes)

语法:

keywds-value = keywords
keywords = text

示例:

a=keywds:SDP session description protocol

与"a=cat:"属性类似,这旨在协助在接收者处识别所需的会话,并允许接收者基于描述会话目的的关键词选择感兴趣的会话;然而,没有关键词的中央注册表。如果指定了字符集,其值应在会话描述指定的字符集中解释,否则默认使用ISO 10646/UTF-8。此属性已过时,不应(SHOULD NOT)使用。如果收到,应该(SHOULD)忽略。

6.3. tool (工具)

名称: tool

: tool-value

使用级别: 会话 (session)

字符集依赖: 否 (no)

语法:

tool-value = tool-name-and-version
tool-name-and-version = text

示例:

a=tool:foobar V3.2

这给出了用于创建会话描述的工具的名称和版本号。

6.4. ptime (数据包时间 Packet Time)

名称: ptime

: ptime-value

使用级别: 媒体 (media)

字符集依赖: 否 (no)

语法:

ptime-value = non-zero-int-or-real

示例:

a=ptime:20

这给出了数据包中媒体表示的时间长度(以毫秒为单位)。这可能仅对音频数据有意义,但如果有意义,也可以用于其他媒体类型。解码RTP或vat音频不应需要知道"a=ptime:",它旨在作为音频编码/打包的建议。

6.5. maxptime (最大数据包时间 Maximum Packet Time)

名称: maxptime

: maxptime-value

使用级别: 媒体 (media)

字符集依赖: 否 (no)

语法:

maxptime-value = non-zero-int-or-real

示例:

a=maxptime:20

这给出了每个数据包可以封装的最大媒体量,以毫秒为单位表示时间。时间应该(SHALL)计算为数据包中存在的媒体所代表的时间总和。对于基于帧的编解码器,时间应该(SHOULD)是帧大小的整数倍。此属性可能仅对音频数据有意义,但如果有意义,也可以用于其他媒体类型。请注意,此属性是在[RFC2327]之后引入的,未更新的实现将忽略此属性。

6.6. rtpmap (RTP映射)

名称: rtpmap

: rtpmap-value

使用级别: 媒体 (media)

字符集依赖: 否 (no)

语法:

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有效负载类型号(如"m="行中使用的)映射到表示要使用的有效负载格式的编码名称。它还提供有关时钟速率和编码参数的信息。请注意,有效负载类型号在7位字段中指示,将值限制在0到127之间(含)。

尽管RTP配置文件可以对有效负载类型号到有效负载格式进行静态分配,但更常见的是使用"a=rtpmap:"属性动态完成该分配。作为静态有效负载类型的示例,考虑在8 kHz采样的u-law PCM编码单声道音频。这在RTP音频/视频配置文件中完全定义为有效负载类型0,因此不需要"a=rtpmap:"属性,发送到UDP端口49232的此类流的媒体可以指定为:

m=audio 49232 RTP/AVP 0

动态有效负载类型的示例是在16 kHz采样的16位线性编码立体声音频。如果我们希望将动态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配置文件必须(MUST)定义有效编码名称集和/或注册编码名称的方法(如果该配置文件要与SDP一起使用)。"RTP/AVP"和"RTP/SAVP"配置文件在"m="行中表示的顶级媒体类型下使用媒体子类型作为编码名称。在上面的示例中,媒体类型是"audio/L8"和"audio/L16"。

对于音频流,encoding-params表示音频通道数。此参数是可选的(OPTIONAL),如果通道数为1,则可以省略,前提是不需要其他参数。

对于视频流,当前没有指定编码参数。

将来可能(MAY)定义其他编码参数,但不应(SHOULD NOT)添加特定于编解码器的参数。添加到"a=rtpmap:"属性的参数应该(SHOULD)仅是会话目录做出参与会话的适当媒体选择所需的参数。特定于编解码器的参数应添加到其他属性中(例如,"a=fmtp:")。

注意:RTP音频格式通常不包括有关每个数据包样本数的信息。如果需要非默认(如RTP音频/视频配置文件[RFC3551]中定义)的打包,则使用第6.4节中给出的"a=ptime:"属性。

6.7. 媒体方向属性 (Media Direction Attributes)

会话级别最多可以(MAY)出现一次"a=recvonly"、"a=sendrecv"、"a=sendonly"或"a=inactive",每个媒体描述中最多可以(MAY)出现一次。

如果其中任何一个出现在媒体描述中,则它适用于该媒体描述。如果媒体描述中都没有出现,则会话级别的属性(如果有)适用于该媒体描述。

如果会话级别或媒体级别都不存在媒体方向属性,则应该(SHOULD)假定"a=sendrecv"为默认值。

在以下SDP示例中,"a=sendrecv"属性适用于第一个音频媒体,"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)

名称: recvonly

: (无)

使用级别: 会话、媒体 (session, media)

字符集依赖: 否 (no)

示例:

a=recvonly

这指定工具应在适用的情况下以仅接收模式启动。请注意,仅接收模式仅适用于媒体,不适用于任何相关的控制协议。基于RTP的系统在仅接收模式下仍然必须(MUST)按照[RFC3550]第6节中的描述发送RTCP数据包。

6.7.2. sendrecv (发送接收 Send-Receive)

名称: sendrecv

: (无)

使用级别: 会话、媒体 (session, media)

字符集依赖: 否 (no)

示例:

a=sendrecv

这指定工具应在发送和接收模式下启动。对于默认为仅接收模式的工具,这对于交互式多媒体会议是必要的。

6.7.3. sendonly (仅发送 Send-Only)

名称: sendonly

: (无)

使用级别: 会话、媒体 (session, media)

字符集依赖: 否 (no)

示例:

a=sendonly

这指定工具应在仅发送模式下启动。一个例子可能是流量目的地使用与流量源不同的单播地址。在这种情况下,可以使用两个媒体描述,一个处于仅发送模式,一个处于仅接收模式。请注意,仅发送模式仅适用于媒体,任何相关的控制协议(例如RTCP)应该(SHOULD)仍然正常接收和处理。

6.7.4. inactive (非活动)

名称: inactive

: (无)

使用级别: 会话、媒体 (session, media)

字符集依赖: 否 (no)

示例:

a=inactive

这指定工具应在非活动模式下启动。对于用户可以将其他用户置于保持状态的交互式多媒体会议,这是必要的。在非活动媒体流上不发送媒体。请注意,基于RTP的系统仍然必须(MUST)发送RTCP(如果使用RTCP),即使在非活动模式下启动。

6.8. orient (方向 Orientation)

名称: orient

: orient-value

使用级别: 媒体 (media)

字符集依赖: 否 (no)

语法:

orient-value = portrait / landscape / seascape
portrait = %s"portrait"
landscape = %s"landscape"
seascape = %s"seascape"
; 注意: 这些名称区分大小写。

示例:

a=orient:portrait

通常这仅用于白板或演示工具。它指定屏幕上工作空间的方向。允许的值是"portrait"(纵向)、"landscape"(横向)和"seascape"(倒置横向)。

6.9. type (会议类型 Conference Type)

名称: type

: type-value

使用级别: 会话 (session)

字符集依赖: 否 (no)

语法:

type-value = conference-type
conference-type = broadcast / meeting / moderated / test / H332
broadcast = %s"broadcast"
meeting = %s"meeting"
moderated = %s"moderated"
test = %s"test"
H332 = %s"H332"
; 注意: 这些名称区分大小写。

示例:

a=type:moderated

这指定多媒体会议的类型。允许的值是"broadcast"(广播)、"meeting"(会议)、"moderated"(主持)、"test"(测试)和"H332"。这些值对可能合适的其他选项有影响:

  • 当指定"a=type:broadcast"时,"a=recvonly"对于那些连接的人可能是合适的。

  • 当指定"a=type:meeting"时,"a=sendrecv"可能是合适的。

  • "a=type:moderated"建议使用发言权控制工具,并且媒体工具应启动以使加入多媒体会议的新站点静音。

  • 指定"a=type:H332"表示此松散耦合会话是ITU H.332规范[ITU.H332.1998]中定义的H.332会话的一部分。媒体工具应使用"a=recvonly"启动。

  • 指定"a=type:test"建议作为提示,除非明确请求,否则接收者可以安全地避免向用户显示此会话描述。

6.10. charset (字符集 Character Set)

名称: charset

: charset-value

使用级别: 会话 (session)

字符集依赖: 否 (no)

语法:

charset-value = <在 [RFC2978] 中定义>

这指定用于显示会话名称和信息数据的字符集。默认情况下,使用UTF-8编码的ISO-10646字符集。如果需要更紧凑的表示,可以使用其他字符集。例如,ISO 8859-1用以下SDP属性指定:

a=charset:ISO-8859-1

指定的字符集必须(MUST)是在IANA字符集注册表(http://www.iana.org/assignments/character-sets)中注册的字符集之一,例如ISO-8859-1。字符集标识符是一个字符串,必须(MUST)使用不区分大小写的比较与注册表的"Name"或"Preferred MIME Name"字段中的标识符进行比较。如果标识符无法识别或不受支持,则受其影响的所有字符串应该(SHOULD)被视为八位字节字符串。

字符集依赖字段必须(MUST)仅包含根据所选字符集的定义有效的字节序列。此外,字符集依赖字段不得(MUST NOT)包含字节0x00(Nul)、0x0A(LF)和0x0d(CR)。

6.11. sdplang (SDP语言 SDP Language)

名称: sdplang

: sdplang-value

使用级别: 会话、媒体 (session, media)

字符集依赖: 否 (no)

语法:

sdplang-value = Language-Tag
; Language-Tag 在 RFC 5646 中定义

示例:

a=sdplang:fr

如果会话描述或媒体使用多种语言,则可以在会话或媒体级别提供多个"a=sdplang:"属性。

作为会话级属性,它指定会话描述的语言(而不是媒体的语言)。作为媒体级属性,它指定与该媒体相关联的任何媒体级SDP信息字段的语言(同样不是媒体的语言),覆盖在会话级别指定的任何"a=sdplang:"属性。

通常,不鼓励发送由多种语言组成的会话描述。相反,应该(SHOULD)发送描述会话的多个会话描述,每种语言一个。然而,并非所有传输机制都可以做到这一点,因此允许使用多个"a=sdplang:"属性,尽管不建议(NOT RECOMMENDED)使用。

"a=sdplang:"属性值必须是单个语言标签[RFC5646]。当会话分发的范围足以跨越地理边界时,应该(SHOULD)指定"a=sdplang:"属性,在这种情况下,无法假定接收者的语言,或者会话的语言与本地假定的规范不同。

6.12. lang (语言 Language)

名称: lang

: lang-value

使用级别: 会话、媒体 (session, media)

字符集依赖: 否 (no)

语法:

lang-value = Language-Tag
; Language-Tag 在 RFC 5646 中定义

示例:

a=lang:de

如果会话或媒体具有多种语言的能力,则可以在会话或媒体级别提供多个"a=lang:"属性,在这种情况下,属性的顺序表示会话或媒体中各种语言的偏好顺序,从最优先到最不优先。

作为会话级属性,"a=lang:"指定所描述会话的语言能力。作为媒体级属性,它指定该媒体的语言能力,覆盖任何会话级指定的语言。

"a=lang:"属性值必须是单个[RFC5646]语言标签。当会话的范围足以跨越无法假定参与者语言的地理边界,或者会话具有与本地假定的规范不同的语言能力时,应该(SHOULD)指定"a=lang:"属性。

"a=lang:"属性应该用于设置会话中使用的初始语言。会话期间的事件可能影响使用哪些语言,参与者不严格受限于仅使用声明的语言。

大多数实时用例从使用一种语言开始,而其他情况涉及一系列语言,例如,翻译或字幕会话。当指定多个"a=lang:"属性时,"a=lang:"属性本身不提供有关在会话期间打算使用多种语言的任何信息,或者意图是否仅选择其中一种语言。如果需要,可以定义和使用新属性来指示此类意图。如果没有此类语义,则假定对于协商会话,将选择并使用声明的语言之一。

6.13. framerate (帧速率 Frame Rate)

名称: framerate

: framerate-value

使用级别: 媒体 (media)

字符集依赖: 否 (no)

语法:

framerate-value = non-zero-int-or-real

示例:

a=framerate:60

这给出了以帧/秒为单位的最大视频帧速率。它旨在作为视频数据编码的建议。允许分数值的十进制表示。它仅为视频媒体定义。

6.14. quality (质量)

名称: quality

: quality-value

使用级别: 媒体 (media)

字符集依赖: 否 (no)

语法:

quality-value = zero-based-integer

示例:

a=quality:10

这以整数值的形式给出了编码质量的建议。视频的质量属性旨在指定帧速率和静态图像质量之间的非默认权衡。对于视频,值在0到10的范围内,建议含义如下:

含义
10压缩方案可以提供的最佳静态图像质量
5在没有质量建议的情况下给出的默认行为
0编解码器设计者认为仍可用的最差静态图像质量

表2:编码质量值

6.15. fmtp (格式参数 Format Parameters)

名称: fmtp

: fmtp-value

使用级别: 媒体 (media)

字符集依赖: 否 (no)

语法:

fmtp-value = fmt SP format-specific-params
format-specific-params = byte-string
; 注意:
; - 格式参数是媒体类型参数,需要反映其语法。

示例:

a=fmtp:96 profile-level-id=42e016;max-mbps=108000;max-fs=3600

此属性允许以SDP不必理解的方式传达特定于特定格式的参数。格式必须是为媒体指定的格式之一。格式特定参数以分号分隔,可以是SDP需要传达并原样提供给将使用此格式的媒体工具的任何参数集。每个格式最多允许一个此属性的实例。

"a=fmtp:"属性可用于为定义使用此类参数的任何协议和格式指定参数。