Compartir a través de


Windows Azure

Democratización de los contenidos en vídeo con los Servicios multimedia de Windows Azure

Bruno Terkaly
Ricardo Villalobos

Descargar el ejemplo de código

Una de las tendencias que sin lugar a dudas está destinada a un crecimiento impresionante en los años que vienen es la transmisión por secuencias de los contenidos de vídeo. Según Cisco Visual Networking Index (VNI) 2011, el tráfico relacionado con esta actividad se cuadruplicará de aquí al año 2015. Hay varios factores detrás de este fenómeno, tales como: los costos decrecientes del almacenamiento; recursos de procesamiento y almacenamiento escalable en nube; redes de amplio ancho de banda; y una infinidad de dispositivos con funciones de vídeo, tales como tabletas y dispositivos smartphone. La creación, codificación y distribución del vídeo nunca antes había sido tan práctico y asequible, incluso para el aficionado ocasional.

Actualmente se está luchando una batalla importante sobre cómo los contenidos en vídeo se deben entregar y proteger mediante leyes de derecho de autor. Muchos hemos sido testigos de cómo la industria de la música ha sufrido una transformación impresionante, al restar importancia a los grandes sellos discográficos a favor de las empresas de medios basadas en Internet. Los principales operadores móviles y proveedores de cable hoy en día están preocupados por el crecimiento emergente del vídeo a petición y el uso de canales de Internet para su distribución, como YouTube, Ustream y justin.tv, por nombrar solo unos pocos.

Mientras tanto, Microsoft no está sentado de brazos cruzados. En mayo de 2012, la empresa de software implementó características nuevas de Servicios multimedia en Windows Azure, que permitirán democratizar la creación, administración y entrega de vídeo a las masas. Los Servicios multimedia de Windows Azure (simplemente “Servicios multimedia” de aquí en adelante, por motivos de brevedad) son compatibles con varios tipos de dispositivos diferentes, desde smartphones hasta tabletas y estaciones de trabajo avanzadas. Este conjunto de características (conocido previamente bajo el nombre “Nimbus”) permite que los desarrolladores individuales y empresas creen soluciones multimedia basadas en nube para ingerir, procesar, administrar y entregar contenidos multimedia.

Solución de problemas

Estas características nuevas de los Servicios multimedia entregan una solución automatizada, estandarizada y económica para el espacio de la administración multimedia que reduce drásticamente las barreras y dificultades, al brindar tres ventajas centrales:

  1. Escalabilidad automática al aprovechar las ventajas de la informática en nube, inclusive el aumento de la capacidad a pedido, en función de las necesidades de los usuarios.
  2. Una interfaz altamente programable basada en una API según los principios REST, junto con una biblioteca cliente Microsoft .NET Framework que permite a los desarrolladores crear, administrar y mantener fácilmente los flujos de trabajo personalizados.
  3. Un ecosistema de socios que incluye componentes de diferentes empresas que se pueden conectar en cualquier etapa de los flujos de trabajo mencionados.

Estos Servicios multimedia completos entregan soluciones para una amplia gama de problemas comunes para las empresas que crean, administran y distribuyen contenidos. El primero es el costo, ya que la construcción de un centro de datos para vídeo es caro. El aprovisionamiento de los servidores, codificadores, equipos de red y software relacionado representa una barrera inicial significativa. El segundo problema que solucionan los Servicios multimedia es el tema de los flujos de trabajo personalizados que aqueja a toda la industria. Muchas empresas del sector de multimedia han creado sus propios contratos comerciales, lo que dificulta la coordinación de los servicios relacionados entre diferentes proveedores mediante varios formatos y protocolos. La estandarización de la forma en que se procesa el vídeo mejora la coordinación y productividad cuando hay varios participantes implicados en la creación y administración de los contenidos.

Estándares abiertos

Los Servicios multimedia se apoyan en estándares abiertos, lo que significa que prácticamente cualquier cliente puede aprovecharlos, inclusive Java, PHP, Objective-C y jQuery, para nombrar solo unos pocos. Todo el conjunto de funciones está disponible a través de una API según los principios REST y que implementa Open Data Protocol (OData) para brindar funcionalidades de consulta flexibles. También existe un SDK para .NET C#, creado a partir de una API según los principios REST, que facilita y simplifica el acceso al marco para los desarrolladores en este lenguaje (ver Ilustración 1).

