보호된 내용 작업 과정 이해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로 보호된 내용을 재생하는 데 필요한 바우처(라이센스)를 미리 로드할 수 있습니다. 미리 로드된 바우처를 사용하면 사용자가 인터넷에 연결되어 있는지 여부에 관계없이 내용을 볼 수 있습니다. 이때 미리 로드 프로세스 자체에도 인터넷 연결이 필요합니다. 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(); } } } |
|