Extension EME (Encrypted Media Extension) PlayReadyPlayReady Encrypted Media Extension

Cette section explique comment modifier votre application web PlayReady pour prendre en charge les modifications apportées entre la version Windows 8.1 précédente et la version Windows 10.This section describes how to modify your PlayReady web app to support the changes made from the previous Windows 8.1 version to the Windows 10 version.

L’utilisation d’éléments multimédias PlayReady dans Internet Explorer permet aux développeurs de créer des applications web capables de fournir du contenu PlayReady à l’utilisateur tout en appliquant les règles d’accès définies par le fournisseur de contenu.Using PlayReady media elements in Internet Explorer enables developers to create web apps capable of providing PlayReady content to the user while enforcing the access rules defined by the content provider. Cette section explique comment ajouter des éléments multimédias PlayReady à vos applications web existantes en utilisant uniquement HTML5 et JavaScript.This section describes how to add PlayReady media elements to your existing web apps by using only HTML5 and JavaScript.

Nouveautés de l’extension EME (Encrypted Media Extension) PlayReadyWhat's new in PlayReady Encrypted Media Extension

Cette section fournit la liste des modifications apportées à l’extension EME (Encrypted Media Extension) PlayReady pour activer la protection de contenu PlayReady sur Windows 10.This section provides a list of changes made to the PlayReady Encrypted Media Extension (EME) to enable PlayReady content protection on Windows 10.

La liste suivante décrit les nouvelles fonctionnalités et les modifications apportées à l’extension EME PlayReady pour Windows 10 :The following list describes the new features and changes made to PlayReady Encrypted Media Extension for Windows 10:

  • Ajout de la gestion des droits numériques (DRM) en fonction du matériel.Added hardware digital rights management (DRM).

    La prise en charge de la protection du contenu en fonction du matériel permet la lecture sécurisée de contenu en haute définition (HD) et ultra haute définition (UHD) sur plusieurs plateformes d’appareils.Hardware-based content protection support enables secure playback of high definition (HD) and ultra-high definition (UHD) content on multiple device platforms. Le matériel de clé (y compris les clés privées, les clés de contenu et tout autre matériel de clé utilisé pour dériver ou déverrouiller ces clés) et les échantillons vidéo compressés et non compressés déchiffrés sont protégés en tirant parti de la sécurité matérielle.Key material (including private keys, content keys, and any other key material used to derive or unlock said keys), and decrypted compressed and uncompressed video samples are protected by leveraging hardware security.

  • Acquisition proactive de licences non persistantes.Provides proactive acquisition of non-persistent licenses.

  • Acquisition de plusieurs licences en un message.Provides acquisition of multiple licenses in one message.

    Vous pouvez utiliser un objet PlayReady avec plusieurs identificateurs de clé (KeyID) comme dans Windows 8.1 ou utiliser des données de modèle de déchiffrement de contenu (CDMData) avec plusieurs KeyID.You can either use a PlayReady object with multiple key identifiers (KeyIDs) as in Windows 8.1, or use content decryption model data (CDMData) with multiple KeyIDs.

    Notes

    Dans Windows 10, plusieurs identificateurs de clé sont pris en charge sous <KeyID> dans CDMData.In Windows 10, multiple key identifiers are supported under <KeyID> in CDMData.

  • Ajout de la prise en charge du délai d’expiration en temps réel ou licence à durée limitée (LDL).Added real time expiration support, or limited duration license (LDL).

    Permet de définir l’expiration en temps réel des licences.Provides the ability to set real-time expiration on licenses.

  • Ajout de la prise en charge de la stratégie de protection HDCP de type 1 (version 2.2).Added HDCP Type 1 (version 2.2) policy support.

  • Miracast est désormais une sortie implicite.Miracast is now implicit as an output.

  • Ajout de l’arrêt sécurisé.Added secure stop.

    L’arrêt sécurisé permet à un périphérique PlayReady de confirmer de manière sûre à un service de diffusion multimédia que la lecture multimédia a été stoppée sur un contenu donné.Secure stop provides the means for a PlayReady device to confidently assert to a media streaming service that media playback has stopped for any given piece of content.

  • Ajout d’une séparation de licence audio et vidéo.Added audio and video license separation.

    Les pistes séparées empêchent la vidéo d’être décodée en tant qu’audio, offrant ainsi une protection plus sûre du contenu.Separate tracks prevent video from being decoded as audio; enabling more robust content protection. Les normes émergentes nécessitent des touches distinctes pour les pistes audio et vidéo.Emerging standards are requiring separate keys for audio and visual tracks.

  • Ajout de MaxResDecode.Added MaxResDecode.

    Cette fonctionnalité a été ajoutée pour limiter la lecture de contenu à une résolution maximale et ce, même en cas de possession d’une clé plus compatible (mais pas d’une licence).This feature was added to limit playback of content to a maximum resolution even when in possession of a more capable key (but not a license). Cela concerne également les cas où plusieurs tailles de flux sont codées avec une clé unique.It supports cases where multiple stream sizes are encoded with a single key.

