保護されたコンテンツのワークフローについてFlash Player 10.1 以降、Adobe AIR 2.0 以降 次の高レベルなワークフローは、保護されたコンテンツをアプリケーションが取得して再生する方法を示しています。ワークフローでは、Flash Access によって保護されたコンテンツを再生するようにアプリケーションが設計されていることが前提です。
エラーが発生せず、ユーザーがコンテンツの表示を許可された場合は、NetStream オブジェクトが DRMStatusEvent オブジェクトを送出します。その後、アプリケーションが再生を開始します。DRMStatusEvent オブジェクトは、関連する証明書の情報を保持し、それによってユーザーのポリシーと権限を識別します。例えば、コンテンツをオフラインで利用できるようにするかどうかや、ライセンスの有効期限に関する情報を保持します。アプリケーションは、このデータを使用してユーザーにポリシーのステータスを通知します。例えば、アプリケーションは、コンテンツをユーザーが表示できる残りの日数をステータスバーに表示できます。 (AIRのみ)ユーザーにオフラインアクセスが許可される場合、証明書がキャッシュされ、暗号化されたコンテンツがユーザーのマシンにダウンロードされます。コンテンツは、オフラインのリース期間として定義される間はアクセス可能になります。イベントの detailプロパティには、「DRM.voucherObtained」が含まれます。アプリケーションは、オフラインでコンテンツを使用できるようにするために、コンテンツをローカルに格納する場所を決定します。DRMManager クラスを使用して証明書を事前に読み込むこともできます。 DRM 関連のすべてのエラーでは、アプリケーションが DRMErrorEvent イベントオブジェクトを送出し、AIR では DRMAuthenticationErrorEvent オブジェクトを送出します。他のすべてのエラーイベントを明示的に処理する責務はアプリケーション側にあります。このイベントには、ユーザーが有効な資格情報を入力した場合が含まれますが、暗号化されたコンテンツを保護する証明書はコンテンツに対するアクセスを制限します。例えば、認証されたユーザーは、権利に対して支払いが済んでいない場合、コンテンツにアクセスすることはできません。また、同じ発行者による 2 人の登録メンバーのうち 1 人しか支払いを済ませていないコンテンツを、その 2 人が共有しようとするような場合も、このイベントが発生します。アプリケーションがユーザーに対してエラーを通知し、代替手段を提示する必要があります。一般的な代替手段として、表示する権利の登録およびその権利に対する支払いの方法について説明することが挙げられます。 詳細な API ワークフローこのワークフローでは、保護されたコンテンツのワークフローをより詳細に示します。このワークフローは、Flash Access によって保護されたコンテンツを再生するために使用される特定の API を示しています。
DRM 関連イベント保護されたコンテンツの再生をアプリケーションが試みたときに、ランタイムは次に示す多数のイベントを送出します。
Flash Access によって保護されるコンテンツをサポートするために、DRM イベントを処理するイベントリスナーを追加します。 オフライン再生用の証明書の事前読み込みFlash Access によって保護されているコンテンツの再生に必要な証明書(ライセンス)を事前に読み込むことができます。証明書を事前に読み込むことにより、ユーザーは、アクティブなインターネット接続の有無にかかわらず、コンテンツを表示できるようになります(ただし、事前読み込みのプロセスではインターネット接続が必要です)。証明書を事前に読み込むには、NetStream クラスの preloadEmbeddedMetadata() メソッドと、DRMManager クラスを使用します。AIR 2.0 以降では、DRMContentData オブジェクトを使用して証明書を事前に直接読み込むことができます。このテクニックがお勧めなのは、コンテンツとは無関係に DRMContentData オブジェクトを更新できるためです(preloadEmbeddedData() メソッドはコンテンツから DRMContentData をフェッチします)。 DRMContentData の使用次の手順は、DRMContentData オブジェクトを使用して、保護されたメディアファイルに対して証明書を事前に読み込むためのワークフローを示しています。
preloadEmbeddedMetadata() の使用次の手順では、preloadEmbeddedMetadata() を使用して、DRM で保護されたメディアファイルの証明書を事前に読み込むためのワークフローを示します。
例えば、次の AIR 用のコードは、ローカルのメディアファイルの 証明書を事前に読み込む方法を示しています。 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();
}
}
}
|
|