VP9 ahora está disponible en WebRTC

Hace dos años, Chrome habilitó la compatibilidad con el códec VP9. A partir de Chrome 48 para computadoras de escritorio y Android, VP9 será un códec de video opcional para las videollamadas que usen WebRTC.

Si bien VP9 usa el mismo modelo básico que los códecs anteriores, el equipo de WebM implementó mejoras en VP9 para obtener más calidad de cada byte de video. Por ejemplo, el codificador prioriza los atributos de imagen más nítidos y el códec ahora usa transformaciones asimétricas para ayudar a que incluso las escenas más desafiantes se vean nítidas y sin bloqueos.

Con VP9, las conexiones a Internet que actualmente pueden entregar 720p sin pérdida de paquetes ni demoras podrán admitir una videollamada de 1080p con el mismo ancho de banda. VP9 también puede reducir el uso de datos para los usuarios con conexiones deficientes o planes de datos costosos, lo que requiere, en el mejor de los casos, solo el 40% de la tasa de bits de VP8.

Puedes ver cómo se comparan las llamadas de VP8 con las de VP9 en la siguiente captura de pantalla de las grabaciones que hicimos con la configuración del codificador de WebRTC, que muestra un ahorro del 30% en la tasa de bits:

Captura de pantalla del video que muestra llamadas de WebRTC VP8 y VP9 en paralelo

El códec de una llamada de WebRTC, junto con otros parámetros de configuración multimedia, como la tasa de bits, se negocia entre el llamador y el llamado mediante el intercambio de mensajes de metadatos del Protocolo de descripción de sesión (SDP) que describen las capacidades multimedia del cliente.

Este proceso de enlace (intercambio de capacidades multimedia) se conoce como oferta/respuesta. Por ejemplo, un llamador puede enviar una oferta (un mensaje SDP) que indique una preferencia por VP9, con VP8 como resguardo. Si la respuesta confirma que el destinatario puede controlar VP9, la videollamada puede continuar con VP9. Si el llamado responde que solo puede usar VP8, la llamada continuará con VP8.

Para ver esto en acción, observa el código de la aplicación canónica de chat de video WebRTC appr.tc.

En appcontroller.js, VP9 se establece como el códec preferido, a menos que se especifique un parámetro vsc o vrc en la URL:

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

En sdputils.js, el valor del códec personalizado (si se especifica) se usa para los metadatos de SDP:

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

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

La función maybePreferCodec() que se usa aquí establece valores para el códec solicitado en el texto de los metadatos SDP. El SDP es detallado y no está diseñado para que lo lean las personas, pero puedes ver el SDP que usa appr.tc desde la consola de DevTools una vez que se haya realizado una llamada. La parte importante con respecto a los códecs es la línea m:

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

Si usas appr.tc con su configuración predeterminada en una versión reciente de Chrome, verás que VP9 es el primer códec que aparece en la línea m de la SDP, seguido de VP8, que Chrome también puede usar. Si configuras VP8 como el códec preferido (a través de parámetros de URL en appr.tc, por ejemplo), VP8 aparecerá primero.

Más información