5.10. Applying a Remote Description (应用远端描述)
5.10. Applying a Remote Description (应用远端描述)
执行以下步骤以应用远端描述 (remote description). 若返回错误, 会话必须恢复到执行这些步骤之前的状态.
若应答中包含任何 "a=ice-options" 属性且其中将 "trickle" 列为选项, 则将 PeerConnection 的 canTrickleIceCandidates 属性更新为 "true". 否则, 将该属性设为 "false".
必须对会话级属性执行以下步骤; 若有任何参数越界或无法应用, 处理必须停止并必须返回错误.
-
对任何指定的 "CT" 带宽值, 按 [RFC4566] 第 5.8 节将其设为所有 "m=" 段的最大总比特率上限. 在该总上限之内, 实现可以动态决定如何在各 "m=" 段之间最佳分配可用带宽, 同时尊重已为单个 "m=" 段指定的任何具体上限.
-
对任何指定的 "RR" 或 "RS" 带宽值, 按 [RFC3556] 第 2 节处理.
-
任何 "AS" 带宽值 ([RFC4566] 第 5.8 节) 必须忽略, 因为该构造在会话级的含义定义不清.
对每个 "m=" 段, 必须执行以下步骤; 若有任何参数越界或无法应用, 处理必须停止并必须返回错误.
-
若 ICE ufrag 或 password 相对上一份远端描述已变更:
-
若描述类型为 "offer", 实现必须按 [RFC8839] 第 4.4.1.1.1 节记下需要 ICE 重启.
-
若描述类型为 "answer" 或 "pranswer", 则检查当前本地描述是否为 ICE 重启, 若不是则生成错误. 若 PeerConnection 状态为 "have-remote-pranswer" 且 ICE ufrag 或 password 相对上一份临时应答已变更, 则通知 ICE 代理丢弃该 "m=" 段上任何先前的 ICE 检查单状态. 最后, 通知 ICE 代理开始检查.
-
-
若当前本地描述指示 ICE 重启, 但 ICE ufrag 与 password 均未相对上一份远端描述变更 (如 [RFC8445] 第 9 节所规定), 则生成错误.
-
配置与此媒体段关联的 ICE 组件, 使其在连通性检查中使用所提供的 ICE 远端 ufrag 与 password.
-
按 [RFC8445] 第 6.1.2 节将所提供的 ICE 候选与已收集的本地候选配对, 并使用适当凭据启动连通性检查.
-
若存在 "a=end-of-candidates" 属性, 则按 [RFC8838] 第 14 节处理候选结束指示.
-
若该 "m=" 段的
proto字段值表明使用 RTP:-
若该 "m=" 段正被回收 (见第 5.2.2 节), 通过将其
mid属性设为null来解除当前关联的 RtpTransceiver, 并丢弃收发器与其 "m=" 段索引之间的映射. -
若该 "m=" 段未与任何 RtpTransceiver 关联 (可能因上一步已解除关联), 则按以下步骤查找或创建一个 RtpTransceiver:
-
若该 "m=" 段为 sendrecv 或 recvonly, 且存在由
addTrack添加到 PeerConnection 的同类 RtpTransceiver, 它们未与任何 "m=" 段关联且未停止, 则按第 5.2.1 节所述规范顺序找到第一个这样的 RtpTransceiver. -
若上一步未找到 RtpTransceiver, 则创建一个方向为 recvonly 的收发器.
-
将找到或创建的 RtpTransceiver 与该 "m=" 段关联: 将其
mid属性设为该 "m=" 段的 MID, 并在收发器与 "m=" 段索引之间建立映射. 若该 "m=" 段不包含 MID (即远端不支持 MID 扩展), 则按第 5.2.1 节关于 "a=mid" 的指引为 RtpTransceiver 的mid属性生成一个值.
-
-
对每个本地实现也支持的指定媒体格式, 按 [RFC3264] 第 6.1 节在指定负载类型与媒体格式之间建立映射. 具体而言, 实现需记录发送各指定媒体格式时在出站 RTP 包中使用的负载类型, 以及其排序所指示的各格式相对优先级. 若某指定媒体格式不受本地实现支持, 必须忽略该格式.
-
对每个指定的 "rtx" 媒体格式, 按 [RFC4588] 第 4 节在 RTX 负载类型与其关联的主负载类型之间建立映射. 若引用的主负载类型不存在, 必须导致错误. 注意 RTX 负载类型可能引用本地媒体实现不支持的主负载类型, 此时也必须忽略该 RTX 负载类型.
-
对每个本地实现支持的指定 fmtp 参数, 在关联的媒体格式上启用它们.
-
对在 "m=" 段中信令化的每个指定同步源 (Synchronization Source, SSRC), 按 [RFC8843] 第 9.2 节准备使用该 SSRC 对发往此 "m=" 段的 RTP 流进行解复用.
-
对每个本地实现也支持的指定 RTP 头扩展, 按 [RFC5285] 第 5 节在扩展 ID 与 URI 之间建立映射. 具体而言, 实现需记录发送各指定头扩展时在出站 RTP 包中使用的扩展 ID. 若某指定 RTP 头扩展不受本地实现支持, 必须忽略该扩展.
-
对每个本地实现支持的指定 RTCP 反馈机制, 在关联的媒体格式上启用它们.
-
对任何指定的 "TIAS" ("Transport Independent Application Specific Maximum", 传输无关应用特定最大值) 带宽值, 按 [RFC3890] 将其设为发送媒体时最大 RTP 比特率的约束. 若未出现 "TIAS" 值但指定了 "AS" 值, 则使用以下公式生成 "TIAS" 值:
TIAS = AS * 1000 * 0.95 - (50 * 40 * 8)其中 1000 将单位从 kbps 转为 bps (TIAS 所要求), 0.95 用于为 RTCP 预留 5%. 随后减去报头开销估计: 50 基于每秒 50 个包, 40 基于典型报头大小 (字节), 8 将字节转为比特. 注意 "TIAS" 优于 "AS", 因其能更精确地控制带宽.
-
对任何 "RR" 或 "RS" 带宽值, 按 [RFC3556] 第 2 节处理.
-
任何指定的 "CT" 带宽值必须忽略, 因为该构造在媒体级的含义定义不清.
-
若该 "m=" 段类型为 "audio":
-
对每个指定的 "CN" 媒体格式, 按 [RFC3389] 第 5 节为所有具有相同时钟速率且受支持的媒体格式配置静音抑制, 自身已有内部静音抑制机制的格式除外. 对此类格式 (例如 Opus), 静音抑制由 fmtp 参数控制, 见第 5.2.3.2 节.
-
对每个指定的 "telephone-event" 媒体格式, 按 [RFC4733] 第 2.5.1.2 节为所有具有相同时钟速率且受支持的媒体格式启用双音多频 (DTMF) 发送. 若存在没有对应 telephone-event 格式的受支持媒体格式, 则对这些格式禁用 DTMF 发送.
-
对任何指定的 "ptime" 值, 配置可用媒体格式在发送时使用指定的包大小. 若某媒体格式不支持指定大小, 则改用最接近的值.
-
-
最后, 若此描述类型为 "pranswer" 或 "answer", 则继续执行 第 5.11 节 中定义的处理.