Korumalı içerik iş akışını anlamaFlash Player 10.1 ve üstü, Adobe AIR 2.0 ve üstü Aşağıdaki yüksek seviyeli iş akışı, bir uygulamanın korumalı içeriği nasıl alacağını ve oynatacağını göstermektedir. İş akışı, uygulamanın özellikle Flash Access tarafından korunan içeriği oynatmak için tasarlandığını varsayar:
Hata oluşmadıysa ve kullanıcı içeriği görüntülemek için başarılı bir şekilde yetkilendirildiyse, NetStream nesnesi bir DRMStatusEvent nesnesi gönderir. Ardından uygulama içeriği oynatmaya başlar. DRMStatusEvent nesnesi ilgili makbuz bilgilerini saklar, bu bilgiler kullanıcı politika ve izinlerini tanımlar. Örneğin, içeriğin çevrimdışı kullanılabilir hale getirilip getirilmediğini veya lisansın ne zaman sona ereceği ile ilgili bilgileri tutar. Uygulama, kullanıcıya politikasının durumunu bildirmek için bu bilgileri kullanabilir. Örneğin uygulama, kullanıcının içeriği görebileceği kaç günü kaldığını bir durum çubuğunda gösterebilir. (Yalnızca AIR) Kullanıcının çevrimdışı erişim yetkisi varsa, makbuz önbelleğe alınır ve şifrelenmiş içerik kullanıcının makinesine indirilir. İçerik, çevrimdışı üyelik döneminde belirlenen süre boyunca erişilebilir hale getirilir. Olaydaki detail özelliği "DRM.voucherObtained" içerir. Uygulama, çevrimdışıyken de erişebilmesi için içeriğin yerel olarak nerede saklanacağına karar verir. DRMManager sınıfını kullanarak da makbuzları önceden yükleyebilirsiniz. DRM ile ilgili tüm hatalar, uygulamanın bit DRMErrorEvent olay nesnesi veya AIR’de DRMAuthenticationErrorEvent nesnesi göndermesiyle sonuçlanır. Diğer tüm hata olaylarını açıkça işlemek uygulamanın sorumluluğundadır. Bu olaylar arasında, kullanıcının geçerli kimlik bilgilerini girdiği, ancak makbuzun şifreli içeriği koruyarak içeriğe erişimi kısıtladığı durumlar da bulunmaktadır. Örneğin, erişim haklarının ödemesi yapılmadıysa kimlik doğrulaması yapılmış bir kullanıcı içeriğe erişemez. Bu durum ayrıca aynı yayıncının iki kayıtlı üyesi, yalnızca bir tanesinin ödeme yaptığı bir içeriği paylaşmak istediklerinde de gerçekleşebilir. Uygulama kullanıcıyı hata hakkında uyarmalı ve alternatif bir öneri sağlamalıdır. Tipik bir alternatif öneri, hakları görmek için nasıl kayıt olunacağını ve ödeme yapılacağını belirten talimatlardır. Ayrıntılı API iş akışıBu iş akışı, korumalı içerik iş akışına yönelik daha ayrıntılı bir görünüm sağlamaktadır. Bu iş akışı, Flash Access tarafından korunan içeriğin oynatılmasında kullanılan özel API’leri açıklamaktadır.
DRM ile ilgili olaylarBir uygulama korumalı içeriği oynatmaya çalıştığında, çalışma zamanı çok sayıda olay gönderir:
Flash Access tarafından korunan içeriği desteklemek için, DRM olaylarını işleyecek olay dinleyicileri ekleyin. Çevrimdışı oynatma için makbuzları önceden yüklemeFlash Access tarafından korunan içeriği oynatmak için gereken makbuzları (lisansları) önceden yükleyebilirsiniz. Önceden yüklenen makbuzlar kullanıcıların etkin Internet bağlantısı olsa da olmasa da içeriği görüntüleyebilmelerini sağlar. (Ön yükleme işleminin kendisi de bir İnternet bağlantısı gerektirir.) Makbuzları önceden yüklemek için NetStream sınıfı preloadEmbeddedMetadata() yöntemini ve DRMManager sınıfını kullanabilirsiniz. AIR 2.0 ve üstünde, makbuzları önceden doğrudan yüklemek için bir DRMContentData nesnesi kullanabilirsiniz. Bu teknik, DRMContentData nesnesini içerikten bağımsız olarak güncellemenize imkan verdiği için tercih edilir. (preloadEmbeddedData() yöntemi, içerikten DRMContentData’yı getirir.) DRMContentData’yı kullanmaAşağıdaki adımlar, bir DRMContentData nesnesi kullanarak korumalı bir medya dosyası için makbuzu önceden yüklemeye yönelik iş akışını anlatmaktadır.
preloadEmbeddedMetadata() kullanmaAşağıdaki adımlar, preloadEmbeddedMetadata() kullanan DRM korumalı bir medya dosyasına için makbuzu önceden yüklemeye ilişkin iş akışını açıklar():
Aşağıdaki AIR kod örneği, yerel bir medya dosyası için makbuzunun nasıl önceden yükleneceğini gösterir: 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();
}
}
}
|
|