Entendendo o fluxo de trabalho de conteúdo protegido.Flash Player 10.1 e posterior, Adobe AIR 2.0 e posterior O fluxo de trabalho de alto nível a seguir mostra como um aplicativo pode recuperar e reproduzir conteúdo protegido. O fluxo de trabalho assume que o aplicativo é projetado para reproduzir especificamente conteúdo protegido pelo Flash Access:
Se não tiver ocorrido nenhum erro e o usuário foi autorizado com êxito a exibir o conteúdo, o objeto NetStream enviará um objeto DRMStatusEvent. O aplicativo inicia a reprodução. O objeto DRMStatusEvent guarda as informações de voucher relacionadas, que identificam a política e as permissões do usuário. Por exemplo, ele possui informações sobre se o conteúdo pode ser disponibilizado offline ou quando a licença expira. O aplicativo pode usar esses dados para informar ao usuário sobre o status de sua política. Por exemplo, o aplicativo pode exibir o número de dias restantes que o usuário possui para exibir o conteúdo em uma barra de status. (Apenas no AIR) Se o usuário pode acessar conteúdo offline, o voucher é armazenado e o conteúdo criptografado é baixado para a máquina do usuário. O conteúdo é disponibilizado pela duração definida no período de concessão offline. A propriedade detail no evento contém "DRM.voucherObtained". O aplicativo decide onde armazenar o conteúdo localmente para que ele esteja disponível off-line. Você também pode pré-carregar vouchers usando a classe DRMManager. Todos os erros relacionados ao DRM resultam em no envio de um objeto de evento DRMErrorEvent pelo aplicativo ou em um objeto DRMAuthenticationErrorEvent do AIR. É responsabilidade do aplicativo tratar diretamente de todos os outros eventos de erro. Estes eventos incluem casos nos quais o usuário insere credenciais válidas, mas o voucher que protege o conteúdo criptografado restringe o acesso ao conteúdo. Por exemplo, um usuário autenticado não pode acessar o conteúdo se os direitos não estiverem pagos. Este caso também pode ocorrer quando dois integrantes registrados do mesmo provedor tentar compartilhar conteúdo adquirido somente por um deles. O aplicativo deve informar o usuário sobre o erro e fornecer uma sugestão alternativa. Uma sugestão alternativa comum são as instruções sobre como registrar e pagar por direitos de visualização. Fluxo de trabalho detalhadoEste fluxo de trabalho fornece uma visão mais detalhada do fluxo de trabalho do conteúdo protegido. Este fluxo de trabalho descreve as APIs especificas utilizadas para reproduzir conteúdo protegido pelo Flash Access.
Eventos relacionados ao DRMO tempo de execução envia vários eventos quando um aplicativo tenta reproduzir conteúdo protegido:
Para dar suporte a conteúdo protegido pelo Flash Access, adicione ouvintes de eventos para manipular eventos de DRM. Pré-carregar vouchers para reprodução offlineVocê pode pré-carregar os vouchers (licenças) necessários para reproduzir conteúdo protegido pelo Flash Access. Vouchers pré-carregados permitem que os usuários vejam o conteúdo com ou sem conexão à Internet. (O processo de pré-carregamento propriamente dito requer conexão com Internet.) Use o método preloadEmbeddedMetadata() da classe NetStream e a classe DRMManager do para pré-carregar vouchers. No AIR 2.0 e posteriores, você pode utilizar um objeto DRMContentData para pré-carregar vouchers diretamente. Esta técnica tem preferência porque permite a atualização do objeto DRMContentData independentemente do conteúdo. (O método preloadEmbeddedData() extrai DRMContentData do conteúdo.) Utilizando DRMContentDataOs passos a seguir descrevem o fluxo de trabalho para pré-carregar o voucher para um arquivo de mídia protegido utilizando um objeto DRMContentData.
Utilizando preloadEmbeddedMetadata()As etapas a seguir descrevem o fluxo de trabalho para pré-carregar o voucher de um arquivo de mídia protegido por DRM utilizando preloadEmbeddedMetadata():
O exemplo de código para o AIR a seguir ilustra como pré-carregar um voucher para um arquivo de mídia local: 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();
}
}
}
|
|