两年前,Chrome 启用了对 VP9 编解码器的支持。从桌面设备和 Android 设备上的 Chrome 48 开始,VP9 将成为使用 WebRTC 进行视频通话的可选视频编解码器。
虽然 VP9 采用与以前的编解码器相同的基本蓝图,但 WebM 团队对 VP9 进行了一些改进,以提升视频的每一字节质量。例如,编码器会优先考虑最清晰的图像特征,而编解码器现在使用不对称转换,以帮助保持最具挑战性的场景看起来清晰且无块。
借助 VP9,目前能够提供 720p 视频(无丢包率或延迟)的互联网连接也能在相同带宽下支持 1080p 视频通话。对于网络连接质量不佳或流量套餐昂贵的用户,VP9 还可以减少流量消耗,在最佳情况下,仅需要 VP8 的 40% 的比特率。
下面的屏幕截图显示了我们使用 WebRTC 编码器设置录制的视频,显示了 VP8 调用与 VP9 的对比。该屏幕截图显示了 30% 的比特率节省:
调用方和被调用方通过交换描述客户端媒体功能的会话描述协议 (SDP) 元数据消息,协商 WebRTC 调用的编解码器以及其他媒体设置(例如比特率)。
这种握手过程(即交换媒体功能)称为“提供/应答”。例如,调用方可能会发送一条内容(SDP 消息),指明首选 VP9,并将 VP8 作为后备选项。如果答案确认被呼叫者可以处理 VP9,就可以使用 VP9 继续视频通话。如果被调用方回复了其只能使用 VP8 的应答,则通话将继续执行 VP8。
要了解实际操作效果,请查看规范 WebRTC 视频聊天应用 appr.tc 的代码。
在 appcontroller.js 中,除非网址中指定了 vsc 或 vrc 参数,否则 VP9 会被设置为首选编解码器:
AppController.prototype.loadUrlParams_ = function() {
// ...
var DEFAULT_VIDEO_CODEC = 'VP9';
// …
this.loadingParams_.videoSendCodec = urlParams['vsc'];
// ...
this.loadingParams_.videoRecvCodec = urlParams['vrc'] || DEFAULT_VIDEO_CODEC;
}
在 sdputils.js 中,然后将自定义编解码器值(如果已指定)用于 SDP 元数据:
function maybePreferVideoSendCodec(sdp, params) {
return maybePreferCodec(sdp, 'video', 'send', params.videoSendCodec);
}
function maybePreferVideoReceiveCodec(sdp, params) {
return maybePreferCodec(sdp, 'video', 'receive', params.videoRecvCodec);
}
此处使用的 maybePreferCodec() 函数用于在 SDP 元数据文本中为请求的编解码器设置值。SDP 比较冗长,不适合用户阅读,但您可以在进行调用后通过开发者工具控制台查看 appr.tc 使用的 SDP。关于编解码器的重要部分是 m 行:
{
"sdp": "v=0\r\no=- 9188830394109743399 2 IN IP4 127.0.0.1\r\ns … m=video ...",
"type": "offer"
}
在较新版本的 Chrome 中使用 appr.tc 及其默认设置时,您会看到 SDP m 行中列出的第一个编解码器,其次是 VP8(Chrome 也可以使用)。如果您将 VP8 设置为首选编解码器(例如,通过 appr.tc 中的网址参数),那么系统会先列出 VP8。
了解详情
- WebM 项目:VP9 资源
- webrtc.org:WebRTC 项目的主
- g.co/webrtc:指向其他 WebRTC 资源的链接
- webrtc.github.io/samples:WebRTC 示例已发布
- test.webrtc.org:开源设备和网络测试工具以及 bug 报告框架