Korumalı içerik iş akışını anlama

Flash Player 10.1 ve üstü, Adobe AIR 2.0 ve üstü

Önemli : Flash Player 11.5 ve üzeri, Adobe Access modülü ile entegre olur, böylece güncelleme adımına ( SystemUpdater.update(SystemUpdaterType.DRM) öğesinin çağrılmasına) gerek kalmaz. Bu aşağıdaki tarayıcıları ve platformları içerir:

  • Intel işlemcilerde çalışan Windows 8'deki Internet Explorer haricindeki tüm platformlar için Flash Player 11.5 ActiveX denetimi

  • Tüm tarayıcılar için Flash Player 11.5 eklentisi

  • Adobe AIR (masaüstü ve mobil)

Bu, aşağıdaki durumlar için güncelleme adımının hala gerekli olduğu anlamına gelir:

  • Intel işlemcilerde çalışan Windows 8'de Internet Explorer

  • Flash Player 11.4 ve altı, Google Chrome 22 ve üstü (tüm platformlar) veya 21 ve üstü (Windows) hariç

Not: Flash Player 11.5 veya üstüne sahip bir sistemde yine de güvenli şekilde SystemUpdater.update(SystemUpdaterType.DRM) öğesini çağırabilirsiniz, ancak hiçbir öğe indirilmez.

Aşağıdaki yüksek seviyeli iş akışı, bir uygulamanın korumalı içeriği nasıl alacağını ve oynatacağını gösterir. İş akışı, uygulamanın özellikle Adobe Access tarafından korunan içeriği oynatmak için tasarlandığını varsayar:

  1. İçerik meta verilerini alın.

  2. Gerekirse Flash Player güncellemelerini işleyin.

  3. Yerel olarak bir lisansın mevcut olup olmadığını kontrol edin. Mevcutsa, yükleyin ve adım 7’ye gidin. Mevcut değilse, adım 4’e gidin.

  4. Kimlik doğrulamanın gerekli olup olmadığını kontrol edin. Gerekmiyorsa, adım 7’ye gidebilirsiniz.

  5. Kimlik doğrulama gerekiyorsa, kullanıcıdan kimlik doğrulama bilgilerini alın ve lisans sunucusuna aktarın.

  6. Etki alanı kaydı gerekirse etki alanına girin (AIR 3.0 ve daha üstü).

  7. Kimlik doğrulama başarılı olduğunda, sunucudan lisansı indirin.

  8. İçeriği oynatın.

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.

Kullanıcının çevrimdışı erişime yetkisi varsa, makbuz ön belleğe alınır ve şifrelenmiş içerik kullanıcının makinesine indirilir. İçerik, lisansı önbelleğe alma süresinde 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.