Ilustración 1 Dos enfoques para usar los Servicios multimedia de Windows Azure en los programas

API REST y OData

Los desarrolladores pueden acceder a los componentes de los Servicios multimedia mediante la capa de API de Transferencia de estado de representación (REST). Como REST se basa en HTTP, se puede consumir prácticamente en cualquier lugar con una amplia gama de lenguajes, aplicaciones y plataformas. En resumidas cuentas, la API REST es la interfaz programática pública universal para acceder a la capa de los Servicios multimedia en la web.

REST es una estrategia arquitectónica para la creación de aplicaciones de cliente servidor en red basada en estándares abiertos. REST proporciona un protocolo estándar (HTTP) sin estado y con funcionalidad caché para enviar información entre equipos conectados en red.

API .NET

Obviamente, también existe un SDK cliente .NET (que encapsula las llamadas de la API REST y simplifica el proceso de creación de una aplicación cliente de Servicios multimedia basada en .NET).

Este artículo se concentrará en la API .NET. En artículos futuros se examinarán las soluciones basadas en REST.

Aprovechamiento de la API de los Servicios multimedia

Para entender mejor las ventajas de la característica de Servicios multimedia de Windows Azure, este artículo se concentra en el caso de un contexto específico. Imagínese un vídeo casero que se debe compartir con varios miembros de la familia o amigos que tienen una amplia gama de dispositivos móviles. En la Ilustración 2 vemos el flujo de trabajo general necesario para entregar al mundo un contenido de vídeo personalizado procesado.

Overall Workflow Required to Distribute Video ContentIlustración 2 Flujo de trabajo general para distribuir un contenido en vídeo

Requisitos previos

Carga y codificación de contenidos

Comencemos con las tareas básicas para la distribución del contenido de vídeo. El código de la Ilustración 3 cumple con dos objetivos importantes de cualquier persona que trabaje con vídeo. La primera es cargar el contenido original para poder procesarlo. El segundo es codificar el contenido de forma tal que se pueda consumir en diferentes dispositivos. Existen muchos formatos de vídeo, como por ejemplo MPEG, MPEG-2 (QuickTime), RealMedia, H.264 (MP4) y Windows Media, por nombrar solo unos pocos; incluso YouTube tiene su propio formato de codificación. Los formatos de codificación no son todos iguales. Muchos se diseñaron para ser pequeños, lo que permite descargas y representaciones rápidas en web. Otros, como H.264, enfatizan la calidad, sin preocuparse por el tamaño del vídeo.

Ilustración 3 Carga y ejecución de un trabajo de codificación

static void Main(string[] args)
{
  // Part 1 - Connect to Media Services
  //          Setup upload progress event
  //          Upload a video to encode
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]","[ ACCOUNT KEY ]");
  mediaContext.Assets.OnUploadProgress += Assets_OnUploadProgress;
  var asset = mediaContext.Assets.Create(    
    @"C:\windows\Performance\WinSat\winsat.wmv");
  // Part 2 - Create a task, specify encoding details
  Console.Clear();
  IJob job = mediaContext.Jobs.CreateJob("Sample Job");
  var expressionEncoder = mediaContext.MediaProcessors.Where(
    mp => mp.Name == "Expression Encoder").Single();
  var task = job.Tasks.Add(
    mediaProcessor: expressionEncoder,
    configuration: "H.264 HD 720p VBR");
  task.Inputs.Add(asset);
  task.Outputs.Add("Sample Task Output Asset");
  // Part 3 - Submit the encoding job to begin processing
  while (job.State != JobState.Finished)
  {
    job = mediaContext.Jobs.Refresh(job.Id);
    Console.SetCursorPosition(0, 0);
    Console.WriteLine("Job Name: " + job.Name);
    Console.WriteLine("Job ID: " + job.Id);
    Console.WriteLine();
    Console.WriteLine("Job State: {0,-20}", job.State);
    Console.WriteLine("Task Progress: {0:0.00}%  ",
      job.Tasks.Single().Progress);
    Thread.Sleep(500);
  }
  Console.WriteLine();
  Console.WriteLine("Job Complete!");
  Console.ReadLine();
}
// Part 4 - Display completion progress (See Part 1, where the callback was set up)
static void Assets_OnUploadProgress(object sender, 
  UploadProgressEventArgs e)
{
  Console.WriteLine(e.Progress);
}

