Compartilhar via


Extensão de Mídia Criptografada do PlayReady

Esta seção descreve como modificar seu aplicativo Web PlayReady para dar suporte às alterações feitas da versão anterior do Windows 8.1 para a versão do Windows 10.

O uso de elementos de mídia do PlayReady no Internet Explorer permite que os desenvolvedores criem aplicativos Web capazes de fornecer conteúdo do PlayReady ao usuário enquanto impõem as regras de acesso definidas pelo provedor de conteúdo. Esta seção descreve como adicionar elementos de mídia do PlayReady aos seus aplicativos Web existentes usando apenas HTML5 e JavaScript.

Novidades na Extensão de Mídia Criptografada do PlayReady

Esta seção fornece uma lista de alterações feitas na EME (Extensão de Mídia Criptografada) do PlayReady para habilitar a proteção de conteúdo do PlayReady no Windows 10.

A lista a seguir descreve os novos recursos e as alterações feitas na Extensão de Mídia Criptografada do PlayReady para Windows 10:

  • Adicionado gerenciamento de direitos digitais (DRM) de hardware.

    O suporte à proteção de conteúdo baseado em hardware permite a reprodução segura de conteúdo de alta definição (HD) e ultra-alta definição (UHD) em várias plataformas de dispositivos. O material de chave (incluindo chaves privadas, chaves de conteúdo e qualquer outro material de chave usado para derivar ou desbloquear essas chaves) e amostras de vídeo compactadas e descompactadas descriptografadas são protegidas aproveitando a segurança do hardware.

  • Fornece aquisição proativa de licenças não persistentes.

  • Fornece aquisição de várias licenças em uma mensagem.

    Você pode usar um objeto PlayReady com vários identificadores de chave (KeyIDs) como no Windows 8.1 ou usar dados de modelo de descriptografia de conteúdo (CDMData) com várias KeyIDs.

    Observação

    No Windows 10, há suporte para vários identificadores de chave em <KeyID> em CDMData.

  • Adicionado suporte à expiração em tempo real ou licença de duração limitada (LDL).

    Fornece a capacidade de definir a expiração em tempo real das licenças.

  • Adicionado suporte à política HDCP Tipo 1 (versão 2.2).

  • Miracast agora está implícito como uma saída.

  • Adicionada parada segura.

    A parada segura fornece os meios para um dispositivo PlayReady declarar com confiança a um serviço de streaming de mídia que a reprodução de mídia foi interrompida para qualquer parte do conteúdo.

  • Adicionada separação de licenças de áudio e vídeo.

    Faixas separadas evitam que o vídeo seja decodificado como áudio; permitindo uma proteção de conteúdo mais robusta. Os padrões emergentes estão exigindo chaves separadas para faixas de áudio e visual.

  • Adicionado MaxResDecode.

    Esse recurso foi adicionado para limitar a reprodução de conteúdo a uma resolução máxima, mesmo quando estiver de posse de uma chave mais capaz (mas não de uma licença). Ele dá suporte a casos em que vários tamanhos de fluxo são codificados com uma única chave.

Suporte à Extensão de Mídia Criptografada no PlayReady

Esta seção descreve a versão da Extensão de Mídia Criptografada do W3C compatível com o PlayReady.

O PlayReady para Aplicativos Web está atualmente associado ao rascunho da EME (Extensão de Mídia Criptografada) do W3C de 10 de maio de 2013. Esse suporte será alterado para a especificação EME atualizada em versões futuras do Windows.

Usar DRM de hardware

Esta seção descreve como seu aplicativo Web pode usar o DRM de hardware do PlayReady e como desabilitar o DRM de hardware se o conteúdo protegido não der suporte a ele.

Para usar o DRM de hardware do PlayReady, seu aplicativo Web JavaScript deve usar o método EME isTypeSupported com um identificador de sistema de chave para consultar o suporte ao DRM de hardware do com.microsoft.playready.hardware PlayReady no navegador.

Ocasionalmente, alguns conteúdos não são suportados no DRM de hardware. O conteúdo do coquetel nunca é suportado no DRM de hardware; se você quiser reproduzir conteúdo de coquetel, deverá desativar o DRM de hardware. Alguns DRM de hardware suportarão HEVC e outros não; se você quiser reproduzir conteúdo HEVC e o DRM de hardware não for compatível, você também desejará desativá-lo.

Observação

Para determinar se há suporte para conteúdo HEVC, após instanciar com.microsoft.playready, use o método PlayReadyStatics.CheckSupportedHardware .

