瞭解保護的內容工作流程Flash Player 10.1 以及更新的版本,Adobe AIR 2.0 以及更新的版本 下列高階工作流程顯示應用程式如何擷取和播放保護的內容。這個工作流程假設應用程式特別設計成播放 Flash Access 保護的內容:
如果未發生錯誤,而且使用者已獲授權檢視內容,NetStream 物件就會傳送 DRMStatusEvent 物件。應用程式就會開始播放。DRMStatusEvent 物件保存了相關的憑證資訊,以識別使用者的原則和權限。例如,它保留的資訊是關於內容是否可以離線使用或授權何時到期。應用程式可以利用這份資料,告知使用者其原則的狀態。例如,應用程式可在狀態列上顯示使用者仍能檢視內容的剩餘天數。 (僅限 AIR) 如果允許使用者進行離線存取,則會快取憑證,而且會將加密的內容下載至使用者的機器。因此,可以在離線租用期間定義的持續時間存取內容。事件的 detail 屬性會包含 "DRM.voucherObtained"。應用程式會決定要在本機何處儲存內容以供離線檢視。您也可以使用 DRMManager 類別預先載入憑證。 與 DRM 相關的所有錯誤,都會導致應用程式傳送 DRMErrorEvent 事件物件或 DRMAuthenticationErrorEvent 物件 (在 AIR 中)。應用程式必須負責明確處理所有其他錯誤事件。其中包括使用者已輸入有效的憑證 (Credential),但保護加密內容的憑證 (Voucher) 卻限制其存取內容。例如,如果尚未付費以取得權限,則驗證的使用者無法存取內容。當同一發行者的兩位註冊會員,嘗試共用只有一位會員付費的內容時,也會發生同樣的情形。應用程式應該通知發生錯誤的使用者,並提供其他解決方法的建議。典型的解決方法建議是提供如何註冊及付費取得檢視權限的指示。 詳細的 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(); } } } |
|