Not: Makbuzların önbelleğe alınması ve ön yüklemesi AIR ve Flash Player tarafından desteklenir. Bununla birlikte, şifrelenmiş içeriğin indirilmesi ve depolanması yalnızca AIR'de desteklenir.

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 konusunda bilgilendirmeli ve alternatif bir öneri sunmalı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ışı, Adobe Access tarafından korunan içeriğin oynatılmasında kullanılan özel API'leri anlatmaktadır.

  1. Bir URLLoader nesnesini kullanarak, korumalı içeriğin meta veri dosyasının baytlarını yükleyin. Bu nesneyi metadata_bytes gibi bir değişkene ayarlayın.

    Adobe Access tarafından kontrol edilen tüm içerik Adobe Access meta verilerine sahiptir. İçerik paketlendiğinde, bu meta veriler içerikle birlikte ayrı bir meta veri dosyası (.metadata) olarak kaydedilebilir. Daha fazla bilgi için Adobe Access belgelerine bakın.

  2. Bir DRMContentData örneği oluşturun. Bu kodu bir try-catch bloğuna yerleştirin:

    new DRMContentData( metadata_bytes )

    burada metadata_bytes adım 1’de elde edilen URLLoader nesnesidir.

  3. (Yalnızca Flash Player) Çalışma zamanı Adobe Access modülünün olup olmadığını kontrol eder. Bulunmazsa, DRMErrorEvent hata kodu 3344 veya DRMErrorEvent hata kodu 3343 ile bir IllegalOperationError öğesi gönderilir.

    Bu hatayı düzeltmek için SystemUpdater API'sini kullanarak Adobe Access modülünü indirin. Bu modül indirildikten sonra, SystemUpdater nesnesi bir COMPLETE olayı gönderir. Bu olay için, bu olay gönderildiğinde adım 2’ye dönen bir olay dinleyici ekleyin. Aşağıdaki kod bu adımları gösterir:

    flash.system.SystemUpdater.addEventListener(Event.COMPLETE, updateCompleteHandler); 
    flash.system.SystemUpdater.update(flash.system.SystemUpdaterType.DRM)
    private function updateCompleteHandler (event:Event):void { 
        /*redo step 2*/ 
        drmContentData = new DRMContentData(metadata_bytes); 
    } 

    Oynatıcının kendisinin güncellenmesi gerekiyorsa, bir durum olayı gönderilir. Bu olayın işlenmesi hakkında daha fazla bilgi edinmek için bkz. Bir güncelleme olayını dinleme .

    Not: AIR uygulamalarında, AIR yükleyicisi Adobe Access modülünün güncellemesini ve gerekli çalışma zamanı güncellemelerini yapar.
  4. DRMManager nesnesinden gönderilen DRMStatusEvent ve DRMErrorEvent öğesini dinlemek için dinleyiciler oluşturun:

    DRMManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus); 
    DRMManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError);

    DRMStatusEvent dinleyicisinde, makbuzun geçerli olup olmadığını (null değerinde olmadığını) kontrol edin. DRMErrorEvent dinleyicisinde, DRMErrorEvents öğesini ele alın. Bkz. DRMStatusEvent sınıfını kullanma ve DRMErrorEvent sınıfını kullanma .

  5. İçeriği oynatmak için gereken makbuzu (lisansı) yükleyin.

    İlk olarak, içeriği oynatmak için yerel olarak depolanmış bir lisans yüklemeyi deneyin:

    DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.LOCAL_ONLY)

    Yükleme tamamlandıktan sonra, DRMManager nesnesi DRMStatusEvent.DRM_Status öğesini gönderir.

  6. DRMVoucher nesnesi null değerinde değilse, makbuz geçerlidir. Adım 13'e atlayın.

  7. DRMVoucher null değerindeyse, bu içerik için ilkelerin gerektirdiği kimlik doğrulama yöntemini kontrol edin. DRMContentData.authenticationMethod özelliğini kullanın.

  8. Kimlik doğrulama yöntemi ANONYMOUS ise adım 13’e gidin.

  9. Kimlik doğrulama yöntemi USERNAME_AND_PASSWORD ise, uygulamanız, kullanıcının bilgilerini girebilmesine izin verecek bir mekanizmaya sahip olmalıdır. Kullanıcının kimlik doğrulamasını yapmak için lisans sunucusuna kimlik bilgilerini aktarın:

    DRMManager.authenticate(metadata.serverURL, metadata.domain, username, password)

    DRMManager, kimlik doğrulama başarısız olursa DRMAuthenticationErrorEvent olayını, kimlik doğrulama başarılı olursa DRMAuthenticationCompleteEvent olayını gönderir. Bu olaylar için dinleyiciler oluşturun.

  10. Doğrulama yöntemi UNKNOWN ise, özel bir doğrulama yöntemi kullanılmalıdır. Bu durumda içerik sağlayıcı, doğrulamanın ActionScript 3.0 API'leri kullanmadan bant dışı bir yolla yapılmasını sağlar. Özel doğrulama yordamı, DRMManager.setAuthenticationToken() yöntemine geçirilebilen bir doğrulama simgesi oluşturmalıdır.

  11. Kimlik doğrulama başarısız olursa, uygulamanız adım 9’a dönmelidir. Uygulamanızın kimlik doğrulama hatalarını işleyecek ve tekrarını sınırlayacak bir mekanizmaya sahip olduğundan emin olun. Örneğin, üç girişimin ardından kullanıcıya kimlik doğrulamanın başarısız olduğunu ve içeriğin gösterilemeyeceğini belirten bir mesaj görüntülenir.

  12. Kullanıcının bilgilerini girmesini istemek yerine saklanmış işareti kullanmak için, işareti DRMManager.setAuthenticationToken() yöntemiyle ayarlayın. Ardından lisans sunucusundan lisansı indirin ve içeriği Adım 8’deki gibi oynatın.

  13. (isteğe bağlı) Kimlik doğrulama başarılı olursa, önbelleğe alınmış bir bayt dizisi olan kimlik doğrulama işaretini yakalayabilirsiniz. Bu işareti DRMAuthenticationCompleteEvent.token özelliğiyle alın. Kullanıcının bu içeriğe ait kimlik bilgilerini tekrar tekrar girmesine gerek kalmaması için kimlik doğrulama işaretini saklayıp kullanabilirsiniz. Bu lisans sunucusu, kimlik doğrulama işaretinin geçerlilik süresini belirler.

  14. Kimlik doğrulama başarılı olduğunda, lisans sunucusundan lisansı indirin:

    DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.FORCE_REFRESH)

    Yükleme tamamlandıktan sonra, DRMManager nesnesi DRMStatusEvent.DRM_STATUS olayını gönderir. Bu olayı dinleyin; gönderildiğinde, içeriği oynatabilirsiniz.

  15. Bir NetStream nesnesi oluşturup ardından play() yöntemini çağırarak videoyu oynatın:

    stream = new NetStream(connection); 
    stream.addEventListener(DRMStatusEvent.DRM _STATUS, drmStatusHandler); 
    stream.addEventListener(DRMErrorEvent.DRM_ERROR, drmErrorHandler); 
    stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
    stream.client = new CustomClient(); 
    video.attachNetStream(stream); 
    stream.play(videoURL); 

