两年前,Chrome 启用了对 VP9 编解码器的支持。从桌面版和 Android 版 Chrome 48 开始,VP9 将成为使用 WebRTC 进行视频通话的可选视频编解码器。
虽然 VP9 使用与之前的编解码器相同的基本蓝图,但 WebM 团队在 VP9 中添加了一些改进,以便从每个视频字节中获得更高的画质。例如,编码器会优先处理最清晰的图像特征,而编解码器现在使用非对称转换,有助于确保即使是最具挑战性的场景也能看起来清晰无块。
借助 VP9,目前能够在不丢包或延迟的情况下提供 720p 的互联网连接将能够在相同带宽下支持 1080p 视频通话。VP9 还可以减少网络连接不佳或流量费用较高的用户的数据流量使用量,在最佳情况下,所需的码率仅为 VP8 的 40%。
您可以通过以下屏幕截图了解 VP8 调用与 VP9 的对比情况。我们使用 WebRTC 编码器设置进行了录制,结果显示节省了 30% 的码率:
调用方和被调用方通过交换会话描述协议 (SDP) 元数据消息(用于描述客户端的媒体功能)来协商 WebRTC 通话的编解码器以及比特率等其他媒体设置。
此握手过程(交换媒体功能)称为“offer/answer”。例如,调用方可能会发送一个优惠(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 内容详尽,不适合人类阅读,但您可以在发起调用后通过 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。
了解详情
- WebM 项目:VP9 资源
- webrtc.org:WebRTC 项目的首页
- g.co/webrtc:指向其他 WebRTC 资源的链接
- webrtc.github.io/samples:WebRTC 示例上线
- test.webrtc.org:开源设备和网络测试工具以及 bug 报告框架