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:
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:
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.
¡Saludos!