跳到主要内容

8.3. Examples (示例)

8.3. Examples (示例)

下列 SDP Offer/Answer 交换示例中, 双方预期均会发送与接收. 仅示出 SDP 中与媒体编解码相关的部分. 部分行因文本宽度限制而换行.

要约方到应答方的 SDP 消息:

m=video 49170 RTP/AVP 100 99 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; packetization-mode=0; sprop-parameter-sets=<parameter sets data#0>
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=42A01E; packetization-mode=1; sprop-parameter-sets=<parameter sets data#1>
a=rtpmap:100 H264/90000
a=fmtp:100 profile-level-id=42A01E; packetization-mode=2; sprop-parameter-sets=<parameter sets data#2>; sprop-interleaving-depth=45; sprop-deint-buf-req=64000; sprop-init-buf-time=102478; deint-buf-cap=128000

上述要约以三种不同分组化格式提供同一编解码器配置. 载荷类型 98 表示单 NALU 模式, 99 表示非交织模式, 100 表示交织模式. 在交织模式情况下, 还包含若应答指示支持载荷类型 100 时要约方将使用的交织参数. 在三种情况下, 参数 sprop-parameter-sets 均传送应答方在接收来自要约方的码流且接受该配置时所需的初始参数集. 注意各载荷类型的 sprop-parameter-sets 取值可以不同.

应答方到要约方的 SDP 消息:

m=video 49170 RTP/AVP 100 99 97
a=rtpmap:97 H264/90000
a=fmtp:97 profile-level-id=42A01E; packetization-mode=0; sprop-parameter-sets=<parameter sets data#3>
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=42A01E; packetization-mode=1; sprop-parameter-sets=<parameter sets data#4>; max-rcmd-nalu-size=3980
a=rtpmap:100 H264/90000
a=fmtp:100 profile-level-id=42A01E; packetization-mode=2; sprop-parameter-sets=<parameter sets data#5>; sprop-interleaving-depth=60; sprop-deint-buf-req=86000; sprop-init-buf-time=156320; deint-buf-cap=128000; max-rcmd-nalu-size=3980

由于 Offer/Answer 协商同时覆盖发送与接收码流, 要约指示要约方愿意接收的精确参数, 应答则指示应答方愿意接收的精确参数. 本例中要约方声明愿意接收载荷类型 98. 应答方通过声明等价的载荷类型 97 接受此项; 即 profile-level-idpacketization-mode 两参数取值相同 (因 packetization-mode 等于 0 且不存在 sprop-deint-buf-req). 由于所提供的载荷类型 98 被接受, 应答方需要存储 sprop-parameter-sets=<parameter sets data#0> 中的参数集, 以防要约最终选用该配置. 在应答中, 应答方在 sprop-parameter-sets=<parameter sets data#3> 中包含若最终使用该配置时将在应答方到要约方方向码流中使用的参数集.

应答方还接受载荷类型 99 与 100 所代表的两种配置的接收. 同样, 若要约最终决定使用二者之一, 应答方需要存储 sprop-parameter-sets=<parameter sets data#1>sprop-parameter-sets=<parameter sets data#2> 中的参数集. 应答方分别为载荷类型 99 与 100 提供应答方到要约方方向的初始参数集, 即 sprop-parameter-sets=<parameter sets data#4>sprop-parameter-sets=<parameter sets data#5>, 用于其发送对应载荷类型. 应答方还通过 deint-buf-cap 参数向要约方提供去交织操作的存储上限. 这仅当要约方决定发出第二次要约时才有用, 届时可将新值纳入考虑. max-rcmd-nalu-size 表示应答方可高效处理最大 3980 字节的 NALU. 但是, 不能保证网络支持该大小.

下列示例中, 要约被接受且未降级级别 (即接受默认级别 Level 3.0), 且要约中同时存在 sprop-parameter-setssprop-level-parameter-sets. 应答方必须忽略 sprop-level-parameter-sets=<parameter sets data#1>, 并存储 sprop-parameter-sets=<parameter sets data#0> 中的参数集以解码传入 NAL 单元流. 要约方必须存储应答中 sprop-parameter-sets=<parameter sets data#2> 内的参数集以解码传入 NAL 单元流. 注意本例中 sprop-parameter-sets=<parameter sets data#2> 内的参数集必须与 Level 3.0 关联.

要约 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1; sprop-parameter-sets=<parameter sets data#0>; sprop-level-parameter-sets=<parameter sets data#1>

应答 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1; sprop-parameter-sets=<parameter sets data#2>

下列示例中, 要约 (Baseline profile, Level 1.1) 被接受且级别降级 (接受级别为 Level 1b), 且要约中同时存在 sprop-parameter-setssprop-level-parameter-sets. 应答方必须忽略 sprop-parameter-sets=<parameter sets data#0> 以及 sprop-level-parameter-sets=<parameter sets data#1> 中不属于接受级别 (Level 1b) 的所有参数集, 必须存储 sprop-level-parameter-sets=<parameter sets data#1> 中为接受级别 (Level 1b) 的参数集以解码传入 NAL 单元流. 要约方必须存储应答中 sprop-parameter-sets=<parameter sets data#2> 内的参数集以解码传入 NAL 单元流. 注意本例中 sprop-parameter-sets=<parameter sets data#2> 必须与 Level 1b 关联.

