Condividi tramite


Come usare DRM modulare (HTML)

[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]

Puoi abilitare contenuto protetto con DRM (Digital Rights Management) nella tua app di Windows Runtime scritta in JavaScript usando MediaProtectionManager.

Partiamo dal presupposto che tu sappia come creare una semplice app di Windows Runtime in JavaScript. Se hai bisogno di aiuto per creare la tua prima app, vedi Creare la prima app di Windows Store scritta in JavaScript.

I passaggi seguenti descrivono come eseguire contenuto protetto su un computer mediante l'API MediaProtectionManager.

1. Crea un oggetto MediaProtectionManager.

Questa classe consente all'app di associare i listener per ricevere gli eventi generati.

L'esempio di codice seguente mostra come creare un oggetto MediaProtectionManager.

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

2. Imposta la proprietà MediaProtectionManager.Properties.

Usa la proprietà Properties per fornire informazioni al sistema di protezione multimediale. Attualmente è possibile impostare tre proprietà.

  • Windows.Media.ContentProtection.VideoFrameAccessCertificate: matrice UINT 8 che rappresenta il certificato dell'applicazione per accedere ai fotogrammi in modalità Frame Server.

  • Windows.Media.ContentProtection.ContentProtectionSystemId: GUID che rappresenta l'ID del sistema di protezione. Questo valore determina il sistema di protezione di terze parti da utilizzare per gestire il contenuto protetto in un file WMDRM ASF (Advanced Streaming Format).

  • Windows.Media.ContentProtection.ContentProtectionSystemContext: matrice UINT 8 che rappresenta ulteriori dati che l'applicazione desidera passare al sistema di protezione per il contenuto corrente.

Il seguente esempio mostra come impostare la proprietà Properties.

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

3. Imposta MediaProtectionManager nel tag Video HTML o in XAML MediaElement.

Imposta il metodo msSetMediaProtectionManager sull'istanza del tag video o audio.

L'esempio di codice seguente mostra come impostare MediaProtectionManager sul lettore video.

    video.msSetMediaProtectionManager(mediaProtectionManager);

4. Gestisci gli eventi.

Associa listener per gestire gli eventi e implementa i delegati per gestire le attività di protezione.

  • ComponentLoadFailed: generato in caso di mancata riuscita del caricamento dei dati binari.

  • RebootNeeded: generato quando è necessario un riavvio dopo il rinnovamento del componente.

  • ServiceRequested: generato quando si verifica un problema nel sistema di protezione del contenuto ed è necessario l'aiuto dell'applicazione.

Il seguente esempio mostra come aggiungere listener eventi.

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

Esempio

L'esempio seguente mostra come impostare MediaProtectionManager per la riproduzione di un file multimediale.

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