Comment utiliser la fonctionnalité DRM enfichable (HTML)

[ Cet article est destiné aux développeurs Windows 8.x et Windows Phone 8.x qui créent des applications Windows Runtime. Si vous développez une application pour Windows 10, voir la Documentation ]

Vous pouvez activer le contenu protégé par la gestion des droits numériques (DRM) dans votre application Windows Runtime en JavaScript à l’aide de MediaProtectionManager.

Dans cette rubrique, nous partons du principe que vous savez créer une application Windows Runtime de base en JavaScript. Pour obtenir de l’aide lors de la création de votre première application, voir Créer votre première application du Windows Store en JavaScript.

Les étapes suivantes décrivent comment lire un contenu protégé sur un ordinateur à l’aide de l’API MediaProtectionManager.

1. Créez un objet MediaProtectionManager.

Cette classe permet à votre application d’attacher des détecteurs afin de recevoir les événements qui sont déclenchés.

L’exemple de code suivant explique comment créer un objet MediaProtectionManager.

    var mediaProtectionManager = new Windows.Media.Protection.MediaProtectionManager();

2. Définissez la propriété MediaProtectionManager.Properties.

Utilisez la propriété Properties pour donner des informations au système de protection du contenu multimédia. Trois propriétés peuvent actuellement être définies.

  • Windows.Media.ContentProtection.VideoFrameAccessCertificate - tableau UINT 8 qui représente le certificat de l’application pour accéder aux images en mode Serveur d’images.

  • Windows.Media.ContentProtection.ContentProtectionSystemId - GUID qui représente l’ID du système de protection. Cette valeur détermine quel système de protection tiers doit être utilisé pour prendre en charge les contenus protégés dans un fichier ASF WMDRM.

  • Windows.Media.ContentProtection.ContentProtectionSystemContext - tableau UINT 8 qui représente des données supplémentaires que l’application souhaite transmettre au système de protection pour le contenu actuel.

L’exemple suivant explique comment définir la propriété Properties.

    mediaProtectionManager.properties["Windows.Media.Protection.MediaProtectionSystemId"] =
        '{F4637010-03C3-42CD-B932-B48ADF3A6A54}';
        // Microsoft.Media.PlayReadyClient.PlayReadyStatics.mediaProtectionSystemId;

3. Définissez le MediaProtectionManager sur la balise vidéo HTML ou l’élément MediaElement XAML.

Définissez la méthode msSetMediaProtectionManager sur l’instance de la balise vidéo ou audio.

L’exemple de code suivant montre comment définir le MediaProtectionManager sur le lecteur vidéo.

    video.msSetMediaProtectionManager(mediaProtectionManager);

4. Gérez les événements.

Attachez des détecteurs pour gérer les événements et implémentez les délégués pour gérer les tâches de protection.

  • ComponentLoadFailed - déclenché en cas d’échec de chargement de données binaires.

  • RebootNeeded - déclenché si un redémarrage est nécessaire après un renouvellement du composant.

  • ServiceRequested - déclenché lorsque le système de protection de contenu rencontre un problème et nécessite l’aide de l’application.

Cet exemple explique comment ajouter des détecteurs d’événements.

    mediaProtectionManager.addEventListener("componentloadfailed", componentLoadFailed);
    mediaProtectionManager.addEventListener("servicerequested", serviceRequested);

Exemple

L’exemple suivant montre comment configurer le MediaProtectionManager de sorte de lire un fichier multimédia.

var mpmCompletionNotifier;

