VP9 が WebRTC で利用可能に

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

VP9 はそれまでのコーデックと基本原理は同じですが、動画再生の品質をバイト単位で高めるために、WebM チームがさまざまな改良を施して完成させたものです。たとえば VP9 のエンコーダーではよりくっきりした画像の特徴が優先して処理され、VP9 コーデックにおいてどのような画像でも鮮明でブロックノイズなく、連続再生できるように非対称変換が用いられています。

VP9 を使用すると、現在パケットロスや遅延なしで 720p を提供できるインターネット接続で、同じ帯域幅で 1080p のビデオ通話がサポートできるようになります。VP9 は、接続が不安定なユーザーや、データ使用量による従量課金プランを使用しているユーザーのデータ使用量を削減することもできます。最良の場合、VP8 のビットレートの 40% しか必要としません。

VP8 呼び出しと VP9 の比較は、WebRTC エンコーダ設定で行った録画のスクリーンショット(ビットレートが 30% 削減されている)で確認できます。

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

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

このハンドシェイク プロセス(メディア機能の交換)は、オファー/レスポンスと呼ばれます。たとえば、発信者は、VP9 を優先し、VP8 をフォールバックとして指定するオファー(SDP メッセージ)を送信します。相手が 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 がリストされます。優先コーデックとして VP8 を設定した場合(appr.tc の URL パラメータなどを使用して設定した場合)、代わりに VP8 が最初に表示されます。

補足説明