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 呼叫

WebRTC 呼叫的轉碼器及其他媒體設定 (例如位元率) 會在呼叫端和受呼叫端之間透過交換會描述用戶端媒體功能的工作階段說明通訊協定 (SDP) 中繼資料訊息交涉。

這種手持程序 (交換媒體功能) 稱為「提議/答案」。舉例來說,來電者可能會傳送一則說明 VP9 的優惠 (SDR 訊息),並將 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 line

{
    "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 設為偏好的轉碼器 (例如透過 appr.tc 中的網址參數),系統會改為優先列出 VP8。

瞭解詳情