O VP9 agora está disponível no WebRTC

Há dois anos, o Google Chrome ativou a compatibilidade com o codec VP9. No Chrome 48 no computador e no Android, o VP9 será um codec de vídeo opcional para videochamadas que usam WebRTC.

Embora o VP9 use o mesmo modelo básico que os codecs anteriores, a equipe do WebM incluiu melhorias no VP9 para melhorar a qualidade de cada byte de vídeo. Por exemplo, o codificador prioriza os recursos de imagem mais nítidos e agora usa transformações assimétricas para manter até mesmo as cenas mais desafiadoras nítidas e sem bloqueios.

Com o VP9, as conexões de Internet que atualmente veiculam 720p sem perda ou atraso de pacotes poderão oferecer suporte a uma videochamada de 1080p na mesma largura de banda. O VP9 também pode reduzir o uso de dados para usuários com conexões ruins ou planos de dados caros, exigindo, nos melhores casos, apenas 40% da taxa de bits do VP8.

Você pode comparar as chamadas VP8 com VP9 na captura de tela abaixo das gravações que fizemos com as configurações do codificador WebRTC, mostrando uma economia de 30% da taxa de bits:

Captura de tela de um vídeo mostrando as chamadas WebRTC VP8 e VP9 lado a lado

O codec de uma chamada WebRTC, junto com outras configurações de mídia, como taxa de bits, é negociado entre o autor da chamada e o recebedor da chamada com a troca de mensagens de metadados do protocolo de descrição de sessão (SDP) que descrevem os recursos de mídia do cliente.

Esse processo de handshake, ou seja, troca de recursos de mídia, é conhecido como oferta/resposta. Por exemplo, o autor da chamada pode enviar uma oferta (uma mensagem SDP) informando uma preferência pelo VP9, com VP8 como substituto. Se a resposta confirmar que o recebedor da chamada pode lidar com o VP9, a videochamada poderá continuar usando o VP9. Se o recebedor da chamada responder informando que só pode usar o VP8, a chamada prosseguirá com o VP8.

Veja como isso funciona no código do aplicativo de chat por vídeo WebRTC canônico appr.tc.

Em appcontroller.js, o VP9 é definido como o codec preferido, a menos que um parâmetro vsc ou vrc seja especificado no URL:

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

Em sdputils.js, o valor do codec personalizado (se especificado) é usado para os metadados do SDP:

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

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

A função maybePreferCodec() usada aqui define valores para o codec solicitado no texto dos metadados SDP. O SDP é detalhado e não foi projetado para ser legível, mas você pode ver o SDP usado por appr.tc no console do DevTools assim que uma chamada for feita. A parte importante em relação aos codecs é a linha m:

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

Ao usar appr.tc com as configurações padrão em uma versão recente do Chrome, você verá que o VP9 é o primeiro codec listado na linha m do SDP, seguido pelo VP8, que também pode ser usado pelo Chrome. Se você definir VP8 como o codec preferido (por meio de parâmetros de URL em appr.tc, por exemplo), o VP8 será listado primeiro.

Saiba mais