Использование подключаемого DRM (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. В случае разработки приложений для Windows 10 см. раздел последняя документация]
Используя класс MediaProtectionManager, вы можете включить в вашем приложении среды выполнения Windows на JavaScript воспроизведение содержимого, защищенного средствами управления цифровыми правами (DRM).
Предполагается, что вы умеете создавать простые приложения среды выполнения Windows на JavaScript. Рекомендации по созданию первого приложения см. в разделе Создание первого приложения Магазина Windows на JavaScript.
Ниже описана пошаговая процедура воспроизведения защищенного содержимого на компьютере с помощью API MediaProtectionManager.
1. Создайте объект MediaProtectionManager.
Этот класс позволяет вашему приложению подключать прослушиватели для получения запускаемых событий.
В следующем образце кода показано, как создать объект MediaProtectionManager.
var mediaProtectionManager = new Windows.Media.Protection.MediaProtectionManager();
2. Задайте свойство MediaProtectionManager.Properties.
Свойство Properties используется для предоставления информации системе защиты мультимедиа. В настоящее время можно задать три свойства.
Windows.Media.ContentProtection.VideoFrameAccessCertificate — массив значений UINT 8, представляющий сертификат приложения для доступа к кадрам в режиме сервера кадров.
Windows.Media.ContentProtection.ContentProtectionSystemId — GUID, представляющий идентификатор системы защиты. Это значение определяет, какую стороннюю систему защиты следует использовать для обработки защищенного содержимого в ASF-файле WMDRM.
Windows.Media.ContentProtection.ContentProtectionSystemContext — массив значений UINT 8, представляющий дополнительные данные, которые приложение намеревается передать системе защиты для текущего содержимого.
В этом примере показано, как задать свойство Properties.
mediaProtectionManager.properties["Windows.Media.Protection.MediaProtectionSystemId"] =
'{F4637010-03C3-42CD-B932-B48ADF3A6A54}';
// Microsoft.Media.PlayReadyClient.PlayReadyStatics.mediaProtectionSystemId;
3. Укажите MediaProtectionManager для HTML-тега видео или элемента MediaElement XAML.
Укажите метод msSetMediaProtectionManager для экземпляра тега видео или звука.
В следующем образце кода показано, как указать MediaProtectionManager для проигрывателя видео.
video.msSetMediaProtectionManager(mediaProtectionManager);
4. Обработайте события.
Подключите прослушиватели для обработки событий и реализуйте делегаты для обработки задач защиты.
ComponentLoadFailed — срабатывает при сбое загрузки двоичных данных.
RebootNeeded — срабатывает в случае, когда после обновления компонента требуется перезагрузка.
ServiceRequested — срабатывает, когда система защиты содержимого обнаруживает проблему и нуждается в помощи приложения.
В этом примере показано, как добавить прослушиватели событий.
mediaProtectionManager.addEventListener("componentloadfailed", componentLoadFailed);
mediaProtectionManager.addEventListener("servicerequested", serviceRequested);
Пример
Следующий пример демонстрирует, как настроить объект MediaProtectionManager для воспроизведения файла мультимедиа.
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' );
}