Atualizações de mídia no Chrome 69

François Beaufort
François Beaufort

Decodificador de vídeo AV1

Rastreador do Chromestatus | Bug do Chromium

EME: consulta ao suporte a esquemas de criptografia

Algumas plataformas ou sistemas importantes só oferecem suporte ao modo CENC, e outros são compatíveis apenas com o modo CBCS. E alguns oferecem suporte a ambos. Esses dois esquemas de criptografia são incompatíveis, então os desenvolvedores da Web precisam ser capazes de fazer escolhas inteligentes sobre qual conteúdo exibir.

Para evitar a necessidade de determinar em qual plataforma o suporte a esquemas de criptografia "conhecidos" está disponível, uma nova chave encryptionScheme é adicionada no dicionário MediaKeySystemMediaCapability para permitir que os sites especifiquem qual esquema de criptografia pode ser usado nas Extensões de mídia criptografada (EME, na sigla em inglês).

A nova chave encryptionScheme pode ter um destes dois valores:

  • 'cenc' Modo AES-CTR de amostra completa e criptografia de subamostra de NAL de vídeo.
  • 'cbcs' Criptografia de padrão NAL de vídeo parcial no modo AES-CBC.

Se não for especificado, indica que qualquer esquema de criptografia é aceitável. Observe que a chave clara sempre oferece suporte ao esquema 'cenc'.

O exemplo abaixo mostra como consultar duas configurações com esquemas de criptografia diferentes. Nesse caso, apenas uma será escolhida.

await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [
    {
      label: 'configuration using the "cenc" encryption scheme',
      videoCapabilities: [{
        contentType: 'video/mp4; codecs="avc1.640028"',
        encryptionScheme: 'cenc'
      }],
      audioCapabilities: [{
        contentType: 'audio/mp4; codecs="mp4a.40.2"',
        encryptionScheme: 'cenc'
      }],
      initDataTypes: ['keyids']
    },
    {
      label: 'configuration using the "cbcs" encryption scheme',
      videoCapabilities: [{
        contentType: 'video/mp4; codecs="avc1.640028"',
        encryptionScheme: 'cbcs'
      }],
      audioCapabilities: [{
        contentType: 'audio/mp4; codecs="mp4a.40.2"',
        encryptionScheme: 'cbcs'
      }],
      initDataTypes: ['keyids']
    },
  ]);

No exemplo abaixo, apenas uma configuração com dois esquemas de criptografia diferentes é consultada. Nesse caso, o Chrome descarta qualquer objeto de capabilities que não tenha suporte. Portanto, a configuração acumulada pode conter um esquema de criptografia ou ambos.

await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
    videoCapabilities: [
      { // A video capability using the "cenc" encryption scheme
        contentType: 'video/mp4; codecs="avc1.640028"',
        encryptionScheme: 'cenc'
      },
      { // A video capability using the "cbcs" encryption scheme
        contentType: 'video/mp4; codecs="avc1.640028"',
        encryptionScheme: 'cbcs'
      },
    ],
    audioCapabilities: [
      { // An audio capability using the "cenc" encryption scheme
        contentType: 'audio/mp4; codecs="mp4a.40.2"',
        encryptionScheme: 'cenc'
      },
      { // An audio capability using the "cbcs" encryption scheme
        contentType: 'audio/mp4; codecs="mp4a.40.2"',
        encryptionScheme: 'cbcs'
      },
    ],
    initDataTypes: ['keyids']
  }]);

Intent to Implement | Rastreador do Chromestatus | Bug do Chromium

EME: verificação da política HDCP

Atualmente, o HDCP é um requisito comum de política para streaming de alta resolução de conteúdo protegido. E os desenvolvedores da Web que querem aplicar uma política do HDCP precisam aguardar a conclusão da troca de licença ou iniciar o streaming de conteúdo em baixa resolução. Essa é uma situação triste que a API de verificação de política HDCP pretende resolver.

Essa API proposta permite que os desenvolvedores da Web consultem se uma determinada política do HDCP pode ser aplicada para que a reprodução possa ser iniciada na resolução ideal para a melhor experiência do usuário. Ele consiste em um método simples para consultar o status de uma chave hipotética associada a uma política do HDCP, sem a necessidade de criar um MediaKeySession ou buscar uma licença real. Ele também não exige que MediaKeys seja anexado a nenhum elemento de áudio ou vídeo.

A API de verificação de política do HDCP funciona simplesmente chamando mediaKeys.getStatusForPolicy() com um objeto que tenha uma chave minHdcpVersion e um valor válido. Se o HDCP estiver disponível na versão especificada, a promessa retornada será resolvida com um MediaKeyStatus de 'usable'. Caso contrário, a promessa é resolvida com outros valores de erro de MediaKeyStatus, como 'output-restricted' ou 'output-downscaled'. Se o sistema de chave não oferecer suporte à verificação de política HDCP (por exemplo, o sistema Clear Key), a promessa será rejeitada.

