WebRTC 現已支援 VP9

兩年前,Chrome 開始支援 VP9 編解碼器。在 Chrome 48 的電腦和 Android 版中,VP9 將成為使用 WebRTC 進行視訊通話時的選用視訊編解碼器。

雖然 VP9 與先前的轉碼器使用相同的基本藍圖,但WebM 團隊已在 VP9 中加入改善功能,以便從每個位元組的影片中獲得更高品質。舉例來說,編碼器會優先處理最清晰的圖像功能,而編碼器現在使用非對稱轉換功能,即使是難度最高的場景,也能確保畫面清晰且無塊狀。

使用 VP9 後,目前可在相同頻寬下支援 720p 視訊通話的網際網路連線,也能支援 1080p 視訊通話。對於連線品質不佳或數據方案費用較高的使用者,VP9 也能減少資料使用量,在最佳情況下,所需的位元率僅為 VP8 的 40%。

您可以在下方螢幕截圖中,查看我們使用 WebRTC 編碼器設定錄製的內容,瞭解 VP8 與 VP9 的差異,這張截圖顯示比特率節省了 30%:

顯示並排 VP8 和 VP9 WebRTC 通話的影片螢幕截圖

在呼叫端和被叫端之間,透過交換會話描述通訊協定 (SDP) 中繼資料訊息,說明用戶端的媒體功能,藉此協商 WebRTC 通話的編解碼,以及其他媒體設定 (例如位元率)。

這項握手程序 (交換媒體功能) 稱為「提供/回應」。舉例來說,呼叫端可能會傳送優先採用 VP9 的提案 (SDP 訊息),並將 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 行中列出的首個編碼器,接著是 Chrome 也能使用的 VP8。如果您將 VP8 設為偏好編解碼 (例如透過 appr.tc 中的網址參數),系統會改為優先列出 VP8。

瞭解詳情