了解受保护的内容工作流程Flash Player 10.1 和更高版本,Adobe AIR 2.0 和更高版本 以下高级工作流程显示应用程序如何检索并播放受保护的内容。该工作流程假设应用程序专门设计用于播放受 Flash Access 保护的内容:
如果未出错并且成功授权用户查看内容,NetStream 对象将调度 DRMStatusEvent 对象。应用程序将开始回放。DRMStatusEvent 对象保留相关凭证信息,这些信息用于标识用户的策略和权限。例如,将保留有关是否可以脱机使用内容或许可证何时到期的信息。应用程序可以使用此数据来通知用户其策略的状态。例如,应用程序可在状态栏上显示用户可以观看相应内容的剩余天数。 (仅限 AIR)如果允许用户脱机访问,则将缓存凭证,并且将加密的内容下载到用户的计算机上。在脱机租用期间定义的持续时间内可以访问该内容。事件中的 detail 属性包含"DRM.voucherObtained"。应用程序决定内容的本地存储位置,以使内容可脱机使用。您还可以使用 DRMManager 类预加载凭证。 所有与 DRM 相关的错误都会导致应用程序调度 DRMErrorEvent 事件对象,或者在 AIR 中调度 DRMAuthenticationErrorEvent 对象。应用程序负责显式处理所有其他错误事件。这些事件包括以下情况:用户输入有效凭据,但是保护加密内容的凭证限制对内容的访问。例如,如果未针对权限支付费用,已经过身份验证的用户将无法访问该内容。当同一发布者的两个注册成员试图共享仅其中一人付费的内容时,也可能发生这种情况。应用程序应通知用户该错误,并提供替代建议。典型的替代建议是提供有关如何注册查看权限并进行付费的说明。 详细的 API 工作流程此工作流程提供了保护内容工作流程的更详细视图。此工作流程介绍了用于播放受 Flash Access 保护的内容的特定 API。
与 DRM 相关的事件应用程序尝试播放保护的内容时,运行时会调度许多事件:
要支持 Flash Access 保护的内容,请添加处理 DRM 事件的事件侦听器。 预加载用于脱机播放的凭证您可以预加载播放 Flash Access 保护的内容所需的凭证(许可证)。通过预加载的凭证,无论是否有活动的 Internet 连接,用户都可以查看内容。(预加载过程本身需要 Internet 连接。)您可以使用 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(); } } } |
|