Aspectos básicos del flujo de trabajo de contenido protegidoFlash Player 10.1 y posterior, Adobe AIR 2.0 y posterior El siguiente flujo de trabajo de alto nivel muestra cómo una aplicación puede recuperar y reproducir contenido protegido. El flujo de trabajo asume que la aplicación está diseñada específicamente para reproducir contenido protegido con Flash Access:
Si no se produce ningún error y se autoriza correctamente al usuario a ver el contenido, el objeto NetStream distribuye un objeto DRMStatusEvent. La aplicación comienza a reproducirse después. El objeto DRMStatusEvent contiene la información de la licencia asociada, que identifica la póliza del usuario y sus permisos. Por ejemplo, contiene información relacionada con si el contenido puede verse sin conexión o cuándo caduca la licencia. La aplicación puede aprovechar estos datos para informar al usuario del estado de su póliza. Por ejemplo: la aplicación puede mostrar en una barra de estado el número de días restantes para que el usuario pueda ver el contenido. (Sólo AIR) Si el usuario tiene permiso para acceder sin conexión, la licencia se guarda en caché y el contenido cifrado se descarga en el equipo del usuario. El contenido está accesible en la duración definida en el periodo de cesión sin conexión. La propiedad detail del evento contiene "DRM.voucherObtained". La aplicación decide dónde guardar el contenido en el equipo para tenerlo a disposición fuera de línea. También se puede realizar la carga previa de licencias mediante la clase DRMManager. Todos los errores relacionados con DRM hacen que la aplicación distribuya un objeto DRMErrorEvent o, en AIR, un objeto DRMAuthenticationErrorEvent. Es responsabilidad de la aplicación gestionar de forma explícita todos los demás eventos de error. Estos eventos incluyen casos en que el usuario introduce credenciales válidas pero la licencia que protege el contenido cifrado limita el acceso al contenido. Por ejemplo, un usuario autenticado no puede acceder al contenido si no ha pagado por los derechos. Este caso también puede darse si dos miembros registrados del mismo editor intentan compartir contenido por el que solo uno de ellos ha pagado. La aplicación debería informar al usuario sobre el error y ofrecer una sugerencia como alternativa. Una alternativa habitual es ofrecer instrucciones para registrarse y pagar por los derechos de visionado. Flujo de trabajo detallado de la APIEste flujo de trabajo ofrece una vista más detallada del flujo de trabajo de contenido protegido. Este flujo de trabajo describe las API específicas utilizadas para reproducir contenido protegido con Flash Access.
Eventos relacionados con DRMEl motor de ejecución distribuye varios eventos cuando una aplicación intenta reproducir contenido protegido:
Para admitir contenido protegido con Flash Access, añada detectores de eventos para controlar los eventos DRM. Precarga de licencias para reproducción sin conexiónPuede precargar las licencias necesarias para reproducir contenido protegido con Flash Access. Las licencias precargadas permiten a los usuarios ver el contenido tengan o no una conexión a Internet. (El propio proceso de carga previa requiere una conexión a Internet.) Puede utilizar el método preloadEmbeddedMetadata() de la clase NetStream y la clase DRMManager para precargar licencias. En AIR 2.0 y posterior, puede utilizar un objeto DRMContentData para precargar licencias directamente. Es preferible usar esta técnica, ya que permite actualizar el objeto DRMContentData independientemente del contenido. (El método preloadEmbeddedData() obtiene un objeto DRMContentData del contenido.) Uso de DRMContentDataEn los siguientes pasos se describe el flujo de trabajo para precargar la licencia de un archivo multimedia protegido mediante un objeto DRMContentData.
Uso de preloadEmbeddedMetadata()Los siguientes pasos describen el flujo de trabajo para realizar la carga previa de la licencia para un archivo multimedia protegido por DRM usando preloadEmbeddedMetadata():
El siguiente ejemplo de código para AIR muestra cómo precargar una licencia para un archivo multimedia 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();
}
}
}
|
|