Como usar o DRM conectável (HTML)
[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente ]
Você pode ativar o conteúdo protegido por DRM (Digital Rights Management) no seu aplicativo do Tempo de Execução do Windows em JavaScript usando o MediaProtectionManager.
Este tópico presume que você possa criar um aplicativo básico do Tempo de Execução do Windows em JavaScript. Para obter ajuda para criar seu primeiro aplicativo, veja Criar seu primeiro aplicativo da Windows Store em JavaScript.
As etapas a seguir descrevem como reproduzir um conteúdo protegido no computador usando a API MediaProtectionManager.
1. Crie um objeto MediaProtectionManager.
Essa classe permite que seu aplicativo anexe ouvintes para receber os eventos acionados.
O exemplo de código a seguir mostra como criar um objeto MediaProtectionManager.
var mediaProtectionManager = new Windows.Media.Protection.MediaProtectionManager();
2. Defina a propriedade MediaProtectionManager.Properties.
Use a propriedade Properties para fornecer informações ao sistema de proteção de mídia. Atualmente, há três propriedades que podem ser definidas.
Windows.Media.ContentProtection.VideoFrameAccessCertificate - uma matriz UINT 8 que representa o certificado do aplicativo para acessar quadros no modo de servidor de quadros.
Windows.Media.ContentProtection.ContentProtectionSystemId - uma GUID que representa a ID do sistema de proteção. Esse valor determina qual sistema de proteção de terceiros deve ser usado para manipular conteúdo protegido em um arquivo de um formato ASF (Advanced Streaming Format) do WMDRM.
Windows.Media.ContentProtection.ContentProtectionSystemContext - uma matriz UINT 8 que representa dados adicionais que o aplicativo quer passar para o sistema de proteção do conteúdo atual.
Este exemplo mostra como definir a propriedade Properties.
mediaProtectionManager.properties["Windows.Media.Protection.MediaProtectionSystemId"] =
'{F4637010-03C3-42CD-B932-B48ADF3A6A54}';
// Microsoft.Media.PlayReadyClient.PlayReadyStatics.mediaProtectionSystemId;
3. Defina o Gerenciador de Proteção à Mídia na marca de vídeo HTML ou no elemento de mídia XAML.
Defina o método msSetMediaProtectionManager para a instância da marca de vídeo ou de áudio.
O exemplo de código a seguir mostra como definir o MediaProtectionManager no player de vídeo.
video.msSetMediaProtectionManager(mediaProtectionManager);
4. Controle os eventos.
Anexe ouvintes para manipular os eventos e implemente delegados para controlar as tarefas de proteção.
ComponentLoadFailed - disparado quando a carga de dados binários falha.
RebootNeeded - disparado quando uma reinicialização é necessária depois que o componente é renovado.
ServiceRequested - disparado quando o sistema de proteção de conteúdo encontra um problema e precisa da ajuda do aplicativo.
Este exemplo mostra como adicionar ouvintes de eventos.
mediaProtectionManager.addEventListener("componentloadfailed", componentLoadFailed);
mediaProtectionManager.addEventListener("servicerequested", serviceRequested);
Exemplo
O exemplo a seguir mostra como configurar o MediaProtectionManager para reproduzir um arquivo de mí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' );
}