Compartir vía


Encrypted Media Extension (EME) de PlayReady

En esta sección se describe cómo modificar la aplicación web de PlayReady para admitir los cambios realizados desde la versión anterior de Windows 8.1 a la versión de Windows 10.

El uso de elementos multimedia de PlayReady en Internet Explorer permite a los desarrolladores crear aplicaciones web capaces de proporcionar contenido de PlayReady al usuario mientras se aplican las reglas de acceso definidas por el proveedor de contenido. En esta sección se describe cómo agregar elementos multimedia de PlayReady a las aplicaciones web existentes mediante solo HTML5 y JavaScript.

Novedades de la extensión multimedia de PlayReady Encrypted

En esta sección se proporciona una lista de los cambios realizados en la extensión multimedia cifrada (EME) de PlayReady para habilitar la protección de contenido de PlayReady en Windows 10.

En la lista siguiente se describen las nuevas características y los cambios realizados en la extensión multimedia de PlayReady Encrypted para Windows 10:

  • Se ha agregado administración de derechos digitales de hardware (DRM).

    La compatibilidad con la protección de contenido basada en hardware permite la reproducción segura de contenido de alta definición (HD) y ultra alta definición (UHD) en varias plataformas de dispositivos. El material de clave (incluidas las claves privadas, las claves de contenido y cualquier otro material de clave usado para derivar o desbloquear dichas claves) y los ejemplos de vídeo comprimidos y sin comprimir se protegen aprovechando la seguridad de hardware.

  • Proporciona una adquisición proactiva de licencias no persistentes.

  • Proporciona la adquisición de varias licencias en un mensaje.

    Puedes usar un objeto PlayReady con varios identificadores de clave (KeyIDs) como en Windows 8.1 o usar datos del modelo de descifrado de contenido (CDMData) con varios KeyID.

    Nota:

    En Windows 10, se admiten varios identificadores de clave en <KeyID> en CDMData.

  • Se ha agregado compatibilidad con la expiración en tiempo real o una licencia de duración limitada (LDL).

    Proporciona la capacidad de establecer la expiración en tiempo real en las licencias.

  • Se ha agregado compatibilidad con directivas de tipo HDCP 1 (versión 2.2).

  • Miracast ahora es implícito como salida.

  • Se ha agregado una parada segura.

    La detención segura proporciona los medios para que un dispositivo PlayReady aserte con confianza a un servicio de streaming multimedia que la reproducción multimedia se ha detenido para cualquier fragmento de contenido determinado.

  • Se ha agregado separación de licencias de audio y vídeo.

    Las pistas independientes impiden que el vídeo se descodifique como audio; habilitando una protección de contenido más sólida. Los estándares emergentes requieren claves independientes para pistas visuales y de audio.

  • Se ha agregado MaxResDecode.

    Esta característica se agregó para limitar la reproducción del contenido a una resolución máxima incluso cuando se posee una clave más capaz (pero no una licencia). Admite casos en los que se codifican varios tamaños de secuencia con una sola clave.

Compatibilidad con la extensión multimedia cifrada en PlayReady

En esta sección se describe la versión de la extensión multimedia cifrada W3C compatible con PlayReady.

PlayReady for Web Apps está enlazado actualmente al borrador de extensión multimedia cifrada (EME) de W3C del 10 de mayo de 2013. Esta compatibilidad se cambiará a la especificación EME actualizada en versiones futuras de Windows.

Uso de DRM de hardware

En esta sección se describe cómo la aplicación web puede usar DRM de hardware de PlayReady y cómo deshabilitar DRM de hardware si el contenido protegido no lo admite.

Para usar DRM de hardware de PlayReady, la aplicación web de JavaScript debe usar el método EME isTypeSupported con un identificador clave del sistema de com.microsoft.playready.hardware para consultar la compatibilidad con DRM de hardware de PlayReady desde el explorador.

