RTCRtpSender: setParameters() 方法

setParameters()RTCRtpSender 接口的方法,用于更改发送方 track 的配置,trackRTCRtpSender 负责的 MediaStreamTrack

换句话说,setParameters() 更新 RTP 传输的配置以及 WebRTC 连接上特定传出媒体轨道的编码配置。

语法

js
setParameters(parameters)

参数

parameters

一个参数对象,之前通过调用相同发送方的 getParameters() 方法获得,包含发送方配置参数的所需更改。这些参数包括可用于对发送方 track 进行编码的潜在编解码器。可用的参数包括:

encodings

一个对象数组,每个对象指定可用于对轨道媒体进行编码的单个编解码器的参数。对象属性包括:

active

将此值设置为 true(默认值)会导致发送此编码,而 false 会阻止其发送和使用(但不会导致删除 SSRC)。

dtx 已弃用 非标准

仅用于 RTCRtpSenderkindaudio,此属性指示是否使用不连续传输(一项功能,在没有语音活动时,手机会自动关闭或麦克风静音)。该值取 enableddisabled

maxBitrate

一个正整数,指示用户代理允许分配给使用此编码进行编码的轨道的每秒最大比特数。其他参数可能会进一步限制比特率,例如 maxFramerate 的值,或传输或物理网络可用的带宽。

该值使用由 RFC 3890,第 6.2.2 节 定义的标准传输独立应用程序特定最大值 (TIAS) 带宽计算;这是在不考虑 IP、TCP 或 UDP 等协议开销的情况下所需的带宽。

请注意,可以以多种方式实现比特率,具体取决于媒体和编码。例如,对于视频,可以通过丢帧来实现低比特率(比特率为零可能只允许发送一帧),而对于音频,如果比特率过低而无法发送,则轨道可能必须停止播放。

maxFramerate

一个值,指定此编码允许的最大每秒帧数。

priority

一个字符串,指示 RTCRtpSender 的优先级,这可能决定用户代理如何在发送方之间分配带宽。允许的值为 very-lowlow(默认值)、mediumhigh

rid

一个字符串,如果设置,则指定要使用 RID 标头扩展发送的RTP 流 IDRID)。此参数无法使用 setParameters() 修改。其值只能在首次创建转发器时设置。

scaleResolutionDownBy

仅用于发送方,其轨道的 kindvideo,这是一个浮点值,指定在编码期间缩小视频的因子。默认值 1.0 表示视频将以其原始大小进行编码。值为 2.0 将视频帧在每个维度上缩小 2 倍,从而使视频的大小为原始视频的 1/4。该值不得小于 1.0(尝试将视频缩放到更大的尺寸将抛出 RangeError)。

transactionId

包含唯一 ID 的字符串。此 ID 在之前的 getParameters() 调用中设置,并确保参数源自之前的 getParameters() 调用。

codecs

一个对象数组,描述发送方将从中选择的 媒体编解码器。此参数一旦最初设置就不能更改。

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

channels 可选

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

clockRate

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

mimeType

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

payloadType

用于识别此编解码器的 RTP 有效负载类型

sdpFmtpLine 可选

一个字符串,提供本地描述提供的格式特定参数。

headerExtensions

一个包含零个或多个 RTP 标头扩展的数组,每个扩展都标识发送方支持的扩展。标头扩展在 RFC 3550,第 5.3.1 节 中进行了描述。此参数无法更改。

rtcp

一个 RTCRtcpParameters 对象,提供用于发送方 RTCP 的配置参数。此参数无法更改。

degradationPreference 已弃用

指定 WebRTC 层在带宽受限的情况下处理优化带宽与质量的首选方式。可能的值为 maintain-frameratemaintain-resolutionbalanced。默认值为 balanced

返回值

一个 Promise,当 RTCRtpSender.track 属性使用给定参数更新时解析。

异常

如果发生错误,则返回的 promise 将被以下列表中的相应异常拒绝。

InvalidModificationError DOMException

如果检测到以下问题之一,则返回:

  • parameters 对象的 encodings 属性中指定的编码数与当前列出的 RTCRtpSender 的编码数不匹配。发送方创建后,无法更改编码选项的数量。
  • 指定的 encodings 的顺序已从当前列表的顺序更改。
  • 已尝试更改发送方首次创建后无法更改的属性。