DRMContentData ve session nesneleri

DRMContentData oluşturulduğunda Flash Player DRM modülüne ilişkin bir session nesnesi kullanılır. Bu DRMContentData öğesini alan tüm DRMManager API'leri bu belirli DRM modülünü kullanır. Bununla birlikte, DRMContentData öğesini kullanmayan 2 DRMManager API'si vardır. Bu kurallar şunlardır:
  1. authenticate()

  2. setAuthenticationToken()

İlişkili DRMContentData olmadığından, bu DRMManager API'leri çağırıldığında diskteki en yeni DRM modülü kullanılır. DRM modülünün güncellenmesi, uygulamanın DRM iş akışının ortasında gerçekleşirse bu bir problem haline gelebilir. Aşağıdaki senaryoyu göz önünde bulundurun:
  1. Uygulama, AdobeCP1 öğesini DRM modülü olarak kullanan bir DRMContentData nesnesi contentData1 oluşturur.

  2. Uygulama, DRMManager.authenticate(contentData1.serverURL,...) yöntemini çağırır.

  3. Uygulama, DRMManager.loadVoucher(contentData1, ...) yöntemini çağırır.

Uygulama 2. adıma geçmeden önce DRM modülü güncellemesi olursa, bu durumda DRMManager.authenticate() yöntemi, kimlik doğrulamayı AdobeCP2 öğesini DRM modülü olarak kullanarak gerçekleştirir. 3. adımda loadVoucher() yöntemi, DRM modülü olarak AdobeCP1 öğesini kullanmaya devam ettiğinden hata verir. Güncelleme, DRM modülü güncellemesini çağıran başka bir uygulama nedeniyle gerçekleşmiş olabilir. Uygulama başlangıcında DRM modülünü çağırarak bu senaryodan kaçınabilirsiniz.

DRM ile ilgili olaylar

