Verwenden von austauschbarem DRM (HTML)
[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation ]
Sie können durch die Verwaltung digitaler Rechte (DRM) geschützte Inhalte in Ihrer Windows-Runtime-App mit JavaScript wiedergeben, indem Sie den MediaProtectionManager verwenden.
Dieses Thema setzt voraus, dass Sie eine einfache Windows-Runtime-App mit JavaScript erstellen können. Informationen zum Erstellen der ersten App finden Sie unter Erstellen Ihrer ersten Windows Store-App mit JavaScript.
Die folgenden Schritte beschreiben, wie geschützter Inhalt mit der MediaProtectionManager-API auf einem Computer wiedergegeben wird.
1. Erstellen Sie ein MediaProtectionManager-Objekt.
Diese Klasse ermöglicht es Ihrer Anwendung, Listener anzuhängen, um ausgelöste Ereignisse zu empfangen.
Im folgenden Codebeispiel wird ein MediaProtectionManager-Objekt erstellt.
var mediaProtectionManager = new Windows.Media.Protection.MediaProtectionManager();
2. Legen Sie die MediaProtectionManager.Properties-Eigenschaft fest.
Verwenden Sie die Properties-Eigenschaft, um Informationen für das Medienschutzsystem bereitzustellen. Zurzeit gibt es drei Eigenschaften, die festgelegt werden können.
Windows.Media.ContentProtection.VideoFrameAccessCertificate - ein UINT 8-Array, das das Anwendungszertifikat zum Zugriff auf Frames im Frame-Server-Modus darstellt.
Windows.Media.ContentProtection.ContentProtectionSystemId - eine GUID, die die Schutzsystem-ID darstellt. Dieser Wert bestimmt, welches Schutzsystem eines Drittanbieters verwendet werden soll, um geschützten Inhalt in einer WMDRM Advanced Streaming Format (ASF)-Datei zu behandeln.
Windows.Media.ContentProtection.ContentProtectionSystemContext - ein UINT 8-Array, das zusätzliche Daten darstellt, die die Anwendung an das Schutzsystem für den aktuellen Inhalt weiterleitet.
In diesem Beispiel ist die Festlegung der Properties-Eigenschaft dargestellt.
mediaProtectionManager.properties["Windows.Media.Protection.MediaProtectionSystemId"] =
'{F4637010-03C3-42CD-B932-B48ADF3A6A54}';
// Microsoft.Media.PlayReadyClient.PlayReadyStatics.mediaProtectionSystemId;
3. Legen Sie MediaProtectionManager auf das HTML-Videotag oder XAML MediaElement fest.
Legen Sie die msSetMediaProtectionManager-Methode auf die Instanz des Video- oder Audiotags fest.
Im folgenden Codebeispiel wird MediaProtectionManager auf dem Videoplayer festgelegt.
video.msSetMediaProtectionManager(mediaProtectionManager);
4. Behandeln Sie die Ereignisse.
Hängen Sie Listener an, um die Ereignisse zu behandeln und die Delegate zur Behandlung der Schutzaufgaben zu implementieren.
ComponentLoadFailed - wird aktiviert, wenn das Laden von Binärdaten fehlschlägt.
RebootNeeded - wird aktiviert, wenn ein Neustart nach der Erneuerung der Komponente erforderlich ist.
ServiceRequested - wird aktiviert, wenn im Inhaltsschutzsystem ein Fehler auftritt und die Hilfe der Anwendung erforderlich ist.
In diesem Beispiel wird das Hinzufügen von Ereignis-Listenern dargestellt.
mediaProtectionManager.addEventListener("componentloadfailed", componentLoadFailed);
mediaProtectionManager.addEventListener("servicerequested", serviceRequested);
Beispiel
Im folgenden Beispiel wird gezeigt, wie MediaProtectionManager für die Wiedergabe einer Mediendatei eingerichtet wird.
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' );
}