Vor zwei Jahren hat Chrome die Unterstützung für den VP9-Codec aktiviert. Ab Chrome 48 für Computer und Android ist VP9 ein optionaler Video-Codec für Videoanrufe mit WebRTC.
VP9 verwendet zwar denselben grundlegenden Entwurf wie frühere Codecs, das WebM-Team hat aber Verbesserungen in VP9 implementiert, um aus jedem Byte Video eine höhere Qualität herauszuholen. So priorisiert der Encoder beispielsweise die schärfsten Bildmerkmale und der Codec verwendet jetzt asymmetrische Transformationen, um selbst die schwierigsten Szenen scharf und ohne Blockartefakte zu halten.
Mit VP9 können Internetverbindungen, die derzeit 720p ohne Paketverlust oder Verzögerung bereitstellen, einen 1080p-Videoanruf mit derselben Bandbreite unterstützen. VP9 kann auch die Datennutzung für Nutzer mit schlechter Verbindung oder teuren Datentarifen reduzieren. Im besten Fall ist nur 40% der Bitrate von VP8 erforderlich.
Im folgenden Screenshot mit Aufnahmen, die wir mit den WebRTC-Encoder-Einstellungen erstellt haben, sehen Sie, wie sich VP8-Anrufe im Vergleich zu VP9 schlagen. Hier wird eine Bitrate von 30% eingespart:
Der Codec für einen WebRTC-Anruf wird zusammen mit anderen Medieneinstellungen wie der Bitrate zwischen Anrufer und Angerufenem ausgehandelt. Dazu werden SDP-Metadatennachrichten (Session Description Protocol) ausgetauscht, die die Medienfunktionen des Clients beschreiben.
Dieser Handshake-Prozess – der Austausch von Medienfunktionen – wird als „Angebot/Antwort“ bezeichnet. Ein Anrufer kann beispielsweise ein Angebot (eine SDP-Nachricht) senden, in dem VP9 als bevorzugte Option und VP8 als Fallback angegeben wird. Wenn die Antwort bestätigt, dass der Angerufene VP9 verarbeiten kann, kann der Videoanruf mit VP9 fortgesetzt werden. Wenn der Angerufene antwortet, dass er nur VP8 verwenden kann, wird der Anruf mit VP8 fortgesetzt.
Sehen Sie sich den Code für die kanonische WebRTC-Videochat-Anwendung appr.tc an, um dies in Aktion zu sehen.
In appcontroller.js wird VP9 als bevorzugter Codec festgelegt, es sei denn, in der URL ist ein Parameter vsc oder vrc angegeben:
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);
}
Die hier verwendete Funktion maybePreferCodec() legt Werte für den angeforderten Codec im Text der SDP-Metadaten fest. SDP ist umfangreich und nicht für die Lesbarkeit durch Menschen konzipiert. Sie können sich das von appr.tc verwendete SDP jedoch in der DevTools-Konsole ansehen, nachdem ein Aufruf erfolgt ist. Der wichtige Teil in Bezug auf 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 du appr.tc mit den Standardeinstellungen in einer aktuellen Version von Chrome verwendest, siehst du, dass VP9 der erste Codec in der SDP-Zeile m ist, gefolgt von VP8, das auch von Chrome verwendet werden kann. Wenn du VP8 als bevorzugten Codec festlegst (z. B. über URL-Parameter in appr.tc), wird VP8 stattdessen zuerst aufgeführt.
Weitere Informationen
- The WebM Project: VP9-Ressourcen
- webrtc.org: WebRTC-Projekt
- g.co/webrtc: Links zu anderen WebRTC-Ressourcen
- webrtc.github.io/samples: WebRTC-Beispiele (live)
- test.webrtc.org: Open-Source-Tools für Geräte- und Netzwerktests sowie Framework für die Fehlermeldung