WebRTC 现已支持 VP9

两年前,Chrome 启用了对 VP9 编解码器的支持。从桌面设备和 Android 设备上的 Chrome 48 开始,VP9 将成为使用 WebRTC 进行视频通话的可选视频编解码器。

虽然 VP9 采用与以前的编解码器相同的基本蓝图,但 WebM 团队对 VP9 进行了一些改进,以提升视频的每一字节质量。例如,编码器会优先考虑最清晰的图像特征,而编解码器现在使用不对称转换,以帮助保持最具挑战性的场景看起来清晰且无块。

借助 VP9,目前能够提供 720p 视频(无丢包率或延迟)的互联网连接也能在相同带宽下支持 1080p 视频通话。对于网络连接质量不佳或流量套餐昂贵的用户,VP9 还可以减少流量消耗,在最佳情况下,仅需要 VP8 的 40% 的比特率。

下面的屏幕截图显示了我们使用 WebRTC 编码器设置录制的视频,显示了 VP8 调用与 VP9 的对比。该屏幕截图显示了 30% 的比特率节省:

并排显示 VP8 和 VP9 WebRTC 通话的视频屏幕截图

调用方和被调用方通过交换描述客户端媒体功能的会话描述协议 (SDP) 元数据消息,协商 WebRTC 调用的编解码器以及其他媒体设置(例如比特率)。

这种握手过程(即交换媒体功能)称为“提供/应答”。例如,调用方可能会发送一条内容(SDP 消息),指明首选 VP9,并将 VP8 作为后备选项。如果答案确认被呼叫者可以处理 VP9,就可以使用 VP9 继续视频通话。如果被调用方回复了其只能使用 VP8 的应答,则通话将继续执行 VP8。

要了解实际操作效果,请查看规范 WebRTC 视频聊天应用 appr.tc 的代码。

appcontroller.js 中,除非网址中指定了 vscvrc 参数,否则 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。

了解详情