Bir uygulama korumalı içeriği oynatmaya çalıştığında, çalışma zamanı çok sayıda olay gönderir:

  • DRMManager tarafından gönderilen DRMDeviceGroupErrorEvent (yalnızca AIR)

  • NetStream tarafından gönderilen DRMAuthenticateEvent (sadece AIR)

  • DRMManager tarafından gönderilen DRMAuthenticationCompleteEvent

  • DRMManager tarafından gönderilen DRMAuthenticationErrorEvent

  • NetStream ve DRMManager tarafından gönderilen DRMErrorEvent

  • NetStream ve DRMManager tarafından gönderilen DRMStatusEvent

  • StatusEvent

  • NetStatusEvent. Bkz. Bir güncelleme olayını dinleme

Adobe Access tarafından korunan içeriği desteklemek üzere DRM olaylarını işleyecek olay dinleyicilerini ekleyin.

Çevrimdışı oynatma için makbuzları önceden yükleme

Adobe Access tarafından korunan içeriği oynatmak için gereken makbuzları (lisansları) önceden yükleyebilirsiniz. Önceden yüklenmiş makbuzlar kullanıcıların etkin İnternet bağlantıları olmasa da içeriği görüntüleyebilmelerine izin verir. (Ö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ı kullanma

Aşağıdaki adımlar korumalı bir medya dosyası makbuzunu, bir DRMContentData nesnesi kullanarak önceden yüklemeye yönelik iş akışını açıklar.

  1. Paketlenmiş içeriğe ait ikili meta verileri alın. Adobe Access Java Referans Paketleyicisi kullanılıyorsa, bu meta veri dosyası otomatik olarak .metadata uzantısıyla oluşturulur. Örneğin bu meta verileri URLLoader sınıfını kullanarak indirebilirsiniz.

  2. Yapıcı işlevine meta verileri geçirerek bir DRMContentData nesnesi oluşturun:

    var drmData:DRMContentData = new DRMContentData( metadata );
  3. Geri kalan adımlar, Korumalı içerik iş akışını anlama bölümünde anlatılan iş akışıyla aynıdır.

preloadEmbeddedMetadata() kullanma

Aşağıdaki adımlar, preloadEmbeddedMetadata() öğesini kullanan DRM korumalı bir medya dosyası makbuzunu önceden yüklemeye ilişkin iş akışını açıklar:

  1. Medya dosyasını indirin ve saklayın. (DRM meta verileri yalnızca yerel olarak depolanmış dosyalardan önceden yüklenebilir.)

  2. NetStream istemci nesnesinin onDRMContentData() ve onPlayStatus() geri çağırma işlevleri için uygulamaları sağlayarak NetConnection ve NetStream nesnelerini oluşturun.

  3. Bir NetStreamPlayOptions nesnesi oluşturun ve stream özelliğini yerel medya dosyasının URL'sine ayarlayın.

  4. Ayrıştırılacak medya dosyasını tanımlayan NetStreamPlayOptions nesnesini aktaran NetStream preloadEmbeddedMetadata() yöntemini çağırın.

  5. Medya dosyası DRM meta verileri içeriyorsa, onDRMContentData() geri çağırma işlevi çağrılır. Meta veriler bu işleve bir DRMContentData nesnesi olarak aktarılır.

  6. DRMManager loadVoucher() yöntemini kullanarak makbuzu elde etmek için DRMContentData nesnesini kullanın.

    DRMContentData nesnesine ait authenticationMethod özelliğinin değeri flash.net.drm.AuthenticationMethod.USERNAME_AND_PASSWORD ise, kullanıcıyı makbuzu yüklemeden önce medya hakları sunucusundan doğrulayın. DRMContentData nesnesinin serverURL ve domain özellikleri, kullanıcının kimlik bilgileriyle birlikte DRMManager authenticate() yöntemine aktarılabilir.

  7. Dosya ayrıştırma tamamlandığında onPlayStatus() geri çağırma işlevi çağrılır. onDRMContentData() işlevi çağrılmadıysa, dosya makbuzu almak için gerekli olan meta verileri içermez. Bu eksik çağrı büyük ihtimalle Adobe Access'in bu dosyayı korumadığı anlamına da gelir.

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(); 
    } 
} 
}