RTCRtpReceiver:getCapabilities() 静态方法
静态方法 RTCRtpReceiver.getCapabilities() 返回一个对象,该对象描述了当前设备上的 RTCRtpReceiver 对象所支持的编解码器和头部扩展功能。
同样,您可以通过调用静态函数 RTCRtpSender.getCapabilities() 来获取 RTCRtpSender 对象的功能。
语法
RTCRtpReceiver.getCapabilities(kind)
参数
kind-
一个字符串,指示浏览器接收器功能所请求的媒体类型。支持的媒体类型包括:
audio和video。
返回值
一个新对象,指示浏览器通过 RTCPeerConnection 接收指定媒体类型所具备的功能。如果浏览器不支持给定的媒体 kind,则返回值为 null。
返回的对象具有以下属性
codecs-
一个对象数组,每个对象描述了
RTCRtpReceiver所支持的单个 媒体编解码器 的基本功能。注意: 数组包含代表传输底层组件的特殊条目 — 如果您只关心实际用于媒体本身的编解码器,则可以忽略这些条目。这些条目将在下方的 codecs 数组 部分进行描述。
每个编解码器对象具有以下属性
channels可选-
一个正整数值,指示编解码器支持的最大声道数;例如,仅支持单声道编解码器的值为 1;立体声编解码器为 2,依此类推。
clockRate-
一个正整数,指定编解码器的时钟速率(以赫兹 (Hz) 为单位)。IANA 维护着一份 编解码器及其参数列表,包括它们的时钟速率。
mimeType-
一个字符串,指示编解码器的 MIME 媒体类型和子类型。RTP 使用的 MIME 类型字符串与在其他地方使用的不同。有关这些类型的完整 IANA 注册表,请参阅 RFC 3555,第 4 节。有关此处可能引用的潜在编解码器的详细信息,请参阅 WebRTC 使用的编解码器。
sdpFmtpLine可选-
一个字符串,给出 SDP 中与编解码器对应的
a=fmtp行中的格式特定参数字段(如果存在这样的行)。如果不存在参数字段,则此属性将被省略。
headerExtensions-
一个对象数组,每个对象提供当前媒体
kind所支持的 头部扩展 的 URI。每个对象具有以下属性
描述
作为静态函数,总是使用以下形式调用
capabilities = RTCRtpReceiver.getCapabilities("audio");
返回的功能集是最乐观的可能列表。当您实际尝试使用某些选项组合时,它们完全有可能失败。
调用 RTCRtpReceiver.getCapabilities() 并不会以任何方式预加载浏览器来处理媒体。没有任何内容被加载、获取或以其他方式准备好。它是在开始尝试访问媒体之前用于确定哪些可能可用的一种方式。
由于可用功能集在一段时间内往往是稳定的(人们不会经常安装和卸载编解码器等),因此媒体功能可以整体或部分地提供一种跨域识别用户的方法。出于此原因,在隐私敏感的上下文中,浏览器可能会选择模糊化功能;例如,可以通过省略不常用的编解码器配置来做到这一点。
codecs 数组
codecs 数组是一个对象数组,描述单个编解码器及其基本功能。浏览器只会分别报告不同的功能组合。如果两组功能可以被描述为一组,那么它们就会被合并。这意味着,例如,如果 H.264 编解码器有两个条目(由 mimeType 为 "video/H264" 标识),那么在功能对象中将有其他值表明它们在某些方面有所不同。
有三个特殊条目应该始终存在,代表传输的底层组件。这些组件是
- RED (REDundant Audio Data)
-
RED 条目的媒体类型可能因存在多个版本而异,但它将以
red结尾,例如video/red或video/fwdred。基础 RED 标准可在 RFC 2198 中找到。如果支持不同的形式,可能会有多个 RED 条目;在这种情况下,每个条目将具有唯一的媒体类型。 - FEC (Forward Error Correction)
-
FEC 组件处理纠错数据;其媒体类型也可能因存在标准的更高级版本而异,但它将始终以
fec结尾。一个可能的值是video/ulpfec(一种通用的纠错模型)。如果支持多种形式,也可能存在多个 FEC 条目。 - RTX (Retransmission)
-
此组件负责数据重传;其媒体类型应为
video/rtx。RTX 将只有一个条目,并且不会有sdpFmtpLine属性。
如果只关心与媒体相关的编解码器,则应忽略这些条目。
示例
功能支持
您可以使用 Object.hasOwn() 来检查 RTCRtpReceiver.getCapabilities() 是否受支持
log.textContent = `RTCRtpReceiver.getCapabilities() supported: ${Object.hasOwn(
RTCRtpReceiver,
"getCapabilities",
)}`;
检查对特定编解码器的支持
下面的函数返回一个布尔值,指示设备是否支持在 WebRTC 连接上接收 H.264 视频。
注意: 由于 RTCRtpReceiver.getCapabilities() 实际上只指示了 *可能的* 支持,即使从该函数获得肯定响应后,尝试接收 H.264 视频仍可能失败。
function canReceiveH264() {
let capabilities = RTCRtpReceiver.getCapabilities("video");
capabilities.codecs.forEach((codec) => {
if (codec.mimeType === "video/H264") {
return true;
}
});
return false;
}
获取所有功能
此代码示例展示了如何获取所有支持的编解码器和头部。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 更改时,侦听器会更新该值。
const log = document.querySelector("#log");
const kindSelector = document.querySelector("#kind");
logMediaCapabilities("audio");
kindSelector.addEventListener("click", () => {
log.textContent = "";
logMediaCapabilities(kindSelector.value);
});
function logMediaCapabilities(kind) {
if (!Object.hasOwn(RTCRtpReceiver, "getCapabilities")) {
log.textContent = "RTCRtpReceiver.getCapabilities() not supported";
return;
}
const capabilities = RTCRtpReceiver.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-rtcrtpreceiver-getcapabilities |
浏览器兼容性
加载中…