Verschlüsselte Medienerweiterung von PlayReady
In diesem Abschnitt wird beschrieben, wie Sie Ihre PlayReady-Web-App ändern, um die änderungen zu unterstützen, die von der vorherigen Windows 8.1-Version an der Windows 10-Version vorgenommen wurden.
Mithilfe von PlayReady-Medienelementen in Internet Explorer können Entwickler Web-Apps erstellen, die PlayReady-Inhalte für den Benutzer bereitstellen können, während die vom Inhaltsanbieter definierten Zugriffsregeln erzwungen werden. In diesem Abschnitt wird beschrieben, wie Sie PlayReady-Medienelemente zu Ihren vorhandenen Web-Apps hinzufügen, indem Sie nur HTML5 und JavaScript verwenden.
Neuerungen in der verschlüsselten Medienerweiterung "PlayReady"
Dieser Abschnitt enthält eine Liste der Änderungen, die an der verschlüsselten Medienerweiterung (PlayReady Encrypted Media Extension, EME) vorgenommen wurden, um playReady-Inhaltsschutz unter Windows 10 zu aktivieren.
In der folgenden Liste werden die neuen Features und Änderungen beschrieben, die an der verschlüsselten Medienerweiterung von PlayReady für Windows 10 vorgenommen wurden:
Hardware-Verwaltung digitaler Rechte (Digital Rights Management, DRM) hinzugefügt.
Hardwarebasierte Inhaltsschutzunterstützung ermöglicht die sichere Wiedergabe von Hd-Inhalten (HD) und Ultra-High-Definition -Inhalten (UHD) auf mehreren Geräteplattformen. Schlüsselmaterial (einschließlich privater Schlüssel, Inhaltsschlüssel und jedes andere Schlüsselmaterial, das zum Ableiten oder Entsperren dieser Schlüssel verwendet wird) und entschlüsselte komprimierte und nicht komprimierte Videobeispiele werden durch Die Verwendung der Hardwaresicherheit geschützt.
Bietet proaktiven Erwerb von nicht persistenten Lizenzen.
Stellt den Erwerb mehrerer Lizenzen in einer Nachricht bereit.
Sie können entweder ein PlayReady-Objekt mit mehreren Schlüsselbezeichnern (KeyIDs) wie in Windows 8.1 verwenden oder Inhaltsentschlüsselungsmodelldaten (CDMData) mit mehreren KeyIDs verwenden.
Hinweis
In Windows 10 werden mehrere Schlüsselbezeichner unter <KeyID> in CDMData unterstützt.
Unterstützung für Den Echtzeitablauf oder lizenz für begrenzte Dauer (LIMITED Duration License) hinzugefügt.
Bietet die Möglichkeit, den Echtzeitablauf für Lizenzen festzulegen.
Unterstützung für HDCP-Typ 1 (Version 2.2) hinzugefügt.
Miracast ist jetzt implizit als Ausgabe.
Sicherer Stopp hinzugefügt.
Secure Stop stellt die Mittel für ein PlayReady-Gerät bereit, um einen Medienstreamingdienst sicher zu bestätigen, dass die Medienwiedergabe für einen bestimmten Teil von Inhalten beendet wurde.
Audio- und Videolizenztrennung hinzugefügt.
Separate Titel verhindern, dass Video als Audio decodiert wird; Ermöglichen eines robusteren Inhaltsschutzes. Neue Standards erfordern separate Schlüssel für Audio- und visuelle Titel.
MaxResDecode wurde hinzugefügt.
Dieses Feature wurde hinzugefügt, um die Wiedergabe von Inhalten auf eine maximale Auflösung zu beschränken, auch wenn ein fähigerer Schlüssel (aber keine Lizenz) besitzt. Es unterstützt Fälle, in denen mehrere Datenstromgrößen mit einem einzelnen Schlüssel codiert werden.
Unterstützung für verschlüsselte Medienerweiterungen in PlayReady
In diesem Abschnitt wird die Version der von PlayReady unterstützten verschlüsselten W3C-Medienerweiterung beschrieben.
PlayReady für Web-Apps ist derzeit an den EmE-Entwurf (W3C Encrypted Media Extension) vom 10. Mai 2013 gebunden. Diese Unterstützung wird in zukünftigen Versionen von Windows in die aktualisierte EME-Spezifikation geändert.
Verwenden des Hardware-DRM
In diesem Abschnitt wird beschrieben, wie Ihre Web-App PlayReady-Hardware-DRM verwenden kann und wie Sie Hardware-DRM deaktivieren, wenn der geschützte Inhalt es nicht unterstützt.
Um PlayReady-Hardware-DRM zu verwenden, sollte Ihre JavaScript-Web-App die isTypeSupported EME-Methode mit einem Schlüsselsystembezeichner verwenden, um com.microsoft.playready.hardware
die PlayReady-Hardware-DRM-Unterstützung aus dem Browser abzufragen.
Gelegentlich werden einige Inhalte im Hardware-DRM nicht unterstützt. Cocktail-Inhalte werden nie im Hardware-DRM unterstützt; Wenn Sie Cocktailinhalte wiedergeben möchten, müssen Sie das Hardware-DRM deaktivieren. Einige Hardware-DRM unterstützen HEVC und einige werden nicht; Wenn Sie HEVC-Inhalte wiedergeben möchten und das Hardware-DRM es nicht unterstützt, sollten Sie sich ebenfalls abmelden.
Hinweis
Verwenden Sie nach der Instanziierung com.microsoft.playready
die PlayReadyStatics.CheckSupportedHardware-Methode , um festzustellen, ob HEVC-Inhalt unterstützt wird.
Hinzufügen eines sicheren Stopps zu Ihrer Web-App
In diesem Abschnitt wird beschrieben, wie Sie Ihrer Web-App sicheres Beenden hinzufügen.
Secure Stop stellt die Mittel für ein PlayReady-Gerät bereit, um einen Medienstreamingdienst sicher zu bestätigen, dass die Medienwiedergabe für einen bestimmten Teil von Inhalten beendet wurde. Diese Funktion stellt sicher, dass Ihre Medienstreamingdienste genaue Erzwingung und Berichterstellung von Nutzungseinschränkungen auf verschiedenen Geräten für ein bestimmtes Konto bereitstellen.
Es gibt zwei primäre Szenarien zum Senden einer Herausforderung für sicheres Beenden:
- Wenn die Medienpräsentation beendet wird, weil das Ende des Inhalts erreicht wurde oder wenn der Benutzer die Medienpräsentation an einer beliebigen Stelle in der Mitte beendet hat.
- Wenn die vorherige Sitzung unerwartet endet (z. B. aufgrund eines System- oder App-Absturzes). Die App muss entweder beim Starten oder Herunterfahren nach herausragenden Sitzungen für sicheres Beenden abfragen und Abfrage(en) getrennt von jeder anderen Medienwiedergabe senden.
In den folgenden Verfahren wird beschrieben, wie Sie den sicheren Stopp für verschiedene Szenarien einrichten.
So richten Sie den sicheren Stopp für ein normales Ende einer Präsentation ein:
- Registrieren Sie das onEnded-Ereignis, bevor die Wiedergabe gestartet wird.
- Der onEnded-Ereignishandler muss vom Video-/Audioelementobjekt aufrufen
removeAttribute("src")
, um die Quelle auf NULL festzulegen, wodurch die Medien foundation ausgelöst wird, um die Topologie zu zerreißen, die Entschlüsselung(n) zu zerstören und den Stoppzustand festzulegen. - Sie können die CDM-Sitzung für sicheres Beenden innerhalb des Handlers starten, um die Abfrage zum sicheren Beenden an den Server zu senden, um die Wiedergabe zu benachrichtigen, die Wiedergabe wurde zu diesem Zeitpunkt beendet, kann aber auch später ausgeführt werden.
So richten Sie den sicheren Stopp ein, wenn der Benutzer von der Seite weg navigiert oder die Registerkarte oder den Browser schließt:
- Es ist keine App-Aktion erforderlich, um den Stoppstatus aufzuzeichnen. sie wird für Sie aufgezeichnet.
So richten Sie den sicheren Stopp für benutzerdefinierte Seitensteuerelemente oder Benutzeraktionen ein (z. B. benutzerdefinierte Navigationsschaltflächen oder starten eine neue Präsentation, bevor die aktuelle Präsentation abgeschlossen wurde):
- Wenn eine benutzerdefinierte Benutzeraktion auftritt, muss die App die Quelle auf NULL festlegen, wodurch die Medienstiftung ausgelöst wird, um die Topologie zu zerreißen, die Entschlüsseler zu zerstören und den Stoppzustand festzulegen.
Im folgenden Beispiel wird die Verwendung des sicheren Beendens in Ihrer Web-App veranschaulicht:
// JavaScript source code
var g_prkey = null;
var g_keySession = null;
var g_fUseSpecificSecureStopSessionID = false;
var g_encodedMeteringCert = 'Base64 encoded of your metering cert (aka publisher cert)';
// Note: g_encodedLASessionId is the CDM session ID of the proactive or reactive license acquisition
// that we want to initiate the secure stop process.
var g_encodedLASessionId = null;
function main()
{
...
g_prkey = new MSMediaKeys("com.microsoft.playready");
...
// add 'onended' event handler to the video element
// Assume 'myvideo' is the ID of the video element
var videoElement = document.getElementById("myvideo");
videoElement.onended = function (e) {
//
// Calling removeAttribute("src") will set the source to null
// which will trigger the MF to tear down the topology, destroy the
// decryptor(s) and set the stop state. This is required in order
// to set the stop state.
//
videoElement.removeAttribute("src");
videoElement.load();
onEndOfStream();
};
}
function onEndOfStream()
{
...
createSecureStopCDMSession();
...
}
function createSecureStopCDMSession()
{
try{
var targetMediaCodec = "video/mp4";
var customData = "my custom data";
var encodedSessionId = g_encodedLASessionId;
if( !g_fUseSpecificSecureStopSessionID )
{
// Use "*" (wildcard) as the session ID to include all secure stop sessions
// TODO: base64 encode "*" and place encoded result to encodedSessionId
}
var int8ArrayCDMdata = formatSecureStopCDMData( encodedSessionId, customData, g_encodedMeteringCert );
var emptyArrayofInitData = new Uint8Array();
g_keySession = g_prkey.createSession(targetMediaCodec, emptyArrayofInitData, int8ArrayCDMdata);
addPlayreadyKeyEventHandler();
} catch( e )
{
// TODO: Handle exception
}
}
function addPlayreadyKeyEventHandler()
{
// add 'keymessage' eventhandler
g_keySession.addEventListener('mskeymessage', function (event) {
// TODO: Get the keyMessage from event.message.buffer which contains the secure stop challenge
// The keyMessage format for the secure stop is similar to LA as below:
//
// <PlayReadyKeyMessage type="SecureStop" >
// <SecureStop version="1.0" >
// <Challenge encoding="base64encoded">
// secure stop challenge
// </Challenge>
// <HttpHeaders>
// <HttpHeader>
// <name>Content-Type</name>
// <value>"content type data"</value>
// </HttpHeader>
// <HttpHeader>
// <name>SOAPAction</name>
// <value>soap action</value>
// </HttpHeader>
// ....
// </HttpHeaders>
// </SecureStop>
// </PlayReadyKeyMessage>
// TODO: send the secure stop challenge to a server that handles the secure stop challenge
// TODO: Receive and response and call event.target.Update() to process the response
});
// add 'keyerror' eventhandler
g_keySession.addEventListener('mskeyerror', function (event) {
var session = event.target;
...
session.close();
});
// add 'keyadded' eventhandler
g_keySession.addEventListener('mskeyadded', function (event) {
var session = event.target;
...
session.close();
});
}
/**
* desc@ formatSecureStopCDMData
* generate playready CDMData
* CDMData is in xml format:
* <PlayReadyCDMData type="SecureStop">
* <SecureStop version="1.0">
* <SessionID>B64 encoded session ID</SessionID>
* <CustomData>B64 encoded custom data</CustomData>
* <ServerCert>B64 encoded server cert</ServerCert>
* </SecureCert>
* </PlayReadyCDMData>
*/
function formatSecureStopCDMData(encodedSessionId, customData, encodedPublisherCert)
{
var encodedCustomData = null;
// TODO: base64 encode the custom data and place the encoded result to encodedCustomData
var CDMDataStr = "<PlayReadyCDMData type=\"SecureStop\">" +
"<SecureStop version=\"1.0\" >" +
"<SessionID>" + encodedSessionId + "</SessionID>" +
"<CustomData>" + encodedCustomData + "</CustomData>" +
"<ServerCert>" + encodedPublisherCert + "</ServerCert>" +
"</SecureStop></PlayReadyCDMData>";
var int8ArrayCDMdata = null
// TODO: Convert CDMDataStr to Uint8 byte array and palce the converted result to int8ArrayCDMdata
return int8ArrayCDMdata;
}
Hinweis
Die oben <SessionID>B64 encoded session ID</SessionID>
aufgeführten Daten für sicheres Beenden können ein Sternchen (*) sein, bei dem es sich um eine Platzkarte für alle aufgezeichneten Sitzungen für sicheres Beenden handelt. Das heißt, das SessionID-Tag kann eine bestimmte Sitzung oder ein Platzhalter (*) sein, um alle Sitzungen für sicheres Beenden auszuwählen.
Überlegungen zur Programmierung für verschlüsselte Medienerweiterungen
In diesem Abschnitt werden die Programmierüberlegungen aufgeführt, die Sie beim Erstellen Ihrer PlayReady-fähigen Web-App für Windows 10 berücksichtigen sollten.
Die von Ihrer App erstellten MSMediaKeys - und MSMediaKeySession-Objekte müssen lebendig bleiben, bis ihre App geschlossen wird. Eine Möglichkeit, sicherzustellen, dass diese Objekte lebendig bleiben, besteht darin, sie als globale Variablen zuzuweisen (die Variablen würden außerhalb des Gültigkeitsbereichs und unterliegen der Garbage Collection, wenn sie als lokale Variable innerhalb einer Funktion deklariert werden). Im folgenden Beispiel werden beispielsweise die Variablen g_msMediaKeys und g_mediaKeySession als globale Variablen zugewiesen, die dann den MSMediaKeys- und MSMediaKeySession-Objekten in der Funktion zugewiesen werden.
var g_msMediaKeys;
var g_mediaKeySession;
function foo() {
...
g_msMediaKeys = new MSMediaKeys("com.microsoft.playready");
...
g_mediaKeySession = g_msMediaKeys.createSession("video/mp4", intiData, null);
g_mediaKeySession.addEventListener(this.KEYMESSAGE_EVENT, function (e)
{
...
downloadPlayReadyKey(url, keyMessage, function (data)
{
g_mediaKeySession.update(data);
});
});
g_mediaKeySession.addEventListener(this.KEYADDED_EVENT, function ()
{
...
g_mediaKeySession.close();
g_mediaKeySession = null;
});
}
Weitere Informationen finden Sie in den Beispielanwendungen.