En la Ilustración 4 se explica el código de la Ilustración 3 de acuerdo con las secciones rotuladas Parte 1 a Parta 4.

Ilustración 4 Comentarios sobre el código fuente de la Ilustración 3 (ver Partes 1 a 4)

Parte 1

Este código cumple tres funciones básicas:

   1. Crea un objeto CloudMediaContext que proporciona las credenciales para la autenticación en los Servicios multimedia. Este contexto se emplea en todo el código restante para administrar y procesar los activos de multimedia.

  2. Configura el código de devolución de llamada llamado Assets_OnUploadProgress, que sirve para informar al usuario sobre el porcentaje de avance del proceso de carga.

  3. Carga el archivo de vídeo original (winsat.wmv) para poder procesarlo.

Nota: la terminología que usamos aquí es “activos”, que en este caso se refiere al vídeo original.

Parte 2 El objetivo de este código es crear una tarea, que comprende un procesador de multimedia, una configuración y entradas y salidas. Observe que la codificación se realiza con la configuración “H.264 HD 720p VBR”. Usaremos Microsoft Expression Encoder. A medida que nuevos socios del sector de los multimedia agreguen valores nuevos encima de los Servicios multimedia, habrá procesadores de multimedia adicionales disponibles.
Parte 3 Aquí comienza el procesamiento propiamente tal. Podemos pensar en las tareas como un flujo de trabajo con un conjunto de tareas. Las tareas se pueden enlazar y se pueden ejecutar en paralelo.
Parte 4 Este código no es más que la devolución de llamada que se ejecuta automáticamente durante el proceso de carga del vídeo. Normalmente se usa para informar al usuario sobre el porcentaje de avance del proceso de carga.

Administración de los contenidos

Una de las dificultades de la administración de un proyecto de vídeo es mantener la cuenta de todos los activos, trabajos y tareas. La producción de contenidos frecuentemente implica docenas de archivos originales y posiblemente cientos más creados como resultado final codificado. Puede resultar extremadamente difícil trazar y ubicar un elemento específico para realizar un procesamiento adicional. La automatización de este proceso mediante interfaces estandarizadas cambia completamente el juego. La interfaz de administración de los Servicios multimedia abre la puerta para una colaboración mayor entre las partes interesadas y permite coordinar los flujos de trabajo de larga duración en forma mucho más eficiente. El objeto CloudMediaContext proporciona una interfaz intuitiva para ubicar todos los elementos asociados con el flujo de trabajo, organizados como una serie de colecciones que se pueden consultar con bibliotecas comunes tales como LINQ.

El código en la Ilustración 5 ejemplifica la posibilidad de iterar por los activos y mostrar la información sobre los archivos de vídeo y otros tipos de archivo, como por ejemplo imágenes. Observe que el objeto de contexto tiene una colección de activos, y el objeto Asset tiene una colección de objetos File.

Ilustración 5 Varios activos asociados dentro de una cuenta

static void Main(string[] args)
{
  // Part 1 - Connect to Media Services
  //          Loop through assets, displaying file information
  CloudMediaContext mediaContext = 
    new CloudMediaContext("[ ACCOUNT NAME ]",
    "[ ACCOUNT KEY ]");
  Console.WriteLine("ASSET INFORMATION");
  foreach (IAsset asset in mediaContext.Assets)
  {
    // Display the collection of assets.
    Console.WriteLine("Asset ID: " + asset.Id);
    Console.WriteLine("Name: " + asset.Name);
    // Display the files associated with each asset.
    foreach (IFileInfo fileItem in asset.Files)
    {
      Console.WriteLine("File Name: " + fileItem.Name);
      Console.WriteLine("File Create Date: " + fileItem.Created);
      Console.WriteLine("File Size: " + fileItem.ContentFileSize);
    }
  }
}

