Otra de las tareas que nos proporciona Azure Media Services es la transcodificación de los assets que tenemos en nuestra cuenta. Como ya comenté en el post de introducción, es posible llevar a cabo esta tarea a través del propio portal, utilizando el menú inferior (ENCODE):
Además podemos realizar esta misma tarea a través de .NET siguiendo estos pasos:
using Microsoft.WindowsAzure.MediaServices.Client; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace EncodingAssets { class Program { static void Main(string[] args) { //0. Constants const string accountName = "YOUR_ACCOUNT_NAME"; const string accountKey = "YOUR_ACCOUNT_KEY"; var assetName = "WOW_Mists_of_Pandaria_MP4"; var OutputAssetName = "WOW_Mists_of_Pandaria_H264_Smooth"; var encodingPreset = "H264 Smooth Streaming 720p"; //1. Nuget: Install-Package windowsazure.mediaservices //2. Create context CloudMediaContext _context = new CloudMediaContext(accountName, accountKey); //3. Get asset var asset = _context.Assets.Where(a => a.Name == assetName).FirstOrDefault(); //4. Declare a job var job = _context.Jobs.Create(string.Format("Encoding {0} to {1}", assetName, encodingPreset)); //5. Get processor var processor = _context.MediaProcessors.Where(p => p.Name == "Windows Azure Media Encoder").ToList().OrderBy(wame => new Version(wame.Version)).LastOrDefault(); //6. Create task var task = job.Tasks.AddNew("Encoding task", processor, encodingPreset, TaskOptions.None); //7. Specify the asset task.InputAssets.Add(asset); //8. Output asset with the result task.OutputAssets.AddNew(OutputAssetName, AssetCreationOptions.None); //9. Handle to check the progress job.StateChanged += StateChanged; job.Submit(); //10. Check job execution and wait for job to finish Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None); progressJobTask.Wait(); //11. Check final status Console.WriteLine("Job final state: {0}", job.State); Console.ReadLine(); } 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); } } }
- Constantes necesarias: Cuenta de Azure Media Services, nombre del asset que queremos codificar, nombre del asset resultante, preset que vamos a utilizar (utilizamos el nombre de los que aparecen listados en el portal cuando realizamos la tarea desde allí:
- Instalamos a través de Nuget Install-Package windowsazure.mediaservices
- Conectamos la aplicación con la cuenta.
- Recuperamos el asset que queremos codificar. En este ejemplo, estamos recuperamos el asset a través del nombre pero es recomendable recuperarlo a través del Id, ya que el nombre de los assets puede repetirse.
- Creamos un job, que será el encargado de gestionar la tarea que vamos a llevar a cabo.
- Recuperamos el processor Windows Azure Media Encoder que realizará la tarea de encoding.
- Creamos una tarea dentro del job. Podemos tener varias tareas dentro de un job, las cuales se lanzarán de manera secuencial.
- Indicamos a la tarea cuál es el asset sobre el que queremos realizar la operación.
- Elegimos un nombre para el asset que se creará como resultado.
- Asociamos un handler al cambio de estado del job, para conocer cuál es el estado del mismo y lanzamos el job.
- Esperamos a que la tarea finalice
- Comprobamos el resultado del trabajo una vez finalizado.
Si lanzamos el ejemplo, podremos ver la siguiente salida en la consola:
Desde el portal podemos ver que en la sección CONTENT tenemos un nuevo asset con el nuevo nombre (en este caso WOW_Mists_of_Pandaria_H264_Smooth) y, si lo publicamos a través del menú inferior, veremos que el formato de la URL corresponde con el formato de Smooth Streaming:
http://[ACCOUNT_NAME].origin.mediaservices.windows.net/[LOCATOR_ID]/Mists_of_Pandaria.ism/Manifest
Espero que sea de utilidad.
¡Saludos!