WebRTC 现已支持 VP9

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

虽然 VP9 使用与之前的编解码器相同的基本蓝图,但 WebM 团队在 VP9 中添加了一些改进,以便从每个视频字节中获得更高的画质。例如,编码器会优先处理最清晰的图像特征,而编解码器现在使用非对称转换,有助于确保即使是最具挑战性的场景也能看起来清晰无块。

借助 VP9,目前能够在不丢包或延迟的情况下提供 720p 的互联网连接将能够在相同带宽下支持 1080p 视频通话。VP9 还可以减少网络连接不佳或流量费用较高的用户的数据流量使用量,在最佳情况下,所需的码率仅为 VP8 的 40%。

您可以通过以下屏幕截图了解 VP8 调用与 VP9 的对比情况。我们使用 WebRTC 编码器设置进行了录制,结果显示节省了 30% 的码率:

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

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

此握手过程(交换媒体功能)称为“offer/answer”。例如,调用方可能会发送一个优惠(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 内容详尽,不适合人类阅读,但您可以在发起调用后通过 DevTools 控制台查看 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 及其默认设置时,您会发现 VP9 是 SDP m 行中列出的第一个编解码器,其次是 VP8(Chrome 也支持 VP8)。如果您将 VP8 设置为首选编解码器(例如,通过 appr.tc 中的网址参数),系统会改为优先列出 VP8。

了解详情