InvalidStateError DOMException

如果 RTCRtpSender 所属的转发器未运行或没有要设置的参数,则返回。

OperationError DOMException

如果发生与此处指定的错误不匹配的错误,则返回。

RangeError

如果为 scaleResolutionDownBy 选项指定的值小于 1.0(这将导致放大而不是缩小,这是不允许的);或者如果一个或多个指定的 encodings maxFramerate 值小于 0.0,则返回。

此外,如果在配置或访问媒体时发生 WebRTC 错误,则会抛出 RTCError,其 errorDetail 设置为 hardware-encoder-error

描述

务必记住,您不能自己创建 parameters 对象并期望它能工作。相反,您必须首先调用 getParameters(),修改接收到的参数对象,然后将该对象传递给 setParameters()。WebRTC 使用参数对象的 transactionId 属性来确保在设置参数时,您的更改基于最新的参数,而不是过时的配置。

示例

setParameters() 的一个用例是通过更改 RTCRtpSender 传输的媒体的分辨率和/或比特率来尝试减少带宽受限环境中使用的网络带宽。

目前,某些浏览器在其实现中存在一些限制,可能会导致问题。因此,这里提供了两个示例。第一个示例展示了在所有浏览器完全支持所用参数时如何使用setParameters(),而第二个示例则演示了解决浏览器对maxBitratescaleResolutionDownBy参数支持不完整时的限制的解决方法。

根据规范

一旦所有浏览器完全实现了规范,setVideoParams()的这种实现将能够完成工作。这演示了所有内容应该如何工作。您现在可能应该使用下面的第二个示例。但这更清楚地展示了基本概念,即首先获取参数,然后更改参数,然后设置参数。

js
async function setVideoParams(sender, height, bitrate) {
  const scaleRatio = sender.track.getSettings().height / height;
  const params = sender.getParameters();

  params.encodings[0].scaleResolutionDownBy = Math.max(scaleRatio, 1);
  params.encodings[0].maxBitrate = bitrate;
  await sender.setParameters(params);
}

在调用此函数时,您需要指定一个发送方,以及您希望将发送方视频缩放到的高度,以及允许发送方传输的最大比特率。计算视频大小的缩放因子scaleRatio。然后使用getParameters()获取发送方的当前参数。

然后通过更改第一个encodings对象的scaleResolutionDownBymaxBitrate为计算出的缩放因子和指定的最大bitrate来更改参数。

然后通过调用发送方的setParameters()方法保存更改后的参数。

当前兼容的实现

如上所述,前面的示例展示了事物应该如何工作。不幸的是,目前许多浏览器都存在一些实现问题,无法做到这一点。因此,如果您希望与运行 Safari 的 iPhone 和其他设备以及 Firefox 兼容,请使用更类似于以下代码的代码

js
async function setVideoParams(sender, height, bitrate) {
  const scaleRatio = sender.track.getSettings().height / height;
  const params = sender.getParameters();

  // If encodings is null, create it

  if (!params.encodings) {
    params.encodings = [{}];
  }

  params.encodings[0].scaleResolutionDownBy = Math.max(scaleRatio, 1);
  params.encodings[0].maxBitrate = bitrate;
  await sender.setParameters(params);

  // If the newly changed value of scaleResolutionDownBy is 1,
  // use applyConstraints() to be sure the height is constrained,
  // since scaleResolutionDownBy may not be implemented

  if (sender.getParameters().encodings[0].scaleResolutionDownBy === 1) {
    await sender.track.applyConstraints({ height });
  }
}

这里的差异

  • 如果encodingsnull,我们将创建它,以确保我们随后可以成功设置参数而不会崩溃。
  • 如果在设置参数后,scaleResolutionDownBy的值仍然为 1,我们将调用发送方的轨道 applyConstraints() 方法以将轨道的“高度”限制为height。这弥补了未实现的scaleResolutionDownBy(截至撰写本文时,Safari 中就是这样)。

如果浏览器完全实现了所用功能,则此代码将干净地回退并以正常方式工作。

规范

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

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