Förstå arbetsflödet för skyddat innehåll

Flash Player 10.1 och senare, Adobe AIR 2.0 och senare

Följande arbetsflöde på hög nivå beskriver hur ett program kan hämta och spela upp skyddat innehåll. För det här arbetsflödet förutsätts det att programmet utformas särskilt för uppspelning av innehåll som skyddas av Flash Access:

  1. Hämta innehållets metadata.

  2. Hantera uppdateringar av Flash Player, vid behov.

  3. Kontrollera om det finns en licens lokalt tillgänglig. Om det finns en licens läser du in den och går vidare till steg 7. Om det inte gör det går du till steg 4.

  4. Kontrollera om autentisering krävs. Om det inte gör det går du vidare till steg 7.

  5. Om autentisering krävs måste inloggningsuppgifterna hämtas från användaren och skickas till licensservern.

  6. När autentiseringen har slutförts kan licensen hämtas från servern.

  7. Spela upp innehållet.

Om inget fel inträffar och användaren autentiserades för att se innehållet, skickar NetStream-objektet ett DRMStatusEvent-objekt. Programmet påbörjar då uppspelningen. DRMStatusEvent-objektet innehåller relaterad voucherinformation, som identifierar användarens policy och behörigheter. Till exempel innehåller det information om innehållet kan göras tillgängligt offline eller när licensen upphör. Programmet kan använda data för att informera användaren om statusen för policyn. Programmet kan till exempel visa i statusfältet hur många dagar till som användaren kan visa innehållet.

(Endast AIR) Om användaren tillåts åtkomst offline cachelagras vouchern och det krypterade innehållet laddas ner till användarens dator. Innehållet är tillgängligt under den period som angivits för offlineuthyrningsperioden. Egenskapen detail i händelsen innehåller "DRM.voucherObtained". Programmet avgör var innehållet ska sparas lokalt för att kunna visas offline. Du kan även förhandsladda en voucher med klassen DRMManager.

Vid DRM-relaterade fel skickar programmet ett DRMErrorEvent-händelseobjekt, eller i AIR, ett DRMAuthenticationErrorEvent-objekt. Programmet sköter alla andra felhändelser explicit. Dessa händelser omfattar fall där användaren anger giltiga inloggningsuppgifter, men där åtkomsten till innehållet begränsas av vouchern som skyddar det krypterade innehållet. En autentiserad användare kan till exempel inte få åtkomst till innehållet om denne inte har betalat för rättigheterna. Detta kan också inträffa när två användare, som båda är registrerade medlemmar hos samma utgivare, försöker att dela innehåll som bara en av dem har betalat för. Programmet bör informera användaren om felet och presentera ett alternativ. Ett vanligt alternativ är att ge användaren information om hur han/hon registrerar sig och betalar för att få visa innehåll.

Utförligt API-arbetsflöde

Det här arbetsflödet ger en mer utförlig beskrivning av arbetsflödet för skyddat innehåll. Det här arbetsflödet beskriver de specifika API:er som används för att spela upp innehåll som skyddas av Flash Access.

  1. Läs in de byte som hör till filen för det skyddade innehållets metadata med ett URLLoader-objekt. Ange en variabel för objektet, till exempel metadata_bytes.

    Allt innehåll som kontrolleras av Flash Access har Flash Access-metadata. När innehållet packas kan dessa metadata sparas som en separat metadata-fil (.metadata) tillsammans med innehållet. Mer information finns i dokumentationen för Flash Access.

  2. Skapa en DRMContentData-instans. Lägg den här koden i ett try-catch-block:

    new DRMContentData(metadata_bytes)

    där metadata_bytes är URLLoader-objektet som fås i steg 1.

  3. (Endast Flash Player) Körningen kontrollerar att Flash Access-modulen finns. Om den inte hittas genereras felet IllegalOperationError med felkoden 3344.

    Hantera felet genom att hämta Flash Access-modulen med programmeringsgränssnittet SystemUpdater. När modulen har hämtats skickar SystemUpdater-objektet en COMPLETE-händelse. Inkludera en händelseavlyssnare för den här händelsen som går tillbaka till steg 2 när händelsen skickas. Följande kod visar de här stegen:

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

    Om själva spelaren måste uppdateras skickas en status-händelse. Mer information om hur du hanterar den här händelsen finns i Lyssna efter en uppdateringshändelse.

    Obs! I AIR-program hanterar AIR-installationsprogrammet uppdateringen av Flash Access-modulen och de uppdateringar av körningsversionen som behövs.
  4. Skapa avlyssnare som lyssnar efter DRMStatusEvent och DRMErrorEvent som skickas från DRMManager-objektet:

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

    Kontrollera att vouchern är giltig (inte null) i DRMStatusEvent-avlyssnaren. Hantera DRMErrorEvents i DRMErrorEvent-avlyssnaren. Se Använda klassen DRMStatusEvent och Använda klassen DRMErrorEvent.

  5. Läs in vouchern (licensen) som krävs för uppspelning av innehållet.

    Försök först att läsa in en lokalt sparad licens för att spela upp innehållet:

    DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.LOCAL_ONLY)

    När inläsningen är slutförd skickar DRMManager-objektet DRMStatusEvent.DRM_Status.

  6. Om DRMVoucher-objektet inte är null är vouchern giltig. Gå till steg 13.

  7. Om DRMVoucher-objektet är null kontrollerar du autentiseringsmetoden som krävs av innehållets policy. Använd egenskapen DRMContentData.authenticationMethod.

  8. Om autentiseringsmetoden är ANONYMOUS går du vidare till steg 13.

  9. Om autentiseringsmetoden är USERNAME_AND_PASSWORD måste programmet kunna tillhandahålla en funktion som låter användaren ange inloggningsuppgifter. Skicka dessa inloggningsuppgifter till licensservern för autentisering av användaren:

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

    DRMManager skickar en DRMAuthenticationErrorEvent om autentiseringen misslyckas eller en DRMAuthenticationCompleteEvent om autentiseringen lyckas. Skapa avlyssnare för dessa händelser.

  10. Om autentiseringen misslyckas måste programmet återgå till steg 9. Kontrollera att programmet har en funktion för att hantera och begränsa upprepade autentiseringsförsök. Det kan till exempel vara ett meddelande som visas efter tre misslyckade försök och som anger att autentiseringen misslyckades och att innehållet inte kan spelas upp.

  11. Om autentiseringen lyckas hämtas licensen från servern.

    DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.FORCE_REFRESH)

    När inläsningen är slutförd skickar DRMManager-objektet DRMStatusEvent.DRM_STATUS. Lyssna efter den här händelsen, när den skickas går det att spela upp innehållet.

  12. (Valfritt) Om autentiseringen lyckas kan du hämta in en autentiseringstoken, vilket utgörs av en cachelagrad bytearray i minnet. Hämta denna token med egenskapen DRMAuthenticationCompleteEvent.token. Det går att lagra och använda en autentiseringstoken så att användaren inte behöver ange sina inloggningsuppgifter flera gånger för samma innehåll. Licensservern avgör giltighetsperioden för denna autentiseringstoken.

    Om du vill använda en lagrad token istället för att fråga användaren om inloggningsuppgifter anger du en token med metoden DRMManager.setAuthenticationToken(). Hämta sedan licensen från licensservern och spela upp innehållet som i steg 8.

  13. Spela upp videofilmen genom att skapa ett NetStream-objekt och anropa sedan dess play()-metod:

    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-relaterade händelser

