Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本文档定义了一组以 WebIDL 编写的 ECMAScript API,用于扩展 WebRTC 规范,以支持可伸缩视频编码(SVC)编码参数的配置。SVC 编码器和解码器能力的发现 由 Media Capabilities 规范处理。
本节描述本文档 发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。
此 API 基于 W3C ORTC 社区组所完成的初步工作。
本文档由 Web 实时 通信工作组使用 推荐标准 流程作为工作草案发布。
作为 工作草案发布并不意味着 获得 W3C 及其成员的认可。
这是一份草案文档,可能随时被其他 文档更新、取代或废弃。除将其视为 进行中的工作外,不宜引用本文档。
本文档由一个 根据 W3C 专利 政策运作的工作组制定。 W3C 维护了一份 与该工作组交付成果相关的所有专利披露的公开列表; 该页面还包含 披露专利的说明。任何实际 知晓某项专利,并认为该专利包含 基本权利要求 的个人,都必须按照 W3C 专利政策第 6 节披露相关信息。
本文档受 2025 年 8 月 18 日 W3C 流程文档管辖。
本节为非规范性内容。
本规范扩展了 WebRTC 规范 [WEBRTC],以 支持配置可伸缩视频 编码(SVC)的编码参数。SVC 编码器和解码器能力的发现 由媒体能力 API [Media-Capabilities] 处理。
本规范不会改变 WebRTC 对象和
方法的行为。因此,与提议/应答协商和
编码参数相关的限制仍然有效,如 [WEBRTC] 第
5.2 节所述:
“setParameters()
不会导致 SDP 重新协商,并且
只能用于在提议/应答所协商的范围内更改媒体栈正在发送或接收的内容。”
因此,本规范可以为 不在提议/应答中协商 SVC 支持的编解码器配置编码参数,例如 VP8 [RFC6386]、VP9 [VP9] 和 AV1 [AV1] 编解码器。 H.264 [ITU-T-REC-H.264] 和 H.265 [ITU-T-REC-H.265] 编解码器也可以支持时间可伸缩性配置。
除标记为非规范性的章节外,本规范中的所有编写指南、图示、示例和注释 均为非规范性内容。本规范中的其他所有内容均为规范性内容。
本文档中的关键字 可以、必须 和 应该 应按照 BCP 14 [RFC2119] [RFC8174] 中所述进行解释,但仅当它们像这里所示那样全部 使用大写形式出现时才如此。
本规范定义了适用于单一 产品的一致性标准:实现本规范所包含接口的用户代理。
以算法或特定步骤表述的一致性要求可以 采用任何方式实现,只要最终结果等效即可。特别是, 本规范定义的算法旨在 易于理解,而不是为了获得高性能。
使用 ECMAScript 实现本规范中所定义 API 的实现 必须以与 Web IDL 规范 [WEBIDL] 中定义的 ECMAScript 绑定一致的方式实现它们,因为 本规范使用了该规范及其术语。
“联播包络”一词在 [WEBRTC] 第 5.4.1 节中定义。
本规范引用了 [WEBRTC] 中定义的对象、方法、内部槽 和字典。
对于可伸缩视频编码(SVC),“单会话传输” (SST)和“多会话 传输”(MST)这两个术语 定义于 [RFC6190]。本规范仅 支持 SST,而 不支持 MST。
“单实时传输协议流单传输” (SRST)一词定义于 [RFC7656] 第 3.7 节,指在单一传输中传输所有层的 SVC 实现, 使用单一实时传输协议(RTP)流和 同步源(SSRC)。“多 RTP 流单 传输”(MRST)一词同样 定义于 [RFC7656] 第 3.7 节, 指在单一 传输中传输所有层的实现,它使用多个 RTP 流,并为每一层使用不同的 SSRC。 本规范仅支持 SRST,不支持 MRST。其 RTP 载荷规范 支持 SRST 的编解码器包括 VP8 [RFC7741]、VP9 [VP9-PAYLOAD]、AV1 [AV1-RTP-SPEC]、H.264 [RFC6184] 和 H.265 [RFC7798]。
“S 模式”一词指在同一个 SSRC 上发送多个
编码的可伸缩性模式。这包括 "S2T1"、"S2T1h"、
"S2T2"、
"S2T2h"、"S2T3"、"S2T3h"、"S3T1"、"S3T1h"、"S3T2"、"S3T2h"、
"S3T3"
和 "S3T3h" scalabilityMode 值。
术语 选择性转发中间盒 (SFM)定义于 [RFC7667] 第 3.7 节。
本规范通过扩展 RTCRtpEncodingParameters
字典,使得能够配置 SVC 的编码参数。
RTCRtpEncodingParameters
字典扩展WebIDLpartial dictionary RTCRtpEncodingParameters {
DOMString scalabilityMode;
};
RTCRtpEncodingParameters
成员
[WEBRTC] 描述了
addTransceiver()
(第 5.1 节)和 setParameters()
(第 5.2 节)中的错误处理,
包括使用 RTCError 来表示由于
不受支持的编码参数而导致的
“hardware-encoder-error”,
以及其他错误。
当向
setParameters()
或 addTransceiver()
提供无效的
scalabilityMode 值时,
实现会按照规定方式使用 RTCError 和其他错误。
addTransceiver()
[WEBRTC] 第 5.1 节描述了
addTransceiver()
中对
sendEncodings
的验证。
为了验证
scalabilityMode,
请在
addTransceiver
sendEncodings 验证步骤的第 3 步之后添加
以下步骤:
codec
值 codec 存在,并且同一编码的 scalabilityMode
值不受 codec 支持,则抛出一个 OperationError。
scalabilityMode
值不受 kind 的
已实现发送编解码器
列表中的任何编解码器支持,则抛出一个 OperationError。
RTCRtpEncodingParameters
包含多个
active
成员值为 true 的编码,并且
sendEncodings 包含任何这样的编码:其
scalabilityMode
值表示“S 模式”,且其
active
成员的
值为 true,则抛出一个
OperationError。
当
addTransceiver()
和
setCodecPreferences()
方法在提议/应答协商完成之前被调用时,
协商出的
编解码器及其能力可能尚未知晓。在这种情况下,
sendEncodings
中配置的
scalabilityMode
值可能不受最终协商出的编解码器支持。
但是,只有当请求的 scalabilityMode
值对任何受支持的编解码器都无效,或者请求了混合联播传输时,
才会产生错误。
为了确保所需的 scalabilityMode
值能够应用,可以使用 setCodecPreferences()
来优先选择或仅包含支持所需配置的编解码器。
例如,如果希望将时间可伸缩性与空间联播结合使用,
则在调用 addTransceiver()
时,
可以配置 sendEncodings
以发送多个具有不同分辨率的
联播流,并让每个流
使用时间可伸缩性。如果只有 VP8、VP9 和 AV1 编解码器实现
支持时间可伸缩性,则可以使用 setCodecPreferences()
从提议中移除 H.264/AVC 编解码器,从而提高
协商出支持时间可伸缩性的编解码器的可能性。
当使用 sendEncodings
通过
addTransceiver()
请求发送多个联播流时,
不能请求“S 模式”。
浏览器只能配置为使用多个 SSRC 和 RID 发送
联播编码,或者
将所有联播编码发送到单一
RTP 流上。不允许同时使用这两种联播传输
技术。
setParameters()
[WEBRTC] 第 5.2 节描述了
setParameters()
中对 parameters 的验证。
将以下
条件插入导致该操作返回以
InvalidModificationError
拒绝的 promise 的条件列表中(第 6 步),该列表位于
setParameters 验证
步骤中:
codec
值
codec 的 encoding,且该 encoding 的
scalabilityMode
值不受
codec 支持。
[[SendCodecs]] 为空
并且 encodings 包含任何这样的编码:其
scalabilityMode
值不受
kind 的
已实现发送编解码器
列表中的任何编解码器支持。
[[SendCodecs]] 不为空
并且 encodings 包含任何这样的编码:其
scalabilityMode
值无法由
sender.[[SendCodecs]]
中的任何编解码器满足。
active
成员值为 true 的编码,并且
encodings 包含任何这样的编码:其
scalabilityMode
值
表示“S 模式”,且其
active
成员的
值为 true。
"L1T1" 可伸缩性模式允许使用
setParameters()
关闭 SVC 编码。
如果使用
setParameters()
设置了 "L1T1",
则它将在
getParameters()
的响应中返回。
getParameters()
在初始协商完成之前,
getParameters()
会返回 encodings 中每个
编码的
scalabilityMode
值,即最近一次由
addTransceiver()
或
setParameters()
设置的值。
如果没有为 encodings 中的某个编码
提供
scalabilityMode
值,
或者某个值未成功设置,则
getParameters()
将不会为该编码返回
scalabilityMode
值。
初始协商完成后,getParameters()
会为 encodings 中在初始协商前具有值的每个编码返回当前配置的 scalabilityMode
值。该值可以不同于
addTransceiver()
或 setParameters()
中请求的值。
例如,如果协商期间选中的编解码器不包括
支持所需 scalabilityMode
值的编码器,则用户代理可以选择另一个值。如果配置
不符合要求,可以使用 setParameters()
更改它。
如果 addTransceiver()
或 setParameters()
没有为 encodings 中的某个编码提供
scalabilityMode
值,则在初始协商
完成后,getParameters()
将不会返回
scalabilityMode
值,而编码器将对该编码的 RTP 流使用
编解码器的默认 scalabilityMode。
每种编解码器的默认 scalabilityMode
取决于实现。默认
scalabilityMode
应该是
时间可伸缩性模式之一(例如 "L1T1"、"L1T2"、"L1T3" 等)。
本节为非规范性内容。
SVC 最常用于视频会议,其中会议 服务器(例如 SFM) 会根据参与者的设备 特性和可用带宽选择性地向其转发不同的层。在这种环境中, 应用程序将与 会议服务器协商要发送和接收的编解码器。但是,由于可伸缩性模式不会 在提议/应答中协商,因此应用程序需要通过其他方式确定 浏览器和会议服务器支持 哪些可伸缩性模式。
[Media-Capabilities] API 支持发现编码器
和解码器对可伸缩视频编码的
支持情况。scalabilityMode
用于查询编码器是否支持某个
scalabilityMode
值,以指示它是否
“受支持”、“流畅”且“节能”。
[Media-Capabilities] API 还提供
解码器对空间可伸缩性模式的支持信息。spatialScalability
指示解码器是否具有支持空间预测的能力,
这要求其能够使用分辨率不同于
当前分辨率的帧作为依赖项。如果将 spatialScalability
设置为 true,则解码器可以解码编码器支持的任何
scalabilityMode
值。
如果将 spatialScalability
设置为 false
或不存在,则解码器无法解码空间可伸缩性模式,但可以
解码编码器支持的所有其他 scalabilityMode
值。
一旦应用程序确定了哪些编解码器与
scalabilityMode
值的组合可供其使用,
就需要确定其中哪些组合受 SFM 支持。
一种处理方式是让 SFM 以接收器能力的形式指明它可以转发的编解码器
与可伸缩性模式组合。
收到 SFM 的能力后,应用程序可以计算
浏览器的 RTCRtpSender 和
SFM 的接收器所支持的
编解码器与 scalabilityMode
值的交集。这样
可以用来确定传递给浏览器
addTransceiver()
和 setParameters()
方法的参数。
以下是一些示例:
在某些情况下,计算浏览器和
SFM 能力的交集时需要考虑 RTP 标头扩展。如果
SFM 无法解析编解码器载荷
(无论是因为其设计上不这样做,还是因为载荷已加密),
那么可能需要协商某个 RTP 标头扩展(例如 [AV1-RTP-SPEC] 附录 A 中
定义的 AV1 依赖描述符),才能使
SFM 转发特定编解码器。
为考虑这种情况,可以将转发某个
编解码器所需的 RTP 标头扩展添加到 SFM 的接收器能力中。随后,应用程序可以
计算浏览器的 RTCRtpSender 和
SFM 的接收器所支持的编解码器、标头扩展和
scalabilityMode
值的交集。
本规范支持的 scalabilityMode 值,
以及与其关联的标识符和特征,均列于
下表中。这里给出了 scalabilityMode 值的名称
(区分
大小写),以及 [AV1] 第 6.7.5 节中分配的可伸缩性模式标识符,以及
第 9 节中所提供依赖关系图的链接。
虽然 [AV1] 和
VP9 [VP9]
规范支持表中定义的所有
scalabilityMode 值,
其他编解码器
规范则不支持。例如,VP8 [RFC6386]、H.264 [RFC6184] 和
H.265 [RFC7798] 仅支持
时间可伸缩性(例如 "L1T2"、"L1T3")。
此外,VP8 [RFC6386]、H.264 [RFC6184] 和 H.265 [RFC7798]
仅允许在不同 SSRC 上
传输
联播,因此不支持“S”模式(其中多个编码
在单个 RTP 流上传输)。
| 可伸缩性模式标识符 | 空间层 | 分辨率比率 | 时间层 | 层间依赖关系 | AV1 scalability_mode_idc |
|---|---|---|---|---|---|
| "L1T1" | 1 | 1 | 不适用 | ||
| "L1T2" | 1 | 2 | SCALABILITY_L1T2 | ||
| "L1T3" | 1 | 3 | SCALABILITY_L1T3 | ||
| "L2T1" | 2 | 2:1 | 1 | 是 | SCALABILITY_L2T1 |
| "L2T2" | 2 | 2:1 | 2 | 是 | SCALABILITY_L2T2 |
| "L2T3" | 2 | 2:1 | 3 | 是 | SCALABILITY_L2T3 |
| "L3T1" | 3 | 2:1 | 1 | 是 | SCALABILITY_L3T1 |
| "L3T2" | 3 | 2:1 | 2 | 是 | SCALABILITY_L3T2 |
| "L3T3" | 3 | 2:1 | 3 | 是 | SCALABILITY_L3T3 |
| "L2T1h" | 2 | 1.5:1 | 1 | 是 | SCALABILITY_L2T1h |
| "L2T2h" | 2 | 1.5:1 | 2 | 是 | SCALABILITY_L2T2h |
| "L2T3h" | 2 | 1.5:1 | 3 | 是 | SCALABILITY_L2T3h |
| "L3T1h" | 3 | 1.5:1 | 1 | 是 | |
| "L3T2h" | 3 | 1.5:1 | 2 | 是 | |
| "L3T3h" | 3 | 1.5:1 | 3 | 是 | |
| "S2T1" | 2 | 2:1 | 1 | 否 | SCALABILITY_S2T1 |
| "S2T2" | 2 | 2:1 | 2 | 否 | SCALABILITY_S2T2 |
| "S2T3" | 2 | 2:1 | 3 | 否 | SCALABILITY_S2T3 |
| "S2T1h" | 2 | 1.5:1 | 1 | 否 | SCALABILITY_S2T1h |
| "S2T2h" | 2 | 1.5:1 | 2 | 否 | SCALABILITY_S2T2h |
| "S2T3h" | 2 | 1.5:1 | 3 | 否 | SCALABILITY_S2T3h |
| "S3T1" | 3 | 2:1 | 1 | 否 | SCALABILITY_S3T1 |
| "S3T2" | 3 | 2:1 | 2 | 否 | SCALABILITY_S3T2 |
| "S3T3" | 3 | 2:1 | 3 | 否 | SCALABILITY_S3T3 |
| "S3T1h" | 3 | 1.5:1 | 1 | 否 | SCALABILITY_S3T1h |
| "S3T2h" | 3 | 1.5:1 | 2 | 否 | SCALABILITY_S3T2h |
| "S3T3h" | 3 | 1.5:1 | 3 | 否 | SCALABILITY_S3T3h |
| "L2T2_KEY" | 2 | 2:1 | 2 | 是 | SCALABILITY_L3T2_KEY |
| "L2T2_KEY_SHIFT" | 2 | 2:1 | 2 | 是 | SCALABILITY_L3T2_KEY_SHIFT |
| "L2T3_KEY" | 2 | 2:1 | 3 | 是 | SCALABILITY_L3T3_KEY |
| "L2T3_KEY_SHIFT" | 2 | 2:1 | 3 | 是 | SCALABILITY_L3T3_KEY_SHIFT |
| "L3T1_KEY" | 3 | 2:1 | 1 | 是 | |
| "L3T2_KEY" | 3 | 2:1 | 2 | 是 | SCALABILITY_L4T5_KEY |
| "L3T2_KEY_SHIFT" | 3 | 2:1 | 2 | 是 | SCALABILITY_L4T5_KEY_SHIFT |
| "L3T3_KEY" | 3 | 2:1 | 3 | 是 | SCALABILITY_L4T7_KEY |
| "L3T3_KEY_SHIFT" | 3 | 2:1 | 3 | 是 | SCALABILITY_L4T7_KEY_SHIFT |
scalabilityMode
值的指南
提出一个 scalabilityMode 值时,
应遵循以下原则:
scalabilityMode
必须定义第 5 节
表中的条目,包括可伸缩性模式标识符、空间层和
时间层、分辨率比率、层间依赖关系以及相应的
AV1 scalability_mode_idc 值(如果已分配)。
LxTy 表示具有 x
个空间层、使用 2:1 分辨率比率以及 y 个时间层的 scalabilityMode。
LxTyh 表示具有 x 个空间层、1.5:1 分辨率
比率以及
y 个时间层。SxTy 表示一个 scalabilityMode,
其中有 x 个使用 2:1 分辨率比率的联播编码,每个
联播编码包含 y 个时间层。SxTyh
表示
1.5:1 分辨率比率。LxTy_KEY 表示一个 scalabilityMode,
其中有 x 个使用 2:1 分辨率比率的空间层和 y 个时间层,
其中空间层仅
在关键帧处依赖较低的空间层。LxTy_KEY_SHIFT
模式表示一个
scalabilityMode,
其中有 x 个使用 2:1 分辨率比率的空间层和
y 个时间层,空间层仅在关键
帧处依赖较低的空间层,而后续
帧的时间标识符会向上偏移。
本节为非规范性内容。
此示例扩展了 [WEBRTC] 第 7.1 节(示例 1), 以演示发送三个空间 联播层,每层具有三个时间层,并为每个联播 层使用一个 SSRC 和 RID。仅对原始示例中的 "sendEncodings" 属性进行了更改。
const signaling = new SignalingChannel(); // 处理 JSON.stringify/parse
const constraints = {audio: true, video: true};
const configuration = {'iceServers': [{'urls': 'stun:stun.example.org'}]};
let pc;
// 调用 start() 以开始
async function start() {
pc = new RTCPeerConnection(configuration);
// 让 "negotiationneeded" 事件触发提议生成
pc.onnegotiationneeded = async () => {
try {
await pc.setLocalDescription();
// 将提议发送给另一个对等方
signaling.send({description: pc.localDescription});
} catch (err) {
console.error(err);
}
};
try {
// 获取本地流,在自视图中显示它,并添加它以便发送
const stream = await navigator.mediaDevices.getUserMedia(constraints);
selfView.srcObject = stream;
pc.addTransceiver(stream.getAudioTracks()[0], {direction: 'sendonly'});
pc.addTransceiver(stream.getVideoTracks()[0], {
direction: 'sendonly',
sendEncodings: [
{rid: 'q', scaleResolutionDownBy: 4.0, scalabilityMode: 'L1T3'},
{rid: 'h', scaleResolutionDownBy: 2.0, scalabilityMode: 'L1T3'},
{rid: 'f', scalabilityMode: 'L1T3'}
]
});
} catch (err) {
console.error(err);
}
}
signaling.onmessage = async ({data: {description, candidate}}) => {
try {
if (description) {
await pc.setRemoteDescription(description);
// 如果收到提议,则需要以应答进行回复
if (description.type == 'offer') {
await pc.setLocalDescription();
signaling.send({description: pc.localDescription});
}
} else if (candidate) {
await pc.addIceCandidate(candidate);
}
} catch (err) {
console.error(err);
}
};
这是一个包含两个空间层(比率为 2:1)和三个时间层的示例。
let sendEncodings = [
{scalabilityMode: 'L2T3'}
];
这是混合编解码器联播的示例,其中每个联播层都有 3 个时间层。
let sendEncodings = [
{rid: 'q', codec: {clockRate: 90000, mimeType: 'video/AV1'}, scaleResolutionDownBy: 4.0, scalabilityMode: 'L1T3'},
{rid: 'h', codec: {clockRate: 90000, mimeType: 'video/VP8'}, scaleResolutionDownBy: 2.0, scalabilityMode: 'L1T3'},
{rid: 'f', codec: {clockRate: 90000, mimeType: 'video/VP8'}, scalabilityMode: 'L1T3'}
];
这是一个在单个 SSRC 上包含三个空间联播层、每层都有三个时间层的示例。
let sendEncodings = [
{scalabilityMode: 'S3T3'}
]
本节为非规范性内容。
这是实现了 [WEBRTC] 和 [Media-Capabilities] 的浏览器返回的 encodingInfo(configuration)
的示例。
const contentType = 'video/VP9';
const configuration = {
type: 'webrtc',
video: {
contentType,
width: 640,
height: 480,
bitrate: 10000,
framerate: 29.97,
scalabilityMode: 'L3T3_KEY'
}
};
try {
const info = await navigator.mediaCapabilities.encodingInfo(configuration);
if (!info.supported) {
console.log(`${contentType} 不受支持。`);
return;
}
console.log(`${contentType} ${info.smooth || '不'}流畅,并且` +
`${info.powerEfficient || '不'}节能`);
} catch (err) {
console.error(err, ' 导致 encodingInfo 失败');
}
本节为非规范性内容。
这是一个 SFM 返回的接收器能力示例,该 SFM 仅支持转发 VP8、VP9 和 AV1 的时间可伸缩性模式。
"codecs": [
{
"clockRate": 90000,
"mimeType": "video/VP8",
"scalabilityModes": [
"L1T1",
"L1T2",
"L1T3"
]
},
{
"clockRate": 90000,
"mimeType": "video/VP9",
"scalabilityModes": [
"L1T1",
"L1T2",
"L1T3"
]
},
{
"clockRate": 90000,
"mimeType": "video/AV1",
"scalabilityModes": [
"L1T1",
"L1T2",
"L1T3"
]
}
]
本节为非规范性内容。
本节为非规范性内容;它没有规定任何新行为,而是 总结了规范其他部分中已存在的 信息。WebRTC API 的隐私注意事项 在 [WEBRTC] 第 13 节中进行了描述。
在 WebRTC 中,可伸缩编码工具的使用不会
在对等方之间进行协商,因此既不会在 SDP 中公开所支持的
scalabilityMode 值,
也不会公开
解码器对空间预测的支持情况。
通过尝试使用 setParameters()
API 为
每种编解码器设置
scalabilityMode 值,
应用程序可以通过记录哪些配置尝试成功、
哪些失败,来确定编码器支持的值。
但是,这并不能表明
某个 scalabilityMode
值是由硬件编码器还是软件编码器
(或二者)支持。由于 setParameters()
不支持 RTCRtpReceiver,因此无法运行等效
实验来确定解码器支持情况。
由于软件编码器支持的 scalabilityMode
值通常是
硬件所支持值的超集,因此这些实验
可获得的信息与正在使用的浏览器高度相关,而浏览器信息本身已经可以被
网页获得。一旦媒体开始传输,就可以获得有关
性能特征或某个
scalabilityMode 值
对当前使用的编解码器而言是否可解码的信息,
从而提供更多有关硬件能力的信息。
如 [Media-Capabilities] 第 3.1 节所述,媒体 能力 API 相比从本规范中获得的信息,“很可能会提供更准确且 一致的信息”。如 [Media-Capabilities] 第 3.1 节所述,“预计此信息 将与网页已经可以获得的其他信息高度相关,因为给定类别的 设备预计具有非常相似的解码/编码 能力。”
本节为非规范性内容。
本节为非规范性内容;它没有规定任何新行为,而是 总结了规范其他部分中已经存在的 信息。WebRTC 协议的安全注意事项 在 [RFC8827] 中进行了描述,而 WebRTC API 的安全和隐私注意事项 在 [WEBRTC] 第 13 节中进行了描述。
本规范中定义的可伸缩性模式的依赖关系图 如下所示。
编辑者感谢 Robin Raymond、Michael Horowitz、Harald Alvestrand、 Chris Cunningham、Danil Chapovalov、Florent Castelli、Erik Språng 和 Henrik Boström 对本规范作出的贡献,本规范源自 W3C ORTC CG 中开发的 ORTC API。
Referenced in:
Referenced in: