Arbeitsablauf für geschützte InhalteFlash Player 10.1 und höher, Adobe AIR 2.0 und höher 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 Flash Access geschützt wird, explizit ermöglicht.
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. (Nur AIR) 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 Offline-Lizenzzeitraum 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. Alle DRM-Fehler führen dazu, dass die Anwendung ein DRMErrorEvent-Ereignisobjekt bzw. in AIR ein DRMAuthenticationErrorEvent-Objekt ausgibt. Die Anwendung ist dafür zuständig, alle anderen 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 sollte 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-ArbeitsablaufIm 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 Flash Access geschützten Inhalten verwendet werden.
DRM-EreignisseDie Laufzeit löst zahlreiche Ereignisse aus, wenn eine Anwendung versucht, geschützten Inhalt wiederzugeben:
Zur Unterstützung von Inhalten, die durch Flash Access geschützt sind, fügen Sie Ereignis-Listener zur Verarbeitung der DRM-Ereignisse hinzu. Vorausladen von Gutscheinen für die OfflinewiedergabeSie können die Gutscheine (Lizenzen), die zum Abspielen von durch Flash 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 DRMContentDataIm Folgenden wird der Arbeitsablauf zum Vorausladen des Gutscheins für eine geschützte Mediendatei mithilfe eines DRMContentData-Objekts beschrieben.
Verwenden von preloadEmbeddedMetadata()Die folgenden Schritte beschreiben den Arbeitsablauf beim Vorausladen des Gutscheins für eine DRM-geschützte Mediendatei mithilfe von preloadEmbeddedMetadata():
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();
}
}
}
|
|