要约 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A00B; //Baseline profile, Level 1.1 packetization-mode=1; sprop-parameter-sets=<parameter sets data#0>; sprop-level-parameter-sets=<parameter sets data#1>

应答 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42B00B; //Baseline profile, Level 1b packetization-mode=1; sprop-parameter-sets=<parameter sets data#2>; use-level-src-parameter-sets=1

下列示例中, 要约 (Baseline profile, Level 1.1) 被接受且级别降级 (接受级别为 Level 1b), 且要约中同时存在 sprop-parameter-setssprop-level-parameter-sets. 但应答方为旧版 RFC 3984 实现, 不理解 sprop-level-parameter-sets; 因此应答中不包含 use-level-src-parameter-sets (应答方也不理解该参数). 因此应答方必须同时忽略 sprop-parameter-sets=<parameter sets data#0>sprop-level-parameter-sets=<parameter sets data#1>, 且要约方必须在带内传送参数集.

要约 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A00B; //Baseline profile, Level 1.1 packetization-mode=1; sprop-parameter-sets=<parameter sets data#0>; sprop-level-parameter-sets=<parameter sets data#1>

应答 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42B00B; //Baseline profile, Level 1b packetization-mode=1

下列示例中, 要约被接受且未降级级别, 且要约中存在 sprop-parameter-sets. sprop-parameter-sets=<parameter sets data#0> 中的参数集必须由要约方编码器与应答方解码器存储并使用, sprop-parameter-sets=<parameter sets data#1> 中的参数集必须由应答方编码器与要约方解码器使用. 注意 sprop-parameter-sets=<parameter sets data#0>sprop-parameter-sets=<parameter sets data#1> 基本相互独立.

要约 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1; sprop-parameter-sets=<parameter sets data#0>

应答 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1; sprop-parameter-sets=<parameter sets data#1>

下列示例中, 要约被接受且未降级级别, 且要约中既不存在 sprop-parameter-sets 也不存在 sprop-level-parameter-sets, 即无参数集带外传送, 参数集须在带内传送.

要约 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1

应答 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1

下列示例中, 要约被接受且级别降级, 且要约中存在 sprop-parameter-sets. 由于 sprop-parameter-sets=<parameter sets data#0> 所含 level_idc 指示 Level 3.0, 而应答方希望 Level 2.0, 因此不能被应答方使用, 必须忽略, 且必须使用带内参数集.

要约 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1; sprop-parameter-sets=<parameter sets data#0>

应答 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A014; //Baseline profile, Level 2.0 packetization-mode=1

下列示例中, 要约同样被接受且级别降级, 且要约中既不存在 sprop-parameter-sets 也不存在 sprop-level-parameter-sets, 即无参数集带外传送, 参数集须在带内传送.

要约 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1

应答 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A014; //Baseline profile, Level 2.0 packetization-mode=1

下列示例中, 要约被接受且级别升级, 且要约与应答中均既不存在 sprop-parameter-sets 也不存在 sprop-level-parameter-sets, 即无参数集带外传送, 参数集须在带内传送. 要约方到应答方方向使用 Level 3.0, 应答方到要约方方向使用 Level 2.0. 应答方允许发送最高到 Level 2.0 (含) 的任意级别, 要约方允许发送最高到 Level 3.0 (含) 的任意级别.

要约 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A014; //Baseline profile, Level 2.0 packetization-mode=1; level-asymmetry-allowed=1

应答 SDP:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1; level-asymmetry-allowed=1

下列示例中, 要约方为 Topo-Video-switch-MCU [29] 类拓扑中的多点控制单元 (MCU), 提供从另三名参与者 (B, C, D) 收到 (使用带外传送) 的参数集, 并从作为应答方的参与者 A 接收参数集. 参与者由其规范名 (CNAME) 取值标识, 映射到不同 SSRC 值. 四名参与者使用同一编解码器配置. 参与者 A 存储并将 <parameter sets data#B>, <parameter sets data#C>, <parameter sets data#D> 中的参数集分别与参与者 B, C, D 关联, 并仅使用 <parameter sets data#B> 解码源自参与者 B 的 RTP 分组中的 NAL 单元, 仅使用 <parameter sets data#C> 解码源自参与者 C 的 RTP 分组中的 NAL 单元, 仅使用 <parameter sets data#D> 解码源自参与者 D 的 RTP 分组中的 NAL 单元.

要约 SDP:

m=video 49170 RTP/AVP 98
a=ssrc:SSRC-B cname:CNAME-B
a=ssrc:SSRC-C cname:CNAME-C
a=ssrc:SSRC-D cname:CNAME-D
a=ssrc:SSRC-B fmtp:98 sprop-parameter-sets=<parameter sets data#B>
a=ssrc:SSRC-C fmtp:98 sprop-parameter-sets=<parameter sets data#C>
a=ssrc:SSRC-D fmtp:98 sprop-parameter-sets=<parameter sets data#D>
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1

应答 SDP:

m=video 49170 RTP/AVP 98
a=ssrc:SSRC-A cname:CNAME-A
a=ssrc:SSRC-A fmtp:98 sprop-parameter-sets=<parameter sets data#A>
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; //Baseline profile, Level 3.0 packetization-mode=1