VP9 が WebRTC で利用可能に

2 年前、Chrome では VP9 コーデックのサポートが有効になりました。パソコン版と Android 版の Chrome 48 以降、VP9 は WebRTC を使用したビデオ通話用のオプション動画コーデックとなります。

VP9 は以前のコーデックと同じ基本的なブループリントを使用しますが、WebM チームは VP9 にさまざまな改善を組み込んで、動画の各バイトの品質を向上させました。たとえば、エンコーダは最も鮮明な画像の特徴を優先しますが、コーデックは非対称変換を使用して、最も難しいシーンでもブロックのない鮮明な画像を維持します。

VP9 では、パケットロスや遅延なしで 720p を配信できるインターネット接続が、同じ帯域幅で 1080p のビデオ通話をサポートできるようになります。VP9 は、接続が不安定なユーザーやデータプランが高額なユーザーのデータ使用量も削減でき、ベストケースでは VP8 のビットレートの 40% で済みます。

以下のスクリーンショットでは、WebRTC エンコーダの設定を使用して録画した動画を撮影し、ビットレートを 30% 削減しています。以下のスクリーンショットでは、VP8 と VP9 の通話を比較できます。

VP8 と VP9 の WebRTC 呼び出しを並べて表示している動画のスクリーンショット

WebRTC 呼び出しのコーデックは、ビットレートなどの他のメディア設定とともに、呼び出し元と呼び出し先の間でネゴシエートされます。これは、クライアントのメディア機能を記述する Session Description Protocol(SDP)メタデータ メッセージを交換することによって行われます。

メディア機能を交換するこのハンドシェイクのプロセスをオファー/アンサーと呼びます。たとえば、呼び出し元が VP9 を優先するオファー(SDP メッセージ)を送信し、VP8 をフォールバックとすることが考えられます。応答により、呼び出し先が VP9 を処理できると判断された場合は、VP9 を使用してビデオ通話を続行できます。着信の相手が VP8 しか使用できないという応答を返した場合、VP8 から通話が続行されます。

実際の動作を確認するには、正規の WebRTC ビデオチャット アプリケーション appr.tc のコードをご覧ください。

appcontroller.js では、URL で 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 は冗長で、人間が読めるようには設計されていませんが、appr.tc で使用される SDP は呼び出し後に DevTools コンソールから表示できます。コーデックに関して重要なのは、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 行で VP9 が最初にリストされ、次に Chrome でも使用できる VP8 が続くことがわかります。たとえば、appr.tc の URL パラメータを使用して VP8 を優先コーデックとして設定すると、代わりに VP8 が最初に表示されます。

補足説明