Prise en charge de l’extension EME (Encrypted Media Extension) dans PlayReadyEncrypted Media Extension support in PlayReady

Cette section décrit la version de l’extension EME (Encrypted Media Extension) W3C prise en charge par PlayReady.This section describes the version of the W3C Encrypted Media Extension supported by PlayReady.

PlayReady pour les applications web est actuellement lié à l’ébauche du document W3C sur l’extension EME (Encrypted Media Extension) datée du 10 mai 2013.PlayReady for Web Apps is currently bound to the W3C Encrypted Media Extension (EME) draft of May 10, 2013. Cette prise en charge sera remplacée par la spécification EME mise à jour dans les prochaines versions de Windows.This support will be changed to the updated EME specification in future versions of Windows.

Utiliser la gestion des droits numériques en fonction du matérielUse hardware DRM

Cette section explique comment votre application web peut utiliser la gestion des droits numériques en fonction du matériel par PlayReady et comment désactiver la gestion des droits numériques en fonction du matériel si le contenu protégé ne la prend pas en charge.This section describes how your web app can use PlayReady hardware DRM, and how to disable hardware DRM if the protected content does not support it.

Pour utiliser la gestion des droits numériques en fonction du matériel par PlayReady, votre application web JavaScript doit utiliser la méthode EME isTypeSupported avec un identificateur système de clé com.microsoft.playready.hardware pour vérifier la prise en charge de la gestion des droits numériques en fonction du matériel par PlayReady à partir du navigateur.To use PlayReady hardware DRM, your JavaScript web app should use the isTypeSupported EME method with a key system identifier of com.microsoft.playready.hardware to query for PlayReady hardware DRM support from the browser.

Il arrive que certains contenus ne soient pas pris en charge par la gestion des droits numériques en fonction du matériel.Occasionally, some content is not supported in hardware DRM. Le contenu Cocktail n’est jamais pris en charge par la gestion des droits numériques en fonction du matériel. Si vous souhaitez lire du contenu Cocktail, vous devez désactiver la gestion des droits numériques en fonction du matériel.Cocktail content is never supported in hardware DRM; if you want to play cocktail content, you must opt out of hardware DRM. Certains types de gestion des droits numériques en fonction du matériel prennent en charge le contenu HEVC et d’autres non. Si vous voulez lire du contenu HEVC et que la gestion des droits numériques en fonction du matériel ne le prend pas en charge, vous pouvez la désactiver.Some hardware DRM will support HEVC and some will not; if you want to play HEVC content and hardware DRM doesn’t support it, you will want to opt out as well.

Notes

Pour déterminer si le contenu HEVC est pris en charge, après l’instanciation com.microsoft.playready , utilisez la méthode PlayReadyStatics. CheckSupportedHardware .To determine whether HEVC content is supported, after instantiating com.microsoft.playready, use the PlayReadyStatics.CheckSupportedHardware method.

Ajouter un arrêt sécurisé à votre application webAdd secure stop to your web app

Cette section explique comment ajouter un arrêt sécurisé à votre application web.This section describes how to add secure stop to your web app.

L’arrêt sécurisé permet à un périphérique PlayReady de confirmer de manière sûre à un service de diffusion multimédia que la lecture multimédia a été stoppée sur un contenu donné.Secure stop provides the means for a PlayReady device to confidently assert to a media streaming service that media playback has stopped for any given piece of content. Cette fonctionnalité permet à vos services de streaming multimédia de contrôler et de rapporter avec précision les limites d’utilisation sur différents appareils pour un compte donné.This capability ensures your media streaming services provide accurate enforcement and reporting of usage limitations on different devices for a given account.

Il existe deux scénarios principaux pour l’envoi d’une demande d’arrêt sécurisé :There are two primary scenarios for sending a secure stop challenge:

  • Lorsque la présentation multimédia s’arrête car la fin du contenu a été atteinte ou lorsque l’utilisateur a arrêté la présentation multimédia en cours de lecture.When the media presentation stops because end of content was reached or when the user stopped the media presentation somewhere in the middle.
  • Lorsque la session précédente se termine inopinément (par exemple, en raison d’un blocage du système ou de l’application).When the previous session ends unexpectedly (for example, due to a system or app crash). L’application devra contrôler, au moment du démarrage ou de l’arrêt, s’il y a des sessions d’arrêt sécurisé en attente et envoyer les demandes séparément de la lecture de tout autre contenu multimédia.The app will need to query, either at startup or shutdown, for any outstanding secure stop sessions and send challenge(s) separate from any other media playback.

