统一计划(Unified Plan)是用于在会话描述协议(SDP)中发送多个媒体源的 IETF 草案。谷歌在 2013 年于 Chrome 浏览器中实施了 Plan B。Plan B 实际上是 Unified Plan 的一个变种。谷歌后续又在Chrome浏览器中提供了对 Unified Plan 的支持。作为过渡方案,目前Chrome浏览器同时支持 Plan B 和 Unifed Plan,将来 Chrome 可能会取消对 Plan B 的支持。
在 Plan B 中,SDP协议为同一类的媒体使用一个"m="字段。如果同一类媒体包括多个不同的媒体轨道,比如同时包含摄像头和屏幕共享的媒体轨道,则在"m="字段中列出多个"a=ssrc"信息,以示区分。
而使用 Unified Plan 时,每个媒体轨道都分配单独的“m=”字段。如果使用多个媒体轨道,则会创建多个“m=”字段。
由于处理多个媒体轨道的方式不同,如果使用同一媒体类型的多个媒体轨道,则 Unified Plan 和 Plan B 是不兼容的,对于同一媒体类型只有一个轨道的情况,则会保持兼容。
如果 Unified Plan 客户端收到 Plan B 客户端生成的提案(offer),则 Unified Plan 客户端在调用 setRemoteDescription() 时报错。同样,如果 Plan B 客户端收到 Unified Plan 客户端生成的提案,则它只能在第一个媒体轨道触发 ontrack 事件,并丢弃其他相同类型的媒体轨道。
Chrome M69 版本开始支持 Unified Plan,但是默认支持的仍然是 Plan B。Chrome 在 WebRTC 的媒体管理接口 RTCPeerConnection 中添加了一项新的枚举类型 SdpSemantics,用于在两种计划之间进行切换。
enum SdpSemantics("plan-b", "unified-plan");
partial dictionary RTCConfiguration { SdpSemantics sdpSemantics; }
在创建对等连接时,使用如下命令启用 unified-plan。
let peer = new RTCPeerConnection({sdpSemantics : "unified-plan"});
Chrome 从 M72 版本开始改为默认支持 Unified Plan。在上述代码中,将 unified-plan 改为 plan-b 则可以切换回对 Plan B 的支持。