En ocasiones, algunos contenidos no se admiten en DRM de hardware. El contenido de cóctel nunca se admite en DRM de hardware; Si desea reproducir contenido de cócteles, debe no participar en DRM de hardware. Algunos DRM de hardware admitirán HEVC y algunos no; Si desea reproducir contenido HEVC y DRM de hardware no lo admite, también querrá rechazarlo.

Nota:

Para determinar si se admite el contenido HEVC, después de crear una instancia com.microsoft.playreadyde , use el método PlayReadyStatics.CheckSupportedHardware .

Adición de una parada segura a la aplicación web

En esta sección se describe cómo agregar una parada segura a la aplicación web.

La detención segura proporciona los medios para que un dispositivo PlayReady aserte con confianza a un servicio de streaming multimedia que la reproducción multimedia se ha detenido para cualquier fragmento de contenido determinado. Esta funcionalidad garantiza que los servicios de streaming multimedia proporcionan una aplicación precisa y la generación de informes de limitaciones de uso en diferentes dispositivos para una cuenta determinada.

Hay dos escenarios principales para enviar un desafío de detención seguro:

  • Cuando se detiene la presentación multimedia porque se alcanzó el final del contenido o cuando el usuario detuvo la presentación multimedia en algún lugar del medio.
  • Cuando la sesión anterior finaliza inesperadamente (por ejemplo, debido a un bloqueo del sistema o de la aplicación). La aplicación tendrá que consultar, ya sea durante el inicio o el apagado, para las sesiones de detención seguras pendientes y enviar desafíos independientes de cualquier otra reproducción multimedia.

En los procedimientos siguientes se describe cómo configurar la detención segura para varios escenarios.

Para configurar una parada segura para un final normal de una presentación:

  1. Registre el evento onEnded antes de que se inicie la reproducción.
  2. El controlador de eventos onEnded debe llamar removeAttribute("src") desde el objeto de elemento de vídeo o audio para establecer el origen en NULL , que desencadenará la base multimedia para anular la topología, destruir los descifradores y establecer el estado de detención.
  3. Puede iniciar la sesión de CDM de detención segura dentro del controlador para enviar el desafío de detención segura al servidor para notificar que la reproducción se ha detenido en este momento, pero también se puede hacer más adelante.

Para configurar la detención segura si el usuario se aleja de la página o cierra la pestaña o el explorador:

  • No se requiere ninguna acción de aplicación para registrar el estado de detención; se grabará para usted.

Para configurar una parada segura para controles de página personalizados o acciones de usuario (como botones de navegación personalizados o iniciar una nueva presentación antes de que se complete la presentación actual):

  • Cuando se produce una acción de usuario personalizada, la aplicación debe establecer el origen en NULL , que desencadenará la base multimedia para anular la topología, destruir los descifradores y establecer el estado de detención.

En el ejemplo siguiente se muestra cómo usar la detención segura en la aplicación 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;
}

Nota:

Los datos de detención segura del <SessionID>B64 encoded session ID</SessionID> ejemplo anterior pueden ser un asterisco (*), que es un comodín para todas las sesiones de detención seguras registradas. Es decir, la etiqueta SessionID puede ser una sesión específica o un carácter comodín (*) para seleccionar todas las sesiones de detención seguras.

Consideraciones de programación para la extensión multimedia cifrada

En esta sección se enumeran las consideraciones de programación que debe tener en cuenta al crear la aplicación web habilitada para PlayReady para Windows 10.

Los objetos MSMediaKeys y MSMediaKeySession creados por la aplicación deben mantenerse activos hasta que se cierre la aplicación. Una manera de asegurarse de que estos objetos permanecen activos es asignarlos como variables globales (las variables estarían fuera del ámbito y sujetas a la recolección de elementos no utilizados si se declaran como una variable local dentro de una función). Por ejemplo, en el ejemplo siguiente se asignan las variables g_msMediaKeys y g_mediaKeySession como variables globales, que a continuación se asignan a los objetos MSMediaKeys y MSMediaKeySession de la función.

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 obtener más información, consulte las aplicaciones de ejemplo.

Consulte también