Wichtig
: In Flash Player 11.5 und höheren Versionen ist das Adobe Access-Modul bereits enthalten, sodass der Updateschritt (Aufrufen von
SystemUpdater.update(SystemUpdaterType.DRM)
) nicht erforderlich ist. Dies schließt die folgenden Browser und Plattformen ein:
-
Flash Player 11.5 ActiveX-Steuerelement, für alle Plattformen außer Internet Explorer unter Windows 8 mit Intel-Prozessoren
-
Flash Player 11.5-Plug-In, für alle Browser
-
Adobe AIR (Desktop und Mobil)
Dies bedeutet, dass der Updateschritt in den folgenden Fällen
weiterhin erforderlich ist
:
-
Internet Explorer unter Windows 8 mit Intel-Prozessoren
-
Flash Player 11.4 und älter, außer mit Google Chrome 22 und höher (alle Plattformen) oder 21 und höher (Windows)
Hinweis:
Es treten keine Probleme auf, wenn Sie
SystemUpdater.update(SystemUpdaterType.DRM)
in einem System mit Flash Player 11.5 oder höher aufrufen, es wird jedoch nichts heruntergeladen.
Im Folgenden wird in groben Zügen der Arbeitsablauf beschrieben, mit dem eine Anwendung geschützten Inhalt abrufen und wiedergeben kann. Bei diesem Arbeitsablauf wird davon ausgegangen, dass das Design der Anwendung das Abspielen von Inhalt, der durch Adobe Access geschützt wird, explizit ermöglicht.
-
Die Metadaten des Inhalts werden abgerufen.
-
Bei Bedarf wird Flash Player aktualisiert.
-
Es wird überprüft, ob eine Lizenz lokal verfügbar ist. Wenn ja, wird die Lizenz geladen und der Arbeitsablauf wird bei Schritt 7 fortgesetzt. Andernfalls wird der Arbeitsablauf bei Schritt 4 fortgesetzt.
-
Es wird überprüft, ob eine Authentifizierung erforderlich ist. Ist dies nicht der Fall, können Sie mit Schritt 7 fortfahren.
-
Wenn eine Authentifizierung erforderlich ist, werden die Authentifizierungsdaten vom Benutzer abgefragt und an den Lizenzserver übergeben.
-
Wenn die Domänenregistrierung erforderlich ist, treten Sie der Domäne bei (AIR 3.0 und höher).
-
Nach erfolgreicher Authentifizierung wird die Lizenz vom Server heruntergeladen.
-
Der Inhalt wird wiedergegeben.
Wenn kein Fehler auftritt und der Benutzer erfolgreich autorisiert wurde, die Inhalte anzuzeigen, löst das NetStream-Objekt ein DRMStatusEvent-Objekt aus. Dann beginnt die Anwendung mit der Wiedergabe. Das DRMStatusEvent-Objekt enthält die Gutscheininformationen, in denen die Richtlinien und Berechtigungen des Benutzers angezeigt werden. Beispielsweise definieren die Informationen in diesem Objekt, ob der Inhalt offline angezeigt werden kann und wie lange die Lizenz gültig ist. Die Anwendung kann diese Daten verwenden, um den Benutzer über den Status der Richtlinien zu informieren. Beispielsweise kann die Anwendung in einer Statusleiste die Anzahl der Tage anzeigen, die für die Ansicht der Inhalte verbleiben.
Wenn der Benutzer zum Offline-Zugriff berechtigt ist, wird der Gutschein zwischengespeichert und der verschlüsselte Inhalt wird auf das Gerät des Benutzers heruntergeladen. Der Inhalt ist so lange verfügbar, wie im Lizenz-Cache-Zeitraum angegeben. Die
detail
-Eigenschaft im Ereignis enthält die Angabe
DRM.voucherObtained
. Die Anwendung entscheidet, ob der Inhalt lokal gespeichert werden soll, damit er offline verfügbar ist. Sie können Gutscheine auch mit der DRMManager-Klasse vorausladen.
Hinweis:
Das Zwischenspeichern und Vorausladen von Gutscheinen wird sowohl in AIR als auch in Flash Player unterstützt. Das Herunterladen und Speichern von verschlüsselten Inhalten wird jedoch nur in AIR unterstützt.
Die Anwendung ist dafür zuständig, die Fehlerereignisse explizit zu verarbeiten. Zu diesen Ereignissen zählen auch Fälle, in denen der Benutzer gültige Informationen eingegeben hat, der Gutschein, durch den die verschlüsselten Inhalte geschützt werden, jedoch den Zugriff auf die Inhalte einschränkt. Beispielsweise kann ein authentifizierter Benutzer nicht auf Inhalte zugreifen, wenn die anfallenden Gebühren nicht entrichtet wurden. Dieser Fall kann auch dann eintreten, wenn zwei Benutzer, die beide beim selben Herausgeber registriert sind, versuchen, Inhalte gemeinsam zu verwenden, für die nur ein Mitglied gezahlt hat. Die Anwendung muss den Benutzer über den Fehler informieren und eine Alternative anbieten. Eine typische Alternative umfasst Anleitungen dazu, wie der Benutzer sich registrieren und für die Anzeigeberechtigung zahlen kann.
Ausführlicher API-Arbeitsablauf
Im Folgenden wird der Arbeitsablauf für geschützte Inhalte ausführlicher beschrieben. Dabei werden auch die APIs vorgestellt, die für die Wiedergabe von durch Adobe Access geschützten Inhalten verwendet werden.
-
Verwenden Sie ein URLLoader-Objekt, um die Bytes der Metadaten-Datei des geschützten Inhalts zu laden. Stellen Sie dieses Objekt auf eine Variable ein, wie beispielsweise
metadata_bytes
.
Alle von Adobe Access kontrollierten Inhalte verfügen über Adobe Access-Metadaten. Wenn der Inhalt verpackt wird, können diese Metadaten als separate Datei (.metadata) mit dem Inhalt gespeichert werden. Weitere Informationen finden Sie in der Dokumentation zu Adobe Access.
-
Erstellen Sie eine DRMContentData-Instanz. Fügen Sie diesen Code in einen try-catch-Block ein:
new DRMContentData(
metadata_bytes
)
Dabei ist
metadata_bytes
das URLLoader-Objekt aus Schritt 1.
-
(Nur Flash Player) Die Laufzeit sucht das Adobe Access-Modul. Falls es nicht gefunden wird, wird ein IllegalOperationError mit DRMErrorEvent-Fehlercode 3344 oder DRMErrorEvent-Fehlercode 3343 ausgegeben.
Zur Verarbeitung dieses Fehlers laden Sie das Adobe Access-Modul über die SystemUpdater-API herunter. Nachdem dieses Modul heruntergeladen wurde, löst das SystemUpdater-Objekt ein COMPLETE-Ereignis aus. Fügen Sie einen Ereignis-Listener für dieses Ereignis ein, mit dem der Arbeitsablauf zu Schritt 2 zurückkehrt, wenn dieses Ereignis ausgelöst wird. Diese Schritte werden im folgenden Codebeispiel gezeigt:
flash.system.SystemUpdater.addEventListener(Event.COMPLETE, updateCompleteHandler);
flash.system.SystemUpdater.update(flash.system.SystemUpdaterType.DRM)
private function updateCompleteHandler (event:Event):void {
/*redo step 2*/
drmContentData = new DRMContentData(metadata_bytes);
}
Wenn der Player selbst aktualisiert werden muss, wird ein Statusereignis ausgelöst. Weitere Informationen zur Verarbeitung dieses Ereignisses finden Sie unter
Warten auf ein Aktualisierungsereignis
.
Hinweis:
In AIR-Anwendungen ist das AIR-Installationsprogramm für die Aktualisierung des Adobe Access-Moduls und die erforderlichen Laufzeitaktualisierungen zuständig.
-
Erstellen Sie Listener, die auf die vom DRMManager-Objekt ausgelösten DRMStatusEvent- und DRMErrorEvent-Ereignisse warten:
DRMManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus);
DRMManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError);
Stellen Sie im DRMStatusEvent-Listener sicher, dass der Gutschein gültig (nicht null) ist. Verarbeiten Sie im DRMErrorEvent-Listener die DRMErrorEvents-Ereignisse. Einzelheiten finden Sie unter
Verwenden der DRMStatusEvent-Klasse
und
Verwenden der DRMErrorEvent-Klasse
.
-
Laden Sie den Gutschein (Lizenz) zum Abspielen des Inhalts.
Versuchen Sie zunächst, eine lokal gespeicherte Lizenz zu laden:
DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.LOCAL_ONLY)
Nach abgeschlossenem Ladevorgang löst das DRMManager-Objekt ein
DRMStatusEvent.DRM_Status
-Ereignis aus.
-
Wenn das DRMVoucher-Objekt nicht null ist, ist der Gutschein gültig. Fahren Sie mit Schritt 13 fort.
-
Wenn das DRMVoucher-Objekt null ist, überprüfen Sie die Authentifizierungsmethode, die die Richtlinie für diesen Inhalt vorgibt. Verwenden Sie die
DRMContentData.authenticationMethod
-Eigenschaft.
-
Wenn die Authentifizierungsmethode
ANONYMOUS
ist, fahren Sie mit Schritt 13 fort.
-
Bei der Authentifizierungsmethode
USERNAME_AND_PASSWORD
muss die Anwendung einen Mechanismus bereitstellen, über den der Benutzer seine Anmeldedaten eingeben kann. Übergeben Sie diese Anmeldedaten an den Lizenzserver, um den Benutzer zu authentifizieren:
DRMManager.authenticate(metadata.serverURL, metadata.domain, username, password)
Das DRMManager-Objekt löst ein
DRMAuthenticationErrorEvent
-Ereignis aus, wenn die Authentifizierung fehlschlägt, bzw. ein
DRMAuthenticationCompleteEvent
-Ereignis, wenn die Authentifizierung erfolgreich ist. Erstellen Sie Listener für diese Ereignisse.
-
Wenn die Authentifizierungsmethode
UNKNOWN
ist, muss eine benutzerdefinierte Authentifizierungsmethode verwendet werden. In diesem Fall hat der Content-Provider vorgesehen, dass die Authentifizierung auf eine Out-of-Band-Weise erfolgt, indem die ActionScript 3.0-APIs nicht verwendet werden. Das benutzerdefinierte Authentifizierungsverfahren muss ein Authentifizierungstoken erzeugen, das an die
DRMManager.setAuthenticationToken()
-Methode übergeben werden kann.
-
Wenn die Authentifizierung fehlschlägt, muss die Anwendung zu Schritt 9 zurückkehren. Ihre Anwendung sollte einen Mechanismus enthalten, der wiederholte Authentifizierungsfehler verarbeitet und einschränkt. Beispielsweise kann nach drei Versuchen eine Meldung eingeblendet werden, die dem Benutzer mitteilt, dass die Authentifizierung erfolglos war und der Inhalt deshalb nicht abgespielt werden kann.
-
Wenn Sie das gespeicherte Token verwenden möchten, anstatt den Benutzer zur Eingabe seiner Anmeldedaten aufzufordern, geben Sie das Token mit der
DRMManager.setAuthenticationToken()
-Methode an. Dann laden Sie die Lizenz vom Lizenzserver herunter und spielen den Inhalt ab, wie in Schritt 8.
-
(Optional) Wenn die Authentifizierung erfolgreich ist, können Sie das Authentifizierungstoken erfassen. Dies ist ein im Arbeitsspeicher zwischengespeichertes Byte-Array. Rufen Sie dieses Token mit der
DRMAuthenticationCompleteEvent.token
-Eigenschaft ab. Sie können das Authentifizierungstoken speichern, damit der Benutzer seine Anmeldedaten für diesen Inhalt nicht mehrfach eingeben muss. Der Lizenzserver bestimmt den Gültigkeitszeitraum des Authentifizierungstokens.
-
Bei erfolgreicher Authentifizierung laden Sie die Lizenz vom Lizenzserver herunter.
DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.FORCE_REFRESH)
Nach abgeschlossenem Ladevorgang löst das DRMManager-Objekt ein DRMStatusEvent.DRM_STATUS-Ereignis aus. Warten Sie auf dieses Ereignis. Wenn es ausgelöst wird, kann der Inhalt wiedergegeben werden.
-
Spielen Sie das Video ab, indem Sie ein NetStream-Objekt erstellen und dann seine
play()
-Methode aufrufen:
stream = new NetStream(connection);
stream.addEventListener(DRMStatusEvent.DRM _STATUS, drmStatusHandler);
stream.addEventListener(DRMErrorEvent.DRM_ERROR, drmErrorHandler);
stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
stream.client = new CustomClient();
video.attachNetStream(stream);
stream.play(videoURL);
DRMContentData und Sitzungsobjekte
Wenn
DRMContentData
erstellt wird, wird es als Sitzungsobjekt verwendet, das auf das Flash Player DRM-Modul verweist. Alle
DRMManager
-APIs, die diese
DRMContentData
erhalten, verwenden dieses bestimmte DRM-Modul. Es gibt jedoch 2
DRMManager
-APIs, die
DRMContentData
nicht verwenden. Diese sind nachfolgend beschrieben:
-
authenticate()
-
setAuthenticationToken()
Da es kein zugeordnetes
DRMContentData
-Objekt gibt, führt der Aufruf dieser
DRMManager
-APIs dazu, dass das neueste DRM-Modul von der Festplatte verwendet wird. Dies kann problematisch sein, wenn mitten im DRM-Arbeitsablauf der Anwendung eine Aktualisierung des DRM-Moduls erfolgt. Betrachten Sie folgendes Szenario:
-
Die Anwendung erstellt ein
DRMContentData
-Objekt,
contentData1
, das
AdobeCP1
als DRM-Modul verwendet.
-
Die Anwendung ruft die
DRMManager.authenticate(contentData1.serverURL,...)
-Methode auf.
-
Die Anwendung ruft die
DRMManager.loadVoucher(contentData1, ...)
-Methode auf.
Wenn das DRM-Modul aktualisiert wird, bevor die Anwendung Schritt 2 erreicht, verwendet die
DRMManager.authenticate()
-Methode
AdobeCP2
als DRM-Modul für die Authentifizierung. Die
loadVoucher()
-Methode in Schritt 3 schlägt fehl, da sie immer noch
AdobeCP1
als DRM-Modul verwendet. Die Aktualisierung kann erfolgt sein, weil eine andere Anwendung die DRM-Modul-Aktualisierung aufgerufen hat. Sie können dies vermeiden, indem Sie die DRM-Modul-Aktualisierung beim Starten der Anwendung aufrufen.
DRM-Ereignisse
Die Laufzeit löst zahlreiche Ereignisse aus, wenn eine Anwendung versucht, geschützten Inhalt wiederzugeben:
-
DRMDeviceGroupErrorEvent (nur AIR), abgesetzt von DRMManager
-
DRMAuthenticateEvent (nur AIR), von NetStream ausgelöst
-
DRMAuthenticationCompleteEvent, von DRMManager ausgelöst
-
DRMAuthenticationErrorEvent, von DRMManager ausgelöst
-
DRMErrorEvent, von NetStream und DRMManager ausgelöst
-
DRMStatusEvent, von NetStream und DRMManager ausgelöst
-
StatusEvent
-
NetStatusEvent. Siehe
Warten auf ein Aktualisierungsereignis
.
Zur Unterstützung von Inhalten, die durch Adobe Access geschützt sind, fügen Sie Ereignis-Listener zur Verarbeitung der DRM-Ereignisse hinzu.
Vorausladen von Gutscheinen für die Offlinewiedergabe
Sie können die Gutscheine (Lizenzen), die zum Abspielen von durch Adobe Access geschützten Inhalten erforderlich sind, im Voraus laden. Mithilfe von im Voraus geladenen Gutscheinen können Benutzer Inhalte anzeigen, auch wenn sie keine aktive Internetverbindung haben. (Für das Vorausladen selbst ist jedoch eine Internetverbindung erforderlich.) Zum Vorausladen von Gutscheinen können Sie die
preloadEmbeddedMetadata()
-Methode der NetStream-Klasse und die DRMManager-Klasse verwenden. In AIR 2.0 und höher können Sie ein DRMContentData-Objekt verwenden, um Gutscheine direkt im Voraus zu laden. Diese Technik ist vorzuziehen, da das DRMContentData-Objekt unabhängig vom Inhalt aktualisiert werden kann. (Die
preloadEmbeddedData()
-Methode ruft DRMContentData aus dem Inhalt ab.)
Verwenden von DRMContentData
Im Folgenden wird der Arbeitsablauf zum Vorausladen des Gutscheins für eine geschützte Mediendatei mithilfe eines DRMContentData-Objekts beschrieben.
-
Rufen Sie die binären Metadaten für den verpackten Inhalt ab. Bei Verwendung des Adobe Access Java Reference Packager wird diese Metadaten-Datei automatisch mit der
.metadata
-Erweiterung erstellt. Sie können diese Metadaten beispielsweise mit der URLLoader-Klasse herunterladen.
-
Erstellen Sie ein DRMContentData-Objekt und übergeben Sie die Metadaten an die Konstruktorfunktion:
var drmData:DRMContentData = new DRMContentData( metadata );
-
Die restlichen Arbeitsschritte sind mit dem Arbeitsablauf identisch, der unter
Arbeitsablauf für geschützte Inhalte
beschrieben wird.
Verwenden von preloadEmbeddedMetadata()
Die folgenden Schritte beschreiben den Arbeitsablauf beim Vorausladen des Gutscheins für eine DRM-geschützte Mediendatei mithilfe von
preloadEmbeddedMetadata()
:
-
Laden Sie die Mediendatei herunter und speichern Sie sie. (DRM-Metadaten können nur aus lokal gespeicherten Dateien vorausgeladen werden.)
-
Erstellen Sie die NetConnection- und NetStream-Objekte und stellen Sie Implementierungen für die
onDRMContentData()
- und
onPlayStatus()
-Rückruffunktionen des NetStream-Clientobjekts bereit.
-
Erstellen Sie ein NetStreamPlayOptions-Objekt und stellen Sie die
stream
-Eigenschaft auf die URL der lokalen Mediendatei ein.
-
Rufen Sie die NetStream-Methode
preloadEmbeddedMetadata()
auf und übergeben Sie dabei das NetStreamPlayOptions-Objekt, das die zu analysierende Mediendatei angibt.
-
Wenn die Mediendatei DRM-Metadaten enthält, wird die
onDRMContentData()
-Rückruffunktion aufgerufen. Die Metadaten werden als ein DRMContentData-Objekt an diese Funktion übergeben.
-
Verwenden Sie das DRMContentData-Objekt, um den Gutschein mit der
loadVoucher()
-Methode zu erhalten.
Wenn die
authenticationMethod
-Eigenschaft des
DRMContentData
-Objekts den Wert
flash.net.drm.AuthenticationMethod.USERNAME_AND_PASSWORD
hat, authentifizieren Sie den Benutzer auf dem Medienrechteserver, bevor der Gutschein geladen wird. Die Eigenschaften
serverURL
und
domain
des DRMContentData-Objekts können zusammen mit den Anmeldedaten des Benutzers an die
authenticate()
-Methode des DRMManager übergeben werden.
-
Die
onPlayStatus()
-Rückruffunktion wird aufgerufen, wenn das Dateiparsing abgeschlossen ist. Wenn die
onDRMContentData()
-Funktion nicht aufgerufen wurde, enthält die Datei nicht die für den Erhalt eines Gutscheins erforderlichen Metadaten. Dieser fehlende Aufruf kann auch bedeuten, dass diese Datei nicht von Adobe Access geschützt wird.
Im folgenden Beispielcode für AIR wird veranschaulicht, wie ein Gutschein für eine lokale Mediendatei vorausgeladen wird:
package
{
import flash.display.Sprite;
import flash.events.DRMAuthenticationCompleteEvent;
import flash.events.DRMAuthenticationErrorEvent;
import flash.events.DRMErrorEvent;
import flash.ev ents.DRMStatusEvent;
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.net.NetStreamPlayOptions;
import flash.net.drm.AuthenticationMethod;
import flash.net.drm.DRMContentData;
import flash.net.drm.DRMManager;
import flash.net.drm.LoadVoucherSetting;
public class DRMPreloader extends Sprite
{
private var videoURL:String = "app-storage:/video.flv";
private var userName:String = "user";
private var password:String = "password";
private var preloadConnection:NetConnection;
private var preloadStream:NetStream;
private var drmManager:DRMManager = DRMManager.getDRMManager();
private var drmContentData:DRMContentData;
public function DRMPreloader():void {
drmManager.addEventListener(
DRMAuthenticationCompleteEvent.AUTHENTICATION_COMPLETE,
onAuthenticationComplete);
drmManager.addEventListener(DRMAuthenticationErrorEvent.AUTHENTICATION_ERROR,
onAuthenticationError);
drmManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus);
drmManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError);
preloadConnection = new NetConnection();
preloadConnection.addEventListener(NetStatusEvent.NET_STATUS, onConnect);
preloadConnection.connect(null);
}
private function onConnect( event:NetStatusEvent ):void
{
preloadMetadata();
}
private function preloadMetadata():void
{
preloadStream = new NetStream( preloadConnection );
preloadStream.client = this;
var options:NetStreamPlayOptions = new NetStreamPlayOptions();
options.streamName = videoURL;
preloadStream.preloadEmbeddedData( options );
}
public function onDRMContentData( drmMetadata:DRMContentData ):void
{
drmContentData = drmMetadata;
if ( drmMetadata.authenticationMethod == AuthenticationMethod.USERNAME_AND_PASSWORD )
{
authenticateUser();
}
else
{
getVoucher();
}
}
private function getVoucher():void
{
drmManager.loadVoucher( drmContentData, LoadVoucherSetting.ALLOW_SERVER );
}
private function authenticateUser():void
{
drmManager.authenticate( drmContentData.serverURL, drmContentData.domain, userName, password );
}
private function onAuthenticationError( event:DRMAuthenticationErrorEvent ):void
{
trace( "Authentication error: " + event.errorID + ", " + event.subErrorID );
}
private function onAuthenticationComplete( event:DRMAuthenticationCompleteEvent ):void
{
trace( "Authenticated to: " + event.serverURL + ", domain: " + event.domain );
getVoucher();
}
private function onDRMStatus( event:DRMStatusEvent ):void
{
trace( "DRM Status: " + event.detail);
trace("--Voucher allows offline playback = " + event.isAvailableOffline );
trace("--Voucher already cached = " + event.isLocal );
trace("--Voucher required authentication = " + !event.isAnonymous );
}
private function onDRMError( event:DRMErrorEvent ):void
{
trace( "DRM error event: " + event.errorID + ", " + event.subErrorID + ", " + event.text );
}
public function onPlayStatus( info:Object ):void
{
preloadStream.close();
}
}
}
|
|
|