El código de la Ilustración 6 ejemplifica la capacidad de realizar consultas LINQ para buscar activos específicos. Si tenemos en cuenta que posiblemente se están administrando miles de archivos, entonces una funcionalidad de búsqueda como esta puede brindar una ayuda extraordinaria.

Ilustración 6 La simpleza sorprendente de LINQ al buscar un activo por nombre o identificador

// Returns an asset, given an asset name
static IAsset GetAssetNameFromContext(
  CloudMediaContext mediaContext, string assetName)
{
  IAsset asset = mediaContext.Assets.Where(a => a.Name ==
    assetName).FirstOrDefault();
  if (asset != null)
    return asset;
  else
    return null;
}
// Returns an asset, given an asset Id
static IAsset GetAssetIdFromContext(
  CloudMediaContext mediaContext, string assetId)
{
  IAsset asset = mediaContext.Assets.Where(a => a.Id ==
    assetId).FirstOrDefault();
  if (asset != null)
    return asset;
  else
    return null;
}

Directivas de acceso

El control de los usuarios que pueden ver y acceder a determinados activos es una función integrada del marco para los Servicios multimedia. Para controlar los derechos de seguridad, los propietarios de los contenidos pueden especificar en forma programática una directiva de acceso, donde se especifican detalles tales como los permisos de lectura y escritura y la duración del acceso. Estas son funciones poderosas en el contexto del uso compartido de los flujos de trabajo con las otras partes interesadas en el vídeo.

Esta sección muestra cómo realizar algunas tareas básicas con las directivas de acceso, como por ejemplo crear y asignar un activo, o enumerar los activos que ya se crearon. La finalidad del código en la Ilustración 7 es configurar una directiva de “lectura”, que otorga un acceso de solo 30 minutos al vídeo. El código comienza por cargar winsat.wmv. A partir de ahí, se crea una directiva nueva, llamada CanReadFor30Minutes, que significa que el archivo solo se puede leer durante 30 minutos después del proceso de carga. El siguiente paso consiste en vincular la directiva de acceso al archivo de vídeo cargado.

Ilustración 7 Exposición temporal para descargar un vídeo

static void Main(string[] args)
{
  // Part 1 - Specify an asset to upload
  //          Connect to Media Services
  string inputFilePath =
    @"C:\windows\Performance\WinSat\winsat.wmv";
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]", "[ ACCOUNT KEY ]");
  // Part 2 - Upload an asset
  //          Create a policy for the asset
  //          Link access policy to asset
  IAsset asset = mediaContext.Assets.Create(inputFilePath);
  // Because this is a single-file asset, get the name of first file.
  string fileName = asset.Files[0].Name;
  IAccessPolicy readPolicy = mediaContext.AccessPolicies.Create(
    "CanReadFor30Minutes",
    TimeSpan.FromMinutes(30),
    AccessPermissions.Read);
  // Part 3 - Define a locator based on the read policy
  //          and expiration date
  //          Print the path for the locator you created
  //          Get the locator path Uri
  //          Build the full path to the file associated
  //          with the locator.
  ILocator locator = mediaContext.Locators.CreateSasLocator(
    asset, readPolicy);
  Console.WriteLine("Locator path: " + locator.Path);
  var uriBuilder = new UriBuilder(locator.Path);
  uriBuilder.Path += Path.AltDirectorySeparatorChar + fileName;
  Uri fullUrl = uriBuilder.Uri;
  // Part 4 - Print the full path to the file
  Console.WriteLine("Full URL to file: " + fullUrl);
}

Los puntos de ubicación son copias persistentes del archivo de directiva, cuya ubicación se expresa como URI. Los puntos de ubicación sirven para otorgar acceso al activo bajo los términos especificados por la directiva. En este caso, para acceder al activo (el vídeo cargado) dentro del límite de tiempo de 30 minutos, debemos usar el URL completo, junto con el archivo de punto de ubicación. Ver fullUrl en la Ilustración 7.