function btnPlayOnClick()
{
    try
    {
        clearLog();

        var videoPlayer;
        var mediaProtectionManager;
        var mediaFilename;

        logMsg( 'Beginning playback attempt...' );

        videoPlayer = document.getElementById( 'video' );

        logMsg( '--- Setting up video player object' );
        videoPlayer.addEventListener.addEventListener( 'canplay', onCanPlay, false);
        videoPlayer.addEventListener( 'error', onPlayError, false);

        logMsg( '--- Creating new Windows.Media.Protection.MediaProtectionManager' );
        mediaProtectionManager = new Windows.Media.Protection.MediaProtectionManager();

        logMsg( '--- Setting up MediaProtectionManager' );
        mediaProtectionManager.addEventListener( "componentloadfailed", componentLoadFailed, false);
        mediaProtectionManager.addEventListener( "servicerequested", serviceRequested, false);
        mediaProtectionManager.properties["Windows.Media.Protection.MediaProtectionSystemId"] =
            '{F4637010-03C3-42CD-B932-B48ADF3A6A54}'; 
            // Microsoft.Media.PlayReadyClient.PlayReadyStatics.mediaProtectionSystemId;
       
        var registrar = new Windows.Media.MediaExtensionManager();

        registrar.registerByteStreamHandler('Microsoft.Media.PlayReadyClient.PlayReadyByteStreamHandler', '.asf', null);
        registrar.registerByteStreamHandler('Microsoft.Media.PlayReadyClient.PlayReadyByteStreamHandler', '.pyv', null);

        logMsg( '--- Setting MediaProtectionManager to video player' );
        videoPlayer.msSetMediaProtectionManager( mediaProtectionManager );
        
        //playback PR content which has been renamed to .asf
        //media content has been packed with application for now
        logMsg( '--- Setting player source' );
        mediaFilename = 'pr_006_1_01_v4_0_wmv.pyv.asf';
        videoPlayer.src = mediaFilename;
    }
    catch ( e )
    {
        // handle the error.
        logWarning( e, 'btnPlayOnClick' );       
    }
}

function onCanPlay()
{
    var videoPlayer = document.getElementById( 'video' );

    logMsg( 'Attempting to start playback' );

    try
    {
        videoPlayer.play();
    }
    catch ( e )
    {
        logWarning( e, 'onCanPlay' );
        // Handle the error.  
    }
}

function componentLoadFailed( e )
{
    try
    {
        logMsg( e.information.items.size + " failed components!" );
        logMsg( "Components:" );

        //  List the failing components
        for ( var i = 0; i < e.information.items.size; i++ )
        {
            logMsg( e.information.items[i].name + "\nReasons=0x" + e.information.items[i].reasons + '\n'
                                                + "Renewal Id=" + e.information.items[i].renewalId  );
        }

        e.completion.complete( false );
        logMsg( "Resumed source (false)" );
    }
    catch ( e )
    {
        logWarning( e, 'componentLoadFailed' );
        // Handle the error. 
    }
}

function serviceRequested( e )
{
    try
    {
        logMsg( "Service request required before playback can happen, service request type: " + getSRType( e.request ) );

        var serviceRequestOperation = e.request.operation;
        mpmCompletionNotifier = e.completion;
        logMsg( "--- Request type: " + getSRType( e.request )  );

        serviceRequestOperation.enablingActionRequired = function ( sender, enabler ){ onEnablingActionRequired( sender, enabler ); };

        if ( g_fUsePromises )
        {
            logMsg( '--- using promises model ( e.request.then(..) )' );        
            e.request.then( onPlaySRCompleted, onPlaySRError );
        }
        else
        {
            serviceRequestOperation.completed = function ( asyncOp ){ onPlaySRCompleted( asyncOp ); };
            serviceRequestOperation.start();
        }
    }
    catch ( e )
    {
        logWarning( e, 'serviceRequested' );
        // Handle error.  
    }
}

function onPlaySRCompleted( asyncOp )
{
    try
    {
        logMsg( 'Service Request completed with status: ' + getAsyncStatus( asyncOp )  );
        mpmCompletionNotifier.complete( true );
        logMsg( 'after mpmCompletionNotifier.complete( true )' );
    }
    catch ( e )
    {
        logWarning( e, 'onPlaySRCompleted' );
        taef_testFailed( e, 'onPlaySRCompleted', 'playback' );          
    }
}

function onPlaySRError( sender, e )
{
    logWarning( e, 'onPlaySRError' );      
}

function onPlayError( )
{
    logMsg( 'Play back failed' );     
}