Há dois anos, o Chrome passou a oferecer suporte ao codec VP9. A partir do Chrome 48 para computador e Android, o VP9 será um codec de vídeo opcional para chamadas de vídeo usando o WebRTC.
Embora o VP9 use o mesmo modelo básico dos codecs anteriores, a equipe do WebM fez 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 o codec agora usa transformações assimétricas para ajudar a manter até as cenas mais desafiadoras nítidas e sem blocos.
Com o VP9, as conexões de Internet que atualmente podem oferecer 720p sem perda de pacotes ou atraso 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, no melhor dos casos, apenas 40% do bitrate do VP8.
Confira como as chamadas VP8 se comparam com o VP9 na captura de tela abaixo de gravações feitas com as configurações do codificador WebRTC, mostrando uma economia de 30% no bitrate:
O codec de uma chamada WebRTC, junto com outras configurações de mídia, como o bitrate, é negociado entre o autor da chamada e o destinatário por meio da 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, que troca os recursos de mídia, é conhecido como oferta/resposta. Por exemplo, um autor da chamada pode enviar uma oferta (uma mensagem SDP) indicando uma preferência pelo VP9, com o VP8 como substituto. Se a resposta confirmar que o destinatário pode processar o VP9, a videochamada poderá continuar usando o VP9. Se o chamado responder que só pode usar VP8, a chamada vai continuar com VP8.
Para conferir isso em ação, consulte o código do aplicativo de chat por vídeo canônico do WebRTC 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 do SDP. O SDP é detalhado e não foi projetado para ser legível por humanos, mas você pode conferir o SDP usado por appr.tc no console das Ferramentas do desenvolvedor depois que uma chamada é 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 o appr.tc com as configurações padrão em uma versão recente do Chrome, você vai notar que o VP9 é o primeiro codec listado na linha m do SDP, seguido pelo VP8, que o Chrome também pode usar. Se você definir o VP8 como o codec preferido (por meio de parâmetros de URL no appr.tc, por exemplo), o VP8 será listado primeiro.
Saiba mais
- O projeto WebM: recursos do VP9
- webrtc.org: site do projeto WebRTC
- g.co/webrtc: links para outros recursos do WebRTC
- webrtc.github.io/samples: exemplos do WebRTC em tempo real
- test.webrtc.org (link em inglês): ferramentas de teste de dispositivos e redes de código aberto e framework de relatórios de bugs.