RTCRtpTransceiver:setCodecPreferences() 方法

Baseline 2024
新推出

自 ⁨2024 年 7 月⁩起,此功能可在最新的设备和浏览器版本上使用。此功能可能无法在较旧的设备或浏览器上使用。

RTCRtpTransceiver 接口的 setCodecPreferences() 方法用于设置收发器允许解码*接收*数据的编解码器,并按首选项递减的顺序排列。

使用此方法设置的首选项会影响与远程对等方协商用于编码其发送的数据(包括用于重传、冗余和前向纠错的编解码器)的编解码器。不在首选项列表中的编解码器将不会包含在协商中。请注意,此收发器用于*发送*内容的偏好设置取决于远程对等方的偏好设置。

设置编解码器偏好的推荐方法是,首先获取实际支持解码接收数据的编解码器数组,然后按首选项递减的顺序重新排序。这可以确保数组按要求排序,不包含任何不支持的编解码器,并且还包含重传、冗余和前向纠错所需的编解码器。

指定的编解码器集将用于包含此收发器的所有未来连接,直到再次调用此方法为止。

在准备打开 RTCPeerConnection 时,应在调用 RTCPeerConnection.createOffer()createAnswer() *之前*使用 setCodecPreferences() 设置编解码器,因为这些方法会发起协商(并且默认情况下将使用*用户代理*默认配置中的编解码器参数)。

可以在正在进行的通信中更改编解码器,但需要先调用 setCodecPreferences(),然后启动新的协商。WebRTC 应用程序已经在 negotiationneeded 事件处理程序 中包含了此代码。但请注意,在撰写本文时,调用 setCodecPreferences() 时不会自动触发该事件,因此您必须自己调用 onnegotiationneeded

有关 WebRTC 支持的编解码器(以及每个编解码器的优缺点)的指南,请参阅 WebRTC 使用的编解码器

语法

js
setCodecPreferences(codecs)

参数

codecs

一个对象数组,每个对象都提供收发器支持的 媒体编解码器 的参数,并按首选项排序。如果 codecs 为空,则所有编解码器配置将恢复到用户代理的默认设置。

注意: codecs 中未包含的任何编解码器在协商连接的过程中都不会被考虑。这可以防止使用您不希望使用的编解码器。

数组中的每个编解码器对象都具有以下属性

channels 可选

一个正整数,指示编解码器支持的通道数。例如,对于音频编解码器,值为 1 表示单声道,值为 2 表示立体声。

clockRate

一个正整数,指定编解码器的时钟频率(以赫兹 (Hz) 为单位)。时钟频率是编解码器的 RTP 时间戳前进的速率。大多数编解码器都有特定的允许值或允许值范围。IANA 维护着一个编解码器及其参数列表,包括其时钟频率。

mimeType

一个字符串,指示编解码器的 MIME 媒体类型和子类型,格式为 "type/subtype"。RTP 使用的 MIME 类型字符串与别处使用的不同。IANA 维护着一个有效 MIME 类型注册表。另请参阅 WebRTC 使用的编解码器,了解可能在此引用的潜在编解码器的详细信息。

sdpFmtpLine 可选

一个字符串,给出 a=fmtp 行中与编解码器对应的格式特定参数字段(来自 SDP),如果该字段存在。如果不存在参数字段,则省略此属性。

返回值

无(undefined)。

异常

InvalidAccessError DOMException

codecs 列表包含一个或多个收发器关联的 RTCRtpReceiver 不支持的编解码器。

InvalidModificationError DOMException

codecs 列表仅包含 RTX、RED、FEC 或 Comfort Noise 的条目,或者是一个空集。编解码器列表必须始终包含媒体编解码器。

示例

创建首选编解码器数组

设置编解码器偏好的推荐方法是,首先获取实际支持解码接收数据的编解码器数组,然后按首选项递减的顺序重新排列列表。

重要的是要从支持的编解码器列表开始(而不是硬编码您的首选编解码器列表),因为如果您包含任何与关联的 RTCRtpReceiver 不兼容的编解码器,当您调用 setCodecPreferences() 方法时,浏览器将抛出 InvalidAccessError 异常。此外,数组必须包含用于重传、冗余和前向纠错的适当编解码器,从支持的编解码器列表开始可以确保这些编解码器存在。

您可以使用 RTCRtpReceiver.getCapabilities() 静态方法获取支持解码数据的编解码器,如下所示:

js
const availReceiveCodecs = transceiver.receiver.getCapabilities("video").codecs;

要将编解码器数组重新排序为我们首选的顺序,我们可以使用下面的排序函数,根据 MIME 类型进行排序(此函数来自 blog.mozilla.org (2024) 的 setCodecPreferences is now in all browsers!)。

js
function sortByMimeTypes(codecs, preferredOrder) {
  return codecs.sort((a, b) => {
    const indexA = preferredOrder.indexOf(a.mimeType);
    const indexB = preferredOrder.indexOf(b.mimeType);
    const orderA = indexA >= 0 ? indexA : Number.MAX_VALUE;
    const orderB = indexB >= 0 ? indexB : Number.MAX_VALUE;
    return orderA - orderB;
  });
}

该方法接受支持的编解码器列表,以及一个包含首选 MIME 类型(按递减顺序)的数组,并就地返回排序后的数组。下面的代码展示了如何使用它,假设您已经设置了一个对等连接(peerConnection)。

js
// Get supported codecs the sort using preferred codecs
const supportedCodecs = RTCRtpReceiver.getCapabilities("video").codecs;
const preferredCodecs = ["video/H264", "video/VP8", "video/VP9"];
const sortedCodecs = sortByMimeTypes(supportedCodecs, preferredCodecs);

// Get transceiver for connection and set the preferences
const [transceiver] = peerConnection.getTransceivers();
transceiver.setCodecPreferences(sortedCodecs); // <---

规范

规范
WebRTC:浏览器中的实时通信
# dom-rtcrtptransceiver-setcodecpreferences

浏览器兼容性

另见