Les procédures suivantes expliquent comment configurer l’arrêt sécurisé pour différents scénarios.The following procedures describe how to set up secure stop for various scenarios.

Pour configurer l’arrêt sécurisé pour un arrêt normal d’une présentation :To set up secure stop for a normal end of a presentation:

  1. Enregistrez l’événement onEnded avant le début de la lecture.Register the onEnded event before playback starts.
  2. Le gestionnaire d’événements onEnded doit appelerremoveAttribute("src") à partir de l’objet de l’élément audio/vidéo pour définir la source sur NULL, ce qui déclenchera la suppression de la topologie, la destruction des déchiffreurs et la définition de l’état d’arrêt par Media Foundation.The onEnded event handler needs to call removeAttribute("src") from the video/audio element object to set the source to NULL which will trigger the media foundation to tear down the topology, destroy the decryptor(s), and set the stop state.
  3. Vous pouvez démarrer la session CDM d’arrêt sécurisé dans le gestionnaire pour envoyer la demande d’arrêt sécurisé au serveur afin de notifier l’arrêt de la lecture à ce moment, mais vous pouvez également le faire ultérieurement.You can start the secure stop CDM session inside the handler to send the secure stop challenge to the server to notify the playback has stopped at this time, but it can be done later as well.

Pour configurer l’arrêt sécurisé si l’utilisateur quitte la page ou ferme l’onglet ou le navigateur :To set up secure stop if the user navigates away from the page or closes down the tab or browser:

  • Aucune action de l’application n’est requise pour enregistrer l’état d’arrêt ; il sera enregistré pour vous.No app action is required to record the stop state; it will be recorded for you.

Pour configurer l’arrêt sécurisé pour des contrôles de page ou des actions utilisateur personnalisés (par exemple, des boutons de navigation personnalisés ou le démarrage d’une nouvelle présentation avant la fin de la présentation actuelle) :To set up secure stop for custom page controls or user actions (such as custom navigation buttons or starting a new presentation before the current presentation completed):

  • Lorsqu’une action utilisateur personnalisée a lieu, l’application doit définir la source sur NULL, ce qui déclenchera la suppression de la topologie, la destruction des déchiffreurs et la définition de l’état d’arrêt par Media Foundation.When custom user action occurs, the app needs to set the source to NULL which will trigger the media foundation to tear down the topology, destroy the decryptor(s), and set the stop state.

L’exemple suivant montre comment utiliser l’arrêt sécurisé dans votre application web :The following example demonstrates how to use secure stop in your web app:

// 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 proecess 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;
}

Notes

Les données d’arrêt sécurisées <SessionID>B64 encoded session ID</SessionID> dans l’exemple ci-dessus peuvent être un astérisque ( * ), qui est un caractère générique pour toutes les sessions d’arrêt sécurisées enregistrées.The secure stop data’s <SessionID>B64 encoded session ID</SessionID> in the sample above can be an asterisk (*), which is a wild card for all the secure stop sessions recorded. Autrement dit, la balise SessionID peut être une session spécifique, ou un caractère générique ( * ) pour sélectionner toutes les sessions d’arrêt sécurisé.That is, the SessionID tag can be a specific session, or a wild card (*) to select all the secure stop sessions.

Considérations en matière de programmation de l’extension EME (Encrypted Media Extension)Programming considerations for Encrypted Media Extension

Cette section répertorie les considérations en matière de programmation que vous devez prendre en compte lors de la création de votre application web compatible PlayReady pour Windows 10.This section lists the programming considerations that you should take into account when creating your PlayReady-enabled web app for Windows 10.

Les objets MSMediaKeys et MSMediaKeySession créés par votre application doivent être maintenus actifs jusqu’à la fermeture de votre application.The MSMediaKeys and MSMediaKeySession objects created by your app must be kept alive until your app closes. Pour garantir que ces objets restent actifs, vous pouvez les affecter en tant que variables globales (les variables deviennent hors de portée et sont mises à la corbeille si elles sont déclarées comme variables locales à l’intérieur d’une fonction).One way of ensuring these objects stay alive is to assign them as global variables (the variables would become out of scope and subject to garbage collection if declared as a local variable inside of a function). Par exemple, l’exemple suivant affecte les variables g _ msMediaKeys et g _ mediaKeySession en tant que variables globales, qui sont ensuite affectées aux objets msMediaKeys et MSMediaKeySession dans la fonction.For example, the following sample assigns the variables g_msMediaKeys and g_mediaKeySession as global variables, which are then assigned to the MSMediaKeys and MSMediaKeySession objects in the function.

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;
  });
}

Pour plus d’informations, voir les exemples d’applications.For more information, see the sample applications.

Voir aussiSee also