I körningen skickas flera händelser när ett program försöker att spela upp skyddat innehåll:

  • DRMAuthenticateEvent (endast AIR), skickas av NetStream

  • DRMAuthenticationCompleteEvent, skickas av DRMManager

  • DRMAuthenticationErrorEvent, skickas av DRMManager

  • DRMErrorEvent, skickas av NetStream och DRMManager

  • DRMStatusEvent, skickas av NetStream och DRMManager

  • StatusEvent

  • NetStatusEvent. Se Lyssna efter en uppdateringshändelse

Om du vill ha stöd för innehåll skyddat av Flash Access lägger du till händelseavlyssnare för hantering av DRM-händelserna.

Läsa in vouchers i förväg för uppspelning offline

Du kan ladda voucher (licens) i förväg som krävs för uppspelning av innehåll som skyddas av Flash Access. Med en förladdad voucher kan användarna visa innehållet även om de inte har en aktiv Internetanslutning. (För själva förladdningen krävs dock en Internetanslutning.) Du kan använda metoden preloadEmbeddedMetadata() i NetStream-klassen och DRMManager-klassen för att ladda en voucher i förväg. I AIR 2.0 och senare kan du använda ett DRMContentData-objekt om du vill ladda en voucher. Den här metoden är att föredra eftersom den låter dig uppdatera DRMContentData-objektet oberoende av innehållet. (Metoden preloadEmbeddedData() hämtar DRMContentData från innehållet.)

Använda DRMContentData

Följande steg beskriver hur du läser in vouchern för en skyddad mediefil i förväg med ett DRMContentData-objekt.

  1. Hämta binära metadata för det packade innehållet. Om du använder referenspaketeraren för Java i Flash Access genereras denna metadatafil automatiskt med filtillägget .metadata. Du skulle till exempel kunna hämta dessa metadata med klassen URLLoader.

  2. Skapa ett DRMContentData-objekt och skicka metadata till konstruktorfunktionen:

    var drmData:DRMContentData = new DRMContentData( metadata );
  3. Resten av stegen är identiska med arbetsflödet som beskrivs i Förstå arbetsflödet för skyddat innehåll.

Använda preloadEmbeddedMetadata()

Följande steg beskriver hur du läser in vouchern för en DRM-skyddad mediefil i förväg med preloadEmbeddedMetadata():

  1. Hämta och lagra mediefilen. (DRM-metadata kan bara läsas in i förväg från filer som är lagrade på den lokala datorn.)

  2. Skapa objekten NetConnection och NetStream, och ange implementeringar för callback-funktionerna onDRMContentData() och onPlayStatus() för NetStream client-objektet.

  3. Skapa ett NetStreamPlayOptions-objekt och associera egenskapen stream med den lokala mediefilens URL.

  4. Anropa preloadEmbeddedMetadata()-metoden i NetStream-klassen och ange NetStreamPlayOptions-objektet som identifierar den mediefil som ska tolkas.

  5. Om mediefilen innehåller DRM-metadata anropas callback-funktionen onDRMContentData(). Metadata skickas till den här funktionen som ett DRMContentData-objekt.

  6. Använd objektet DRMContentData för att erhålla vouchern med hjälp av loadVoucher()-metoden för DRMManager-objektet.

    Om egenskapen authenticationMethod för objektet DRMContentData har värdet userNameAndPassword autentiserar du användaren på mediarättighetsservern innan vouchern läses in. Egenskaperna serverURL och domain i DRMContentData-objektet kan överföras till authenticate()-metoden i DRMManager, tillsammans med användarens autentiseringsuppgifter.

  7. Callback-funktionen onPlayStatus() anropas när filtolkningen är slutförd. Om onDRMContentData()-funktionen inte har anropats innehåller filen inte de metadata som krävs för att få en voucher. Det saknade anropet kan också medföra att Flash Access inte skyddar den här filen.

Följande kodexempel för AIR illustrerar hur du läser in en voucher för en lokal mediefil i förväg:

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