RTCRtpSender: getCapabilities() 静态方法

Baseline 2023
新推出

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

静态方法 RTCRtpSender.getCapabilities() 返回一个对象,该对象描述了 RTCRtpSender 支持的编解码器和头部扩展功能。

类似地,您可以通过调用静态函数 RTCRtpReceiver.getCapabilities() 来获取设备上 RTCRtpReceiver 对象的连接能力。

语法

js
RTCRtpSender.getCapabilities(kind)

参数

kind

一个字符串,指示请求浏览器发送功能的媒体类型。支持的媒体类型为:audiovideo

返回值

一个新对象,指示浏览器通过 RTCPeerConnection 发送指定媒体类型的能力。如果浏览器对给定的媒体 kind 没有支持,则返回值为 null

返回的对象具有以下属性

codecs

一个对象数组,每个对象描述 RTCRtpSender 支持的单个 媒体编解码器 的基本功能。

注意: 该数组包含表示传输底层组件的特殊条目 — 如果您只对用于媒体本身的实际编解码器感兴趣,可以忽略它们。这些内容将在下面的 The codecs array 部分进行描述。

每个编解码器对象具有以下属性

channels 可选

一个正整数值,指示编解码器支持的最大声道数;例如,仅支持单声道的声音的编解码器值为 1;立体声音频编解码器值为 2,依此类推。

clockRate

一个正整数,指定编解码器的时钟速率(以赫兹 (Hz) 为单位)。IANA 维护着一个编解码器及其参数列表,包括它们的时钟速率。

mimeType

一个字符串,指示编解码器的 MIME 媒体类型和子类型。RTP 使用的 MIME 类型字符串与其他地方使用的不同。有关这些类型的完整 IANA 注册表,请参阅 RFC 3555,第 4 部分。有关此处可能引用的潜在编解码器的详细信息,请参阅 WebRTC 使用的编解码器

sdpFmtpLine 可选

一个字符串,表示 SDP 中 a=fmtp 行中与编解码器对应的格式特定参数字段,如果存在该行。如果没有参数字段,则省略此属性。

headerExtensions

一个对象数组,每个对象提供当前媒体 kind 支持的头部扩展的 URI。每个对象具有以下属性

uri

一个字符串,指定头部扩展的 URI。URI 的格式按照 RFC 5285 中的描述进行。

描述

作为一个静态函数,它始终以以下形式调用

js
capabilities = RTCRtpSender.getCapabilities("audio");

返回的功能集是最乐观的可能列表。您在实际尝试使用时,某些选项组合完全可能无法正常工作。

调用 RTCRtpSender.getCapabilities() 并不会以任何方式预先准备浏览器处理媒体。没有任何内容被加载、获取或以其他方式准备。它是一种在尝试访问媒体之前确定可能可用内容的方法。

由于可用功能集在一段时间内趋于稳定(人们不会经常安装和卸载编解码器等),因此媒体功能可以整体或部分地提供一种跨域识别用户的方法。因此,在隐私敏感的上下文中,浏览器可能会选择模糊功能;例如,可以通过省略很少使用的编解码器配置来做到这一点。

编解码器数组

codecs 数组是一个对象数组,用于描述单个编解码器及其基本功能。浏览器只会单独报告不同的功能组合。如果两组功能可以合并描述为一组,它们就会被合并。这意味着,例如,如果 H.264 编解码器有两个条目(由 mimeType 为 "video/H264" 标识),那么在功能对象中会有其他值指示它们在某些方面有所不同。

有三个特殊条目应始终存在,它们代表传输的底层组件。这些组件是

RED (REDundant Audio Data)

RED 条目的媒体类型可能会因其有多个版本而有所不同,但它将以 red 结尾,例如 video/redvideo/fwdred。基础 RED 标准可在 RFC 2198 中找到。如果支持不同的 RED 形式,则可能存在多个条目;在这种情况下,每个条目将具有唯一的媒体类型。

FEC (Forward Error Correction)

FEC 组件处理纠错数据;由于该标准有高级版本可用,其媒体类型也可能有所不同,但它将始终以 fec 结尾。一个可能的值是 video/ulpfec(一种通用的纠错模型)。如果支持多种 FEC 形式,也可能存在多个 FEC 条目。

RTX (Retransmission)

此组件负责数据重传;其媒体类型应为 video/rtx。RTX 将只有一个条目,并且它不会有 sdpFmtpLine 属性。

如果您只关心与媒体相关的编解码器,则应忽略这些条目。

示例

功能支持

您可以使用 Object.hasOwn() 来检查 RTCRtpSender.getCapabilities() 是否受支持

js
log.textContent = `RTCRtpSender.getCapabilities() supported: ${Object.hasOwn(
  RTCRtpSender,
  "getCapabilities",
)}`;

检查对特定编解码器的支持

下面的函数返回 truefalse,指示设备是否支持在 RTCRtpSender 上发送 H.264 视频。

注意: 由于 RTCRtpSender.getCapabilities() 实际上只指示可能的支持。因此,即使从该函数获得肯定响应后,下面的 H.264 支持仍可能失败。

js
function canSendH264() {
  let capabilities = RTCRtpSender.getCapabilities("video");

  capabilities.codecs.forEach((codec) => {
    if (codec.mimeType === "video/H264") {
      return true;
    }
  });
  return false;
}

获取所有功能

此代码示例展示了如何获取所有支持的编解码器和头部。HTML 定义了一个用于两种功能类型的选择列表和一个日志区域。

html
<select id="kind">
  <option value="audio">audio</option>
  <option value="video">video</option>
</select>
<textarea rows="40" cols="100" id="log"></textarea>

JavaScript 定义了一个函数来记录特定“kind”的功能。该函数最初以值 audio 调用。当选择列表 kind 更改时,侦听器会更新该值。

js
const log = document.querySelector("#log");
const kindSelector = document.querySelector("#kind");

logMediaCapabilities("audio");

kindSelector.addEventListener("click", () => {
  log.textContent = "";
  logMediaCapabilities(kindSelector.value);
});

function logMediaCapabilities(kind) {
  const capabilities = RTCRtpSender.getCapabilities(`${kind}`);
  log.textContent += "Headers\n";
  capabilities.headerExtensions.forEach((header) => {
    log.textContent += ` uri: ${header.uri}\n`;
  });

  log.textContent += "\nCodecs\n";
  capabilities.codecs.forEach((codec) => {
    log.textContent += ` mime type: ${codec.mimeType}\n`;
    log.textContent += `   channels: ${codec.channels}\n`; // max channels - e.g. 2 is stereo
    log.textContent += `   clockRate: ${codec.clockRate}\n`; // clock rate in Hz
    log.textContent += `   sdpFmtpLine: ${codec.sdpFmtpLine}\n`; // mime media type and subtype
  });
}

结果

规范

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

浏览器兼容性