VP9 ist jetzt in WebRTC verfügbar

Vor zwei Jahren wurde in Chrome der Codec VP9 unterstützt. Ab Chrome 48 auf Computern und Android-Geräten wird VP9 ein optionaler Video-Codec für Videoanrufe mit WebRTC sein.

VP9 verwendet zwar den gleichen grundlegenden Entwurf wie frühere Codecs, aber das WebM-Team hat Verbesserungen an VP9 vorgenommen, um jedes Byte Video noch besser nutzen zu können. Zum Beispiel priorisiert der Encoder die schärfsten Bildmerkmale und der Codec verwendet jetzt asymmetrische Transformationen, damit selbst die schwierigsten Szenen klar und blocklos aussehen.

Mit VP9 können Internetverbindungen, die derzeit 720p ohne Paketverlust oder Verzögerung liefern, einen 1080p-Videoanruf bei derselben Bandbreite unterstützen. VP9 kann auch die Datennutzung für Nutzer mit schlechter Verbindung oder teuren Datentarifen reduzieren, wobei im Idealfall nur 40% der Bitrate von VP8 erforderlich sind.

Im Screenshot unten sehen Sie, wie VP8-Anrufe mit VP9-Anrufen verglichen werden. Die Aufzeichnungen, die wir mit den WebRTC-Encoder-Einstellungen erstellt haben, zeigen eine Einsparung der Bitrate von 30 %:

Screenshot eines Videos, in dem die WebRTC-Anrufe VP8 und VP9 nebeneinander dargestellt werden

Der Codec für einen WebRTC-Aufruf wird zusammen mit anderen Medieneinstellungen wie der Bitrate zwischen dem Anrufer und dem Aufgerufenen ausgehandelt. Dazu werden SDP-Metadatennachrichten (Session Description Protocol) ausgetauscht, die die Medienfunktionen des Clients beschreiben.

Dieser Handshakeprozess – der Austausch von Medienfunktionen – wird als Angebot/Antwort bezeichnet. Beispielsweise könnte ein Anrufer ein Angebot (eine SDP-Nachricht) senden, in dem er seine Präferenz für VP9 mit VP8 als Fallback teilt. Wenn die Antwort bestätigt, dass der Aufgerufene VP9 verarbeiten kann, kann der Videoanruf mit VP9 fortgesetzt werden. Wenn der Aufgerufene mit einer Antwort antwortet, dass nur VP8 verwendet werden kann, wird der Anruf mit VP8 fortgesetzt.

Im Code für die kanonische WebRTC-Videochatanwendung appr.tc können Sie dies in Aktion sehen.

In appcontroller.js wird VP9 als bevorzugter Codec festgelegt, sofern in der URL kein vsc- oder vrc-Parameter angegeben ist:

AppController.prototype.loadUrlParams_ = function() {
    // ...
    var DEFAULT_VIDEO_CODEC = 'VP9';
    // …
    this.loadingParams_.videoSendCodec = urlParams['vsc'];
    // ...
    this.loadingParams_.videoRecvCodec = urlParams['vrc'] || DEFAULT_VIDEO_CODEC;
}

In sdputils.js wird der benutzerdefinierte Codec-Wert (falls angegeben) dann für die SDP-Metadaten verwendet:

function maybePreferVideoSendCodec(sdp, params) {
    return maybePreferCodec(sdp, 'video', 'send', params.videoSendCodec);
}

function maybePreferVideoReceiveCodec(sdp, params) {
    return maybePreferCodec(sdp, 'video', 'receive', params.videoRecvCodec);
}

Mit der hier verwendeten Funktion maybePreferCodec() werden Werte für den angeforderten Codec im Text der SDP-Metadaten festgelegt. SDP ist ausführlich und nicht für Menschen lesbar. Sie können das von appr.tc verwendete SDP aber über die Entwicklertools-Konsole aufrufen, sobald ein Aufruf erfolgt ist. Der wichtige Teil bei Codecs ist die m-Zeile:

{
    "sdp": "v=0\r\no=- 9188830394109743399 2 IN IP4 127.0.0.1\r\ns … m=video ...",
    "type": "offer"
}

Wenn Sie in einer aktuellen Chrome-Version appr.tc mit den Standardeinstellungen verwenden, werden Sie feststellen, dass VP9 der erste Codec in der m-Zeile von SDP ist – gefolgt von VP8, das ebenfalls von Chrome verwendet werden kann. Wenn Sie VP8 als bevorzugten Codec festlegen, z. B. über die URL-Parameter in appr.tc, wird stattdessen VP8 an erster Stelle aufgeführt.

Weitere Informationen