Compartir a través de


Cómo usar DRM acoplable (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows Runtime. Si estás desarrollando para Windows 10, consulta la documentación más reciente ]

Puedes habilitar contenido protegido por la administración de derechos digitales (DRM) en tu aplicación de Windows en tiempo de ejecución con JavaScript mediante MediaProtectionManager.

En este tema se da por hecho que sabes crear una aplicación Windows en tiempo de ejecución básica con JavaScript. Si necesitas ayuda para crear tu primera aplicación, consulta Crear la primera aplicación de la Tienda Windows con JavaScript.

En los pasos siguientes se describe cómo reproducir contenido protegido en un equipo mediante la API MediaProtectionManager.

1. Crea un objeto MediaProtectionManager.

Esta clase permite que la aplicación adjunte escuchas para recibir los eventos que se desencadenan.

El siguiente ejemplo de código muestra cómo crear un objeto MediaProtectionManager.

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

2. Define la propiedad MediaProtectionManager.Properties.

Usa la propiedad Properties para proporcionar información al sistema de protección multimedia. Actualmente, se pueden definir tres propiedades.

  • Windows.Media.ContentProtection.VideoFrameAccessCertificate: una matriz UINT 8 que representa el certificado de la aplicación para acceder a los marcos del modo de servidor de fotogramas.

  • Windows.Media.ContentProtection.ContentProtectionSystemId: un GUID que representa el identificador del sistema de protección. Este valor determina el sistema de protección de terceros que se debe usar para controlar el contenido protegido en un archivo de formato de transmisión avanzada (ASF) de WMDRM.

  • Windows.Media.ContentProtection.ContentProtectionSystemContext: una matriz UINT 8 que representa datos adicionales que la aplicación desea pasar al sistema de protección para el contenido actual.

En este ejemplo se muestra cómo establecer la propiedad Properties.

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

3. Configura MediaProtectionManager en la etiqueta de vídeo HTML o MediaElement en XAML.

Define el método msSetMediaProtectionManager en la instancia de la etiqueta de audio o vídeo.

El siguiente ejemplo de código muestra cómo definir MediaProtectionManager en el reproductor de vídeo.

    video.msSetMediaProtectionManager(mediaProtectionManager);

4. Controla los eventos.

Adjunta escuchas para controlar los eventos e implementa los delegados para controlar las tareas de protección.

  • ComponentLoadFailed: se desencadena cuando la carga de datos binarios genera un error.

  • RebootNeeded: se desencadena cuando se necesita un reinicio después de que se renueve el componente.

  • ServiceRequested: se desencadena cuando el sistema de protección de contenido encuentra un problema y necesita ayuda de la aplicación.

En este ejemplo se muestra cómo agregar escuchas de eventos.

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

Ejemplo

En el siguiente ejemplo se muestra cómo configurar MediaProtectionManager para reproducir un archivo multimedia.

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