Cifrado de assets en Microsoft Azure Media Services con PlayReady

Otro de los trabajos que puede llevar acabo Microsoft Azure Media Services, además de la ingesta, la codificación y la paquetización dinámica ya vistas, es el cifrado de contenido utilizando un servidor de PlayReady externo. Para este post vamos a utilizar Microsoft PlayReady Test Server.

Job de cifrado con PlayReady

        static void Main(string[] args)
        {
            //0. Constants
            const string AssetName = "WOW_Mists_of_Pandaria_H264_Smooth";
            const string AccountName = "[YOUR_ACCOUNT_NAME]";
            const string AccountKey = "[YOUR_ACCOUNT_KEY]";
            //1. Nuget: Install-Package windowsazure.mediaservices
            //2. Create context
            var _context = new CloudMediaContext(AccountName, AccountKey);
            //3. Get asset
            var asset = (from a in _context.Assets
                         where a.Name == AssetName
                         select a).FirstOrDefault();
            //4. Create job
            var job = _context.Jobs.Create(string.Format("{0} - PlayReady Protection", AssetName));
            //5. Get encryptor processor
            var playReadyprocessor = _context.MediaProcessors.Where(p => p.Name == "Windows Azure Media Encryptor").ToList().OrderBy(wame => new Version(wame.Version)).LastOrDefault();
            //6. Get PlayReady configuration
            var configPlayReady = File.ReadAllText("PlayReadyProtection.xml");
            //7. Second task
            var task = job.Tasks.AddNew("PlayReady task",
                playReadyprocessor,
                configPlayReady,
                TaskOptions.ProtectedConfiguration);
            task.InputAssets.Add(asset);
            task.OutputAssets.AddNew(string.Format("{0} protected with PlayReady", AssetName), AssetCreationOptions.None);
            //8. Submit job
            job.StateChanged += StateChanged;
            job.Submit();
            //9. Check job execution and wait for job to finish
            var progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);
            progressJobTask.Wait();
            Console.WriteLine("The job is ended: {0}", job.RunningDuration);
            Console.ReadLine();
        }

Una vez que hemos instalado el SDK y recuperado el contexto, lo primero que necesitamos es recuperar un asset que ya tengamos subido a la plataforma, o bien podemos crear uno nuevo siguiendo los pasos del post Dynamic Packaging en Microsoft Azure Media Services.
Creamos un job a través del contexto y recuperamos el procesador de cifrado que ofrece la plataforma, Windows Azure Media Encryptor. Para saber cuál es el servidor de PlayReady y cómo debe cifrar el contenido, necesitamos un archivo de configuración como el siguiente (PlayReadyProtection.xml):

<taskDefinition xmlns="http://schemas.microsoft.com/iis/media/v4/TM/TaskDefinition#">
  <name>PlayReady Protection</name>
  <id>9A3BFEAC-F8AE-41CA-87FA-D639E4D1C753</id>
  <description xml:lang="en" />
  <properties namespace="http://schemas.microsoft.com/iis/media/v4/SharedData#" prefix="sd">
    <property name="adjustSubSamples" value="true" />
    <property name="contentKey" value="" />
    <property name="customAttributes" value="" />
    <property name="dataFormats" value="h264, avc1, mp4a, vc1, wma, owma, ovc1, aacl, aach, ac-3, ec-3, mlpa, dtsc, dtsh, dtsl, dtse" />
    <property name="keyId" value="" />
    <property name="keySeedValue" value="XVBovsmzhP9gRIZxWfFta3VVRPzVEWmJsazEJ46I" />
    <property name="licenseAcquisitionUrl" value="http://playready.directtaps.net/pr/svc/rightsmanager.asmx" />
    <property name="useSencBox" value="true" />
    <property name="serviceId" value="" />
  </properties>
  <inputFolder/>
  <outputFolder>Protected</outputFolder>
  <taskCode>
    <type>Microsoft.Web.Media.TransformManager.DigitalRightsManagementTask, Microsoft.Web.Media.TransformManager.DigitalRightsManagement, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</type>
  </taskCode>
</taskDefinition>

Esta configuración está sacada del artículo de MSDN Task Preset for Azure Media Encryptor, donde se utilizan los valores de PlayReady Test Server: licenseAcquisitionUrl con el valor http://playready.directtaps.net/pr/svc/rightsmanager.asmx y keySeedValue con el valor XVBovsmzhP9gRIZxWfFta3VVRPzVEWmJsazEJ46I, que podemos confirmar en la página del servidor de test.
Creamos una nueva tarea con el procesador, la configuración de PlayReady y seleccionamos la opción TaskOptions.ProtectedConfiguration. Agregamos el asset que queremos procesar, el nombre de salida del nuevo y lanzamos el job, quedando a la espera de que el mismo finalice.
Se utiliza además un método llamado StateChanged simplemente para conocer el estado del job:

        static void StateChanged(object sender, JobStateChangedEventArgs e)
        {
            Console.WriteLine("Job stated change event:");
            Console.WriteLine("  Previous state: {0}", e.PreviousState);
            Console.WriteLine("  Current state: {0}", e.CurrentState);
        }

El resultado de la operación será similar al siguiente:

Azure Media Services - Encryption process

Publicación del asset

Una vez que el proceso haya finalizado, podemos publicar el asset desde el portal y recuperar la URL del asset cifrado:

Publish content

Smooth Streaming Health Monitor

La forma más rápida de comprobar si el archivo es capaz de reproducirse es a través de la página Smooth Streaming Health Monitor. En ella, basta con poner la URL del nuevo asset cifrado y será el reproductor el encargado de negociar con el servidor de PlayReady. Una vez haya finalizado la negociación podremos comprobar si el reproductor es capaz de reproducir el nuevo video cifrado a través de Azure Media Services.

Smooth Streaming Health Monitor

¡Saludos!