Em resumo, a API funciona assim por enquanto. Confira o exemplo oficial para testar todas as versões do HDCP.

const config = [{
  videoCapabilities: [{
    contentType: 'video/webm; codecs="vp09.00.10.08"',
    robustness: 'SW_SECURE_DECODE' // Widevine L3
  }]
}];

navigator.requestMediaKeySystemAccess('com.widevine.alpha', config)
.then(mediaKeySystemAccess => mediaKeySystemAccess.createMediaKeys())
.then(mediaKeys => {

  // Get status for HDCP 2.2
  return mediaKeys.getStatusForPolicy({ minHdcpVersion: '2.2' })
  .then(status => {
    if (status !== 'usable')
      return Promise.reject(status);

    console.log('HDCP 2.2 can be enforced.');
    // TODO: Fetch high resolution protected content...
  });
})
.catch(error => {
  // TODO: Fallback to fetch license or stream low-resolution content...
});

Disponível para testes de origem

Para receber feedback dos desenvolvedores da Web, adicionamos o recurso da API HDCP Policy Check no Chrome 69 para computadores (ChromeOS, Linux, Mac e Windows).

O teste foi encerrado em novembro de 2018.

Intent to Experiment | Chromestatus Tracker | Chromium Bug

Conformidade com o PTS/DTS do MSE

Os intervalos em buffer e os valores de duração agora são informados por intervalos de carimbo de tempo de apresentação (PTS, na sigla em inglês), em vez de por intervalos de carimbo de tempo de decodificação (DTS, na sigla em inglês) nas Extensões de origem de mídia (MSE, na sigla em inglês).

Quando o MSE era novo, a implementação do Chrome foi testada com WebM e MP3, alguns formatos de streaming de mídia em que não havia distinção entre PTS e DTS. E estava funcionando bem até que o ISO BMFF (também conhecido como MP4) foi adicionado. Esse contêiner frequentemente contém apresentação fora de ordem em relação a fluxos de tempo de decodificação (para codecs como H.264, por exemplo), fazendo com que o DTS e o PTS sejam diferentes. Isso fez com que o Chrome informasse (geralmente apenas um pouco) diferentes intervalos de buffer e valores de duração do que o esperado. Esse novo comportamento será lançado gradualmente no Chrome 69 e vai tornar a implementação de MSE compatível com a especificação de MSE.

PTS/DTS
PTS/DTS

Essa mudança afeta MediaSource.duration (e, consequentemente, HTMLMediaElement.duration), SourceBuffer.buffered (e, consequentemente, HTMLMediaElement.buffered) e SourceBuffer.remove(start, end).

Se você não souber qual método é usado para informar intervalos e valores de duração em buffer, acesse a página chrome://media-internals interna e procure por "ChunkDemuxer: buffering by PTS" ou "ChunkDemuxer: buffering by DTS" nos registros.

Intent to Implement | Bug do Chromium

Processamento de intents de visualização de mídia no Android Go

O Android Go é uma versão leve do Android projetada para smartphones básicos. Para isso, ele não é necessariamente enviado com alguns aplicativos de visualização de mídia. Portanto, se um usuário tentar abrir um vídeo salvo, por exemplo, ele não terá nenhum aplicativo para processar essa intent.

Para corrigir isso, o Chrome 69 no Android Go agora detecta intents de visualização de mídia para que os usuários possam acessar áudios, vídeos e imagens transferidos por download. Em outras palavras, ele substitui os aplicativos de visualização ausentes.

ALT_TEXT_HERE
Media intent handler

Esse recurso do Chrome é ativado em todos os dispositivos Android com o Android O e versões mais recentes e 1 GB de RAM ou menos.

Bug do Chromium

Remoção de eventos "stalled" para elementos de mídia que usam MSE

Um evento "travado" é gerado em um elemento de mídia se o download de dados de mídia não progredi por cerca de 3 segundos. Ao usar as extensões de origem de mídia (MSE, na sigla em inglês), o app da Web gerencia o download, e o elemento de mídia não está ciente do progresso. Isso fez com que o Chrome gerasse eventos "parados" em momentos inadequados sempre que o site não anexava novos blocos de dados de mídia com SourceBuffer.appendBuffer() nos últimos 3 segundos.

Como os sites podem decidir anexar grandes quantidades de dados com baixa frequência, esse não é um indicador útil sobre a integridade do buffer. A remoção de eventos "parados" para elementos de mídia que usam o MSE elimina a confusão e alinha o Chrome à especificação do MSE. Os elementos de mídia que não usam MSE vão continuar gerando eventos "parados", como fazem hoje.

Intenção de descontinuar e remover | Rastreador do Chromestatus | Bug do Chromium