El último paso que debemos realizar cuando trabajamos con Microsoft Azure Media Services es la publicación de los assets finales, con el objetivo de que puedan ser consumidos por los usuarios. Desde el portal de Microsoft Azure es posible realizar esta acción a través del botón PUBLISH:
Sin embargo, si hemos realizado la ingesta de los assets desde .NET, y hemos subido varios archivos dentro del mismo asset, veremos que si realizamos la publicación desde el portal solamente nos devolverá una de las URL de uno de los archivos (si que es cierto que podemos crear el resto de forma manual y usarlas aunque no aparezcan en el portal).
En este post me gustaría compartir el código necesario para poder realizar la publicación desde .NET, además de obtener todas las URLs de todos los archivos de un asset:
using Microsoft.WindowsAzure.MediaServices.Client; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PublishAssets { class Program { static void Main(string[] args) { //0. Constants const string AccountName = "[YOUR_ACCOUNT_NAME]"; const string AccountKey = "[YOUR_ACCOUNT_KEY]"; const string StreamingAssetName = "WOW_Mists_of_Pandaria_H264_Smooth"; const string DownloadingAssetName = "WoW_Trailers"; //1. Install-Package windowsazure.mediaservices //2. Get context var context = new CloudMediaContext(AccountName, AccountKey); //3. Get Streaming Asset var streamingAsset = (from a in context.Assets where a.Name == StreamingAssetName select a).FirstOrDefault(); //3.1 Get Downloading Asset var downloadingAsset = (from a in context.Assets where a.Name == DownloadingAssetName select a).FirstOrDefault(); //4. Create an access policy for a streaming asset var streamingAccessPolicy = context.AccessPolicies.Create("Access policy for " + StreamingAssetName, TimeSpan.FromDays(10), AccessPermissions.Read); //4.1 Create access policy for a downloading asset var downloadingAccessPolicy = context.AccessPolicies.Create("Access policy for " + DownloadingAssetName, TimeSpan.FromDays(10), AccessPermissions.Read); //5. Create a locator for a streaming asset var streamingLocator = context.Locators.CreateLocator(LocatorType.OnDemandOrigin, streamingAsset, streamingAccessPolicy); //5.1 Create a locator for a downloading asset var downloadingLocator = context.Locators.CreateSasLocator(downloadingAsset, streamingAccessPolicy); //6 Streaming info Console.WriteLine("Streaming Path: {0}n", streamingLocator.Path); Console.WriteLine("Streaming Type: {0}n", streamingLocator.Type); Console.WriteLine("Streaming ExpirationDateTime: {0}n", streamingLocator.ExpirationDateTime); Console.WriteLine("URL asset files:n"); foreach (var manifest in streamingAsset.AssetFiles.Where(f => f.Name.EndsWith(".ism"))) { Console.WriteLine(" {0}{1}/manifestn", streamingLocator.Path, manifest.Name); } Console.WriteLine(); Console.WriteLine(); //6.1 Downloading info Console.WriteLine("Downloading Path: {0}n", downloadingLocator.Path); Console.WriteLine("Downloading Type: {0}n", downloadingLocator.Type); Console.WriteLine("Downloading ExpirationDateTime: {0}n", downloadingLocator.ExpirationDateTime); Console.WriteLine("URL asset files:n"); foreach (var file in downloadingAsset.AssetFiles.Where(f => f.Name.EndsWith(".mp4"))) { Console.WriteLine(" {0}/{1}{2}n", downloadingLocator.BaseUri, file.Name, downloadingLocator.ContentAccessComponent); } Console.ReadLine(); } } }
Cuando queremos exponer nuestro contenido, debemos tener en cuenta que existen varias opciones para compartirlo: streaming, como se vió en el post sobre Dynamic Packaging, descarga progresiva de MP4 o simplemente la descarga del contenido a la máquina local. Por ello, en este ejemplo he publicado dos assets, streamingAsset y downloadingAsset, con el fin de tener los dos tipos de publicación. Los pasos son prácticamente los mismos:
- Necesitaremos las credenciales de la cuenta y el nombre de los assets que queremos publicar.
- Instalamos el paquete Install-Package windowsazure.mediaservices a través de Nuget.
- Recuperamos el contexto de la cuenta.
- Recuperamos los assets. En este ejemplo se están obteniendo a través del nombre, pero se recomienda recuperar los assets a través del Id, ya que los nombres pueden repetirse.
- Cuando se publica un asset es necesario definir una política de acceso con la duración de la misma y el tipo de acceso que se tendrá al contenido. En este caso para ambos se da un acceso de 10 días de lectura. Cada asset puede tener hasta 5 políticas de acceso diferentes.
- El último paso es la creación del locator, lo cual nos ayudará a generar la URL final para el contenido. En el caso del streaming utilizaremos context.Locators.CreateLocator, donde usamos el tipo de locator OnDemandOrigin, además del asset y la política de acceso a utilizar. Para el segundo caso, la descarga del contenido, utilizamos context.Locators.CreateSasLocator pasando también el asset y la política de acceso. A partir de este momento se generarán los valores necesarios para la publicación del contenido de ambos assets (también se verá reflejado en el portal).
- Para visualizar el resultado, he utilizado la consola, donde muestro el path creado, el tipo de publicación y la fecha de expiración. Además, por cada uno de los ejemplos, recorro AssetFiles y monto las URL individuales. En el caso de streaming la URL se compone de [PATH][FILE_NAME].ism/Manifest y en tipo SaS [BASE_URI]/[FILE_NAME][CONTENT_ACCESS_COMPONENT]
El resultado:
Espero que sea de utilidad.
¡Saludos!