Adicionar parada segura ao seu aplicativo Web

Esta seção descreve como adicionar uma parada segura ao seu aplicativo Web.

A parada segura fornece os meios para um dispositivo PlayReady declarar com confiança a um serviço de streaming de mídia que a reprodução de mídia foi interrompida para qualquer parte do conteúdo. Esse recurso garante que seus serviços de streaming de mídia forneçam imposição e relatórios precisos de limitações de uso em diferentes dispositivos para uma determinada conta.

Há dois cenários principais para enviar um desafio de parada segura:

  • Quando a apresentação de mídia é interrompida porque o fim do conteúdo foi atingido ou quando o usuário interrompe a apresentação de mídia em algum lugar no meio.
  • Quando a sessão anterior termina inesperadamente (por exemplo, devido a uma falha no sistema ou aplicativo). O aplicativo precisará consultar, na inicialização ou no desligamento, se há sessões de parada segura pendentes e enviar desafios separados de qualquer outra reprodução de mídia.

Os procedimentos a seguir descrevem como configurar a parada segura para vários cenários.

Para configurar uma parada segura para um final normal de uma apresentação:

  1. Registre o evento onEnded antes do início da reprodução.
  2. O manipulador de eventos onEnded precisa chamar removeAttribute("src") do objeto de elemento de vídeo/áudio para definir a origem como NULL , o que acionará a base de mídia para derrubar a topologia, destruir o(s) decodificador(es) e definir o estado de parada.
  3. Você pode iniciar a sessão de CDM de parada segura dentro do manipulador para enviar o desafio de parada segura ao servidor para notificar que a reprodução foi interrompida neste momento, mas isso também pode ser feito mais tarde.

Para configurar a parada segura se o usuário sair da página ou fechar a guia ou o navegador:

  • Nenhuma ação do aplicativo é necessária para registrar o estado de parada; será registrado para você.

Para configurar a parada segura para controles de página personalizados ou ações do usuário (como botões de navegação personalizados ou iniciar uma nova apresentação antes da conclusão da apresentação atual):

  • Quando ocorre uma ação personalizada do usuário, o aplicativo precisa definir a origem como NULL , o que acionará a base de mídia para derrubar a topologia, destruir os decodificadores e definir o estado de parada.

O exemplo a seguir demonstra como usar a parada segura em seu aplicativo Web:

// JavaScript source code

var g_prkey = null;
var g_keySession = null;
var g_fUseSpecificSecureStopSessionID = false;
var g_encodedMeteringCert = 'Base64 encoded of your metering cert (aka publisher cert)';

// Note: g_encodedLASessionId is the CDM session ID of the proactive or reactive license acquisition 
//       that we want to initiate the secure stop process.
var g_encodedLASessionId = null;

function main()
{
    ...

    g_prkey = new MSMediaKeys("com.microsoft.playready");

    ...

    // add 'onended' event handler to the video element
    // Assume 'myvideo' is the ID of the video element
    var videoElement = document.getElementById("myvideo");
    videoElement.onended = function (e) { 

        //
        // Calling removeAttribute("src") will set the source to null
        // which will trigger the MF to tear down the topology, destroy the
        // decryptor(s) and set the stop state.  This is required in order
        // to set the stop state.
        //
        videoElement.removeAttribute("src");
        videoElement.load();

        onEndOfStream();
    };
}

function onEndOfStream()
{
    ...

    createSecureStopCDMSession();

    ...    
}

function createSecureStopCDMSession()
{
    try{    
        var targetMediaCodec = "video/mp4";
        var customData = "my custom data";

        var encodedSessionId = g_encodedLASessionId;
        if( !g_fUseSpecificSecureStopSessionID )
        {
            // Use "*" (wildcard) as the session ID to include all secure stop sessions
            // TODO: base64 encode "*" and place encoded result to encodedSessionId
        }

        var int8ArrayCDMdata = formatSecureStopCDMData( encodedSessionId, customData,  g_encodedMeteringCert );
        var emptyArrayofInitData = new Uint8Array();

        g_keySession = g_prkey.createSession(targetMediaCodec, emptyArrayofInitData, int8ArrayCDMdata);

        addPlayreadyKeyEventHandler();

    } catch( e )
    {
        // TODO: Handle exception
    }
}

