WebRTC 1.0 之路,包括 VP8
Safari 11 是第一个支持 WebRTC 的 Safari 版本。从那时起,我们一直在努力改进 WebKit 的实现并使其符合规范。我很高兴宣布在 iOS 12.2 和 macOS 10.14.4 测试版上的 Safari 12.1 中,WebRTC 有了重大改进,包括支持VP8 视频编解码器、视频同步广播以及统一计划 SDP(会话描述协议)实验性支持。
VP8 视频编解码器
VP8 视频编解码器广泛用于现有的 WebRTC 解决方案中。现在,它在 iOS 和 macOS 测试版的 Safari 12.1 中作为仅限 WebRTC 的视频编解码器受到支持。通过支持 VP8 和 H.264,Safari 12.1 可以与任何其他 WebRTC 端点交换视频。H.264 是 Safari 的默认编解码器,因为它由硬件加速支持并针对实时通信进行了优化。这提供了出色的用户体验和电源效率。我们发现在实验室条件下,在 iPhone 7 Plus 上进行 720p 视频通话时使用 H.264,与 VP8 相比,电池续航时间可增加长达一小时。通过 H.264、VP8 和统一计划,Safari 可以在单个连接上混合使用 H.264 和 VP8。这就像执行以下操作一样简单
const localStream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
var pc = new RTCPeerConnection();
// Create a transceiver to send video.
pc.addTransceiver('video', { direction: 'sendonly'}).sender.replaceTrack(localStream.getVideoTracks()[0]);
// Create a transceiver to receive video.
pc.addTransceiver('video', { direction: 'recvonly'});
// Send the offer to the other party.
sendOffer(await pc.createOffer());
// Other party selects H.264 for the 1st transceiver and VP8 for the 2nd transceiver.
视频同步广播
为了进一步改善 WebRTC 对多方视频会议的支持,现在 H.264 和 VP8 都支持同步广播。感谢 libwebrtc 社区,包括 Cosmo Software,在该重要领域取得了巨大进展。同步广播是一种技术,它使用不同的编码参数(通常是不同的帧大小和比特率)编码相同的视频内容。当通过中央服务器(称为 SFU)将相同内容发送到多个客户端时,这尤其有用。由于客户端可能有不同的限制(屏幕尺寸、网络条件),SFU 能够将最适合的流发送给每个客户端。每个单独的编码可以在发送端使用 RTCRtpSender.setParameters
进行控制。同步广播目前通过SDP 混淆激活。未来的工作应该允许按照规范使用 RTCPeerConnection.addTransceiver
激活同步广播。
统一计划
WebRTC 使用 SDP 作为协商连接配置的格式。虽然之前版本的 Safari 仅使用计划 B SDP,但 Safari 现在正在过渡到标准化版本,即统一计划 SDP。统一计划 SDP 可以更灵活地表达 WebRTC 配置,因为每个音频或视频流传输都可以独立配置。
如果您的网站在每个连接上最多使用一个音频轨和一个视频轨,则此过渡应该不需要任何重大更改。如果您的网站使用的连接包含更多音频轨或视频轨,则可能需要进行调整。启用统一计划 SDP 后,对 WebRTC 1.0 API 的支持,特别是收发器 API,比以往任何时候都更完整且符合规范。要检测 Safari 是否使用统一计划,您可以使用特性检测
function usesUnifiedPlan()
{
return RTCRtpTransceiver.prototype.hasOwnProperty("currentDirection”);
}
统一计划是一项实验性功能,目前在 Safari Technology Preview 中默认开启,而在 iOS 12.2 和 macOS 10.14.4 测试版中的 Safari 中默认关闭。这可以通过 macOS 上的“开发”菜单和 iOS 上的 Safari 设置来开启。
额外的 API 更新
Safari 还带来了一些额外的改进,包括更好地支持捕获设备选择,屏幕捕获 API 的实验性支持,以及废弃 WebRTC 遗留 API。
Web 应用程序有时希望选择上次通话中使用的相同捕获设备。只要成功调用一次 navigator.mediaDevices.getUserMedia
,设备 ID 就会在浏览会话中保持稳定。您的网页可以如下实现持久设备选择
let stream;
let deviceId = window.localStorage.getItem('preferredMicrophoneId');
const constraint = deviceId ? {audio : {deviceId: {exact: deviceId}}} : {audio: true};
try {
stream = await navigator.mediaDevices.getUserMedia(constraint);
} catch (e) {
// ...
}
deviceId = stream.getAudioTracks()[0].getSettings().deviceId;
window.localStorage.setItem('preferredMicrophoneId', deviceId);
现有的指纹识别缓解措施仍然有效,包括过滤 navigator.mediaDevices.enumerateDevices
提供的信息,正如博客文章 “深入了解 WebRTC” 中详细介绍的那样。
屏幕捕获 API 的初步支持现已作为 Safari Technology Preview 中的一项实验性功能提供。通过调用 navigator.mediaDevices.getDisplayMedia
,Web 应用程序可以在 macOS 上捕获主屏幕。
遵循“深入了解 WebRTC”中详述的策略,WebRTC 遗留 API 在 Safari 12.0 中默认禁用。对 WebRTC 遗留 API 的支持已从 iOS 12.2 和 macOS 10.14.4 测试版中移除。如果您的应用程序需要支持 WebRTC 遗留 API,我们建议使用开源的 adapter.js 库作为 polyfill。
反馈
我们始终感谢您的反馈。请向我们发送错误报告,或者随时在 Twitter 上发推文给 @webkit,或发送电子邮件至 web-evangelist@apple.com。