RTCRtpSender:getCapabilities() 静态方法
静态方法 RTCRtpSender.getCapabilities()
返回一个对象,描述 RTCRtpSender
支持的编解码器和头部扩展功能。
类似地,您可以通过调用静态函数 RTCRtpReceiver.getCapabilities()
获取设备上 RTCRtpReceiver
对象的功能。
语法
RTCRtpSender.getCapabilities(kind)
参数
kind
-
一个字符串,指示请求浏览器发送功能的媒体类型。支持的媒体类型包括:
audio
和video
。
返回值
一个新对象,指示浏览器通过 RTCPeerConnection
发送指定媒体类型的能力。如果浏览器不支持给定的媒体 kind
,则返回的值为 null
。
返回的对象具有以下属性
codecs
-
一个对象数组,每个对象描述
RTCRtpSender
支持的单个 媒体编解码器 的基本功能。注意: 该数组包含表示传输基础组件的特殊条目 - 如果您只对用于媒体本身的实际编解码器感兴趣,可以忽略这些条目。这些在下面的 编解码器数组 部分中描述。
每个编解码器对象都具有以下属性
channels
可选-
一个正整数,表示编解码器支持的最大通道数;例如,只支持单声道声音的编解码器将具有值为 1;立体声编解码器将具有值为 2 等。
clockRate
-
一个正整数,指定编解码器的时钟速率(以赫兹 (Hz) 为单位)。IANA 维持着 编解码器及其参数的列表,包括它们的时钟速率。
mimeType
-
一个字符串,指示编解码器的 MIME 媒体类型和子类型。RTP 使用的 MIME 类型字符串与其他地方使用的不同。有关这些类型的完整 IANA 注册表,请参阅 RFC 3555,第 4 节。有关此处可能引用的潜在编解码器的详细信息,另请参阅 WebRTC 使用的编解码器。
sdpFmtpLine
可选-
一个字符串,提供与编解码器相对应的 SDP 中
a=fmtp
行的格式特定参数字段(如果存在)。如果没有参数字段,则省略此属性。
headerExtensions
-
一个对象数组,每个对象提供当前
kind
媒体支持的 头部扩展 的 URI。每个对象都具有以下属性
描述
作为静态函数,始终使用以下形式调用它
capabilities = RTCRtpSender.getCapabilities("audio");
返回的功能集是最乐观可能的列表。在您实际尝试使用它们时,某些选项组合可能无法正常工作。
调用 RTCRtpSender.getCapabilities()
不会以任何方式启动浏览器处理媒体。不会加载、获取或以其他方式准备任何内容。它是一种方法,可以在尝试访问媒体之前确定可能可用的内容。
由于可用的功能集往往在一段时间内保持稳定(人们不会频繁地安装和卸载编解码器等),因此媒体功能在整体上或部分上可以提供跨域方法来识别用户。出于隐私敏感性的考虑,浏览器可能会选择模糊这些功能;例如,可以通过省略很少使用的编解码器配置来实现。
编解码器数组
codecs
数组是一个对象数组,描述单个编解码器及其基本功能。浏览器只会单独报告不同的功能组合。如果两组功能可以描述为一个,那么它们将被描述为一个。这意味着,例如,如果存在两个 H.264 编解码器的条目(由 mimeType
为“video/H264”标识),则功能对象中的其他值会指示它们在某些方面有何不同。
始终存在三个特殊的条目,它们代表传输的基础组件。这些组件是
- RED(冗余音频数据)
-
RED 条目的媒体类型可能会因存在多个版本而异,但它将以
red
结尾,例如video/red
或video/fwdred
。RED 的基本标准可以在 RFC 2198 中找到。如果支持不同的形式,可能存在多个 RED 条目;在这种情况下,每个条目将具有唯一的媒体类型。 - FEC(前向纠错)
-
FEC 组件处理纠错数据;它的媒体类型也可能会因存在高级版本的标准而异,但它将始终以
fec
结尾。一个可能的值是video/ulpfec
(通用错误连接模型)。如果支持多个形式,也可能存在多个 FEC 条目。 - RTX(重传)
-
此组件负责数据重传;它的媒体类型应为
video/rtx
。RTX 只有一个条目,它没有sdpFmtpLine
属性。
如果只对与媒体相关的编解码器感兴趣,可以忽略这些条目。
示例
功能支持
您可以使用 Object.hasOwn()
检查是否支持 RTCRtpSender.getCapabilities()
log.textContent = `RTCRtpSender.getCapabilities() supported: ${Object.hasOwn(
RTCRtpSender,
"getCapabilities",
)}`;
检查对特定编解码器的支持
以下函数返回一个 true
或 false
,指示设备是否支持在 RTCRtpSender
上发送 H.264 视频。
注意: 由于 RTCRtpSender.getCapabilities()
实际上只指示可能的支持。因此,即使从该函数获得了肯定的响应,H.264 支持也可能仍然失败。
function canSendH264() {
let capabilities = RTCRtpSender.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) {
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 |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。