Descarga de los activos procesados

Por último, la finalidad del código de la Ilustración 8 es descargar el contenido del vídeo al almacenamiento local. En este caso, el archivo winsat.mp4 es la salida codificada como H.264, generada a partir del vídeo original que se almacenó como winsat.wmv. Puede llamar la función del siguiente modo:

DownloadAsset("nb:cid:UUID:a0297fe4-7080-4393-b874-7ddf0f759c40", @"c:\temp");

Ilustración 8 Descarga de activos desde los Servicios multimedia de Windows Azure

static void DownloadAsset(string assetId, 
    string outputMediaFilesFolder)
{
  // Part 1 - Connect to Media Services
  //          Get an existing asset based on assetId passed in.
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]","[ ACCOUNT KEY ]");
  IAsset asset = mediaContext.Assets.Where(a => a.Id ==
    assetId).SingleOrDefault();
  // Part 2 - If the asset exists, download the first file in the asset
  //          Download to outputMediaFilesFolder      
  if (asset != null)
  {
    Console.WriteLine("Asset name: " + asset.Name);
    IFileInfo theFile = asset.Files.FirstOrDefault();
    // You could iterate through the asset.Files collection with a
    // foreach statement, and download all files for assets that
    // have multiple files.
    // Example: foreach(IFileInfo file in asset.Files)
    // Download the file to the specified local folder.
    if (theFile != null)
      theFile.DownloadToFile(Path.GetFullPath(outputMediaFilesFolder +
        Path.DirectorySeparatorChar + theFile.Name));
    else
      Console.WriteLine("No files available for this asset.");
  }
  else
  {
    Console.WriteLine("Asset not available.");
  }
}

El assetId de winsat.mp4 es nb:cid:UUID:a0297fe4-7080-4393-b874-7ddf0f759c40. Es tan sencillo como solicitar el recurso descargable mediante el assetId y especificar una carpeta de destino para descargarlo.

Ventajas de la informática en nube

En conclusión, las características de Servicios multimedia de Windows Azure simplifican el proceso de codificación y distribución de los contenidos en vídeo a una pluralidad de dispositivos o canales web que requieren diferentes formatos y resoluciones. Esto se logra al aprovechar los beneficios de la informática en nube, incluida la escalabilidad de procesamiento y almacenamiento en función de una demanda variable. Esto, junto con una API sofisticada basada en REST y una biblioteca cliente .NET, facilita el proceso de creación, administración y mantenimiento de los flujos de trabajo que se pueden mejorar con componentes creados en un amplio ecosistema de socios.

Los Servicios multimedia representan un paso agigantado en la producción, administración y entrega de contenidos en vídeo, lo que le permite automatizar y reunir una amplia gama de activos digitales y organizarlos en un lugar centralizado e incluso en ubicaciones distribuidas. Como en los siguientes años el vídeo se halla en la senda de un crecimiento extraordinario en la web, estos Servicios multimedia llegan en el momento perfecto.

Posteriormente, abarcaremos la API REST en detalle, además de algunas soluciones de terceros para codificadores personalizados y funciones superiores.

Bruno Terkaly es un evangelizador desarrollador para Microsoft. Su profundo conocimiento se debe a años de experiencia en el campo; escribe código mediante el uso de diversas plataformas, lenguajes, marcos, SDK, bibliotecas y API. Se dedica a escribir código, publicar en su blog y a realizar presentaciones en vivo sobre la creación de aplicaciones basadas en la nube, específicamente con el uso de la plataforma Windows Azure.

Ricardo Villalobos es un arquitecto de software avezado con más de 15 años de experiencia en el diseño y la creación de aplicaciones para empresas del sector de la administración de cadenas de suministros. Cuenta con distintas certificaciones técnicas así como también un MBA en administración de cadenas de suministros de la Universidad de Dallas y trabaja como arquitecto evangelizador de Windows Azure para Microsoft.

Gracias a los siguientes expertos técnicos por su ayuda en la revisión de este artículo: John Deutscher, Samuel Ng y Tim Teebken