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

Flash 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:

  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. Kimlik doğrulama başarılı olduğunda, sunucudan lisansı indirin.

  7. İç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.

(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.

  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.

    Flash Access tarafından kontrol edilen tüm içerik Flash 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, Flash 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ı Flash Access modülünün olup olmadığını kontrol eder. Yoksa, 3344 hata kodlu bir IllegalOperationError verilir.

    Bu hatayı işlemek için SystemUpdater API'sini kullanarak Flash 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 Flash 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. 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.

  11. 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.

  12. (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.

    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. 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); 

DRM ile ilgili olaylar

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

  • 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

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ükleme

Flash 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ı kullanma

Aş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.

  1. Paketlenmiş içeriğe ait ikili meta verileri alın. Flash 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() kullanan DRM korumalı bir medya dosyasına için makbuzu ö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 saklanan 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 userNameAndPassword olduğunda, makbuzu yüklemeden önce medya hakları sunucusundaki kullanıcının kimlik doğrulamasını yapı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 Flash 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(); 
    } 
} 
}