function addPlayreadyKeyEventHandler()
{
    // add 'keymessage' eventhandler   
    g_keySession.addEventListener('mskeymessage', function (event) {

        // TODO: Get the keyMessage from event.message.buffer which contains the secure stop challenge
        //       The keyMessage format for the secure stop is similar to LA as below:
        //
        //            <PlayReadyKeyMessage type="SecureStop" >
        //              <SecureStop version="1.0" >
        //                <Challenge encoding="base64encoded">
        //                    secure stop challenge
        //                </Challenge>
        //                <HttpHeaders>
        //                    <HttpHeader>
        //                      <name>Content-Type</name>
        //                         <value>"content type data"</value>
        //                    </HttpHeader>
        //                    <HttpHeader>
        //                         <name>SOAPAction</name>
        //                         <value>soap action</value>
        //                     </HttpHeader>
        //                    ....
        //                </HttpHeaders>
        //              </SecureStop>
        //            </PlayReadyKeyMessage>
                
        // TODO: send the secure stop challenge to a server that handles the secure stop challenge

        // TODO: Receive and response and call event.target.Update() to process the response
    });
    
    // add 'keyerror' eventhandler
    g_keySession.addEventListener('mskeyerror', function (event) {
        var session = event.target;
        
        ...

        session.close();
    });
    
    // add 'keyadded' eventhandler
    g_keySession.addEventListener('mskeyadded', function (event) {
        
        var session = event.target;

        ...

        session.close();             
    });
}

/**
* desc@ formatSecureStopCDMData
*   generate playready CDMData
*   CDMData is in xml format:
*   <PlayReadyCDMData type="SecureStop">
*     <SecureStop version="1.0">
*       <SessionID>B64 encoded session ID</SessionID>
*       <CustomData>B64 encoded custom data</CustomData>
*       <ServerCert>B64 encoded server cert</ServerCert>
*     </SecureCert>
* </PlayReadyCDMData>        
*/
function formatSecureStopCDMData(encodedSessionId, customData, encodedPublisherCert) 
{
    var encodedCustomData = null;

    // TODO: base64 encode the custom data and place the encoded result to encodedCustomData

    var CDMDataStr = "<PlayReadyCDMData type=\"SecureStop\">" +
                     "<SecureStop version=\"1.0\" >" +
                     "<SessionID>" + encodedSessionId + "</SessionID>" +
                     "<CustomData>" + encodedCustomData + "</CustomData>" +
                     "<ServerCert>" + encodedPublisherCert + "</ServerCert>" +
                     "</SecureStop></PlayReadyCDMData>";
    
    var int8ArrayCDMdata = null

    // TODO: Convert CDMDataStr to Uint8 byte array and palce the converted result to int8ArrayCDMdata

    return int8ArrayCDMdata;
}

Observação

Os dados de <SessionID>B64 encoded session ID</SessionID> parada segura no exemplo acima podem ser um asterisco (*), que é um curinga para todas as sessões de parada segura registradas. Ou seja, a tag SessionID pode ser uma sessão específica ou um curinga (*) para selecionar todas as sessões de parada segura.

Considerações de programação para extensão de mídia criptografada

Esta seção lista as considerações de programação que você deve levar em conta ao criar seu aplicativo Web habilitado para PlayReady para Windows 10.

Os objetos MSMediaKeys e MSMediaKeySession criados pelo aplicativo devem ser mantidos ativos até que o aplicativo seja fechado. Uma maneira de garantir que esses objetos permaneçam ativos é atribuí-los como variáveis globais (as variáveis ficariam fora do escopo e sujeitas à coleta de lixo se declaradas como uma variável local dentro de uma função). Por exemplo, o exemplo a seguir atribui as variáveis g_msMediaKeys e g_mediaKeySession como variáveis globais, que são atribuídas aos objetos MSMediaKeys e MSMediaKeySession na função.

var g_msMediaKeys;
var g_mediaKeySession;

function foo() {
  ...
  g_msMediaKeys = new MSMediaKeys("com.microsoft.playready");
  ...
  g_mediaKeySession = g_msMediaKeys.createSession("video/mp4", intiData, null);
  g_mediaKeySession.addEventListener(this.KEYMESSAGE_EVENT, function (e) 
  {
    ...
    downloadPlayReadyKey(url, keyMessage, function (data) 
    {
      g_mediaKeySession.update(data);
    });
  });
  g_mediaKeySession.addEventListener(this.KEYADDED_EVENT, function () 
  {
    ...
    g_mediaKeySession.close();
    g_mediaKeySession = null;
  });
}

Para obter mais informações, consulte os aplicativos de exemplo.

Confira também