Exportar (0) Imprimir
Expandir todo

Introducir recursos con el SDK de Servicios multimedia para .NET

Actualizado: agosto de 2014

En este tema se muestra cómo introducir (cargar) contenido en los Media Services. En una aplicación de Media Services, la introducción de tareas es el proceso de cargar contenido (recursos, archivos multimedia, etcétera) en el sistema. El objeto de contenido fundamental de Media Services es un IAsset, que consiste en una colección de metadatos sobre un conjunto de archivos multimedia. Cada IAsset contiene uno o más objetos IAssetFile. Para obtener información más detallada sobre qué es un Asset en los Media Services, consulte Activo.

noteNota
Servicios multimedia usa el valor de la propiedad IAssetFile.Name al generar las URL para el contenido de streaming (por ejemplo, http://{WAMSAccount}.origin.mediaservices.windows.net/{GUID}/{IAssetFile.Name}/streamingParameters). Por este motivo, no se permite la codificación de porcentaje. El valor de la propiedad Name no puede contener ninguno de los siguientes caracteres reservados a la codificación de porcentaje: !*'();:@&=+$,/?%#[]". Además, solo puede haber un ‘.’ para la extensión de nombre de archivo.

Hay diferentes enfoques sobre la manera de introducir recursos en los Media Services:

  • Cree un Asset, cree uno o más AssetFiles asociados al Asset y cargue los AssetFiles en los Servicios multimedia de Microsoft Azure. Siga este enfoque cuando trabaje con conjuntos pequeños de archivos multimedia, no cuando use una solución de carga independiente. Todos los ejemplos de este tema son de este tipo.

  • Introduzca en bloque un conjunto de archivos preparando un manifiesto y cárguelos en los Servicios multimedia de Microsoft Azure mediante una solución de carga independiente. Para obtener más información sobre este enfoque, consulte Ingesta en bloque de recursos con el SDK de Servicios multimedia para .NET.

TipSugerencia
Si va a cargar un número elevado de recursos, debe tener en cuenta lo siguiente.

  • Cree un objeto CloudMediaContext nuevo por subproceso. La clase CloudMediaContext no es segura para subprocesos.

  • Aumente NumberOfConcurrentTransfers del valor predeterminado de 2 a un valor superior, como 5. La configuración de esta propiedad afecta a todas las instancias de CloudMediaContext.

  • Mantenga ParallelTransferThreadCount en el valor predeterminado de 10.

El código de este tema muestra cómo realizar las siguientes tareas comunes:

noteNota
Para crear un recurso, primero debe tener una referencia al contexto de servidor de Media Services, tal y como se describe en el tema Conexión a Servicios multimedia con el SDK de Servicios multimedia para .NET. El objeto de contexto se representa mediante la variable con el nombre _context en los siguientes ejemplos de código.

Para poder cargar un archivo en el servidor de Media Services, debe crear un recurso a través del método Create o CreateAsync. Ambos métodos toman el nombre del recurso y la opción de cifrado como parámetros.

Al crear recursos, puede especificar tres opciones distintas de cifrado:

  • AssetCreationOptions.None: sin cifrado.

  • AssetCreationOptions.CommonEncryptionProtected: para archivos CENC (Common Encryption Protected). Un ejemplo sería un conjunto de archivos que ya están cifrados con PlayReady.

  • AssetCreationOptions.StorageEncrypted: cifrado de almacenamiento. Cifra un archivo de entrada no cifrado antes de cargarlo al almacenamiento de Azure.

    noteNota
    Tenga en cuenta que los Media Services solo proporcionan cifrado de almacenamiento en el disco, y no a través del cable como una solución Digital Rights Management (DRM).

El método CreateEmptyAsset muestra cómo crear un recurso vacío.

static private IAsset CreateEmptyAsset(string assetName, AssetCreationOptions assetCreationOptions)
{
    var asset = _context.Assets.Create(assetName, assetCreationOptions);

    Console.WriteLine("Asset name: " + asset.Name);
    Console.WriteLine("Time created: " + asset.Created.Date.ToString());

    return asset;
}

El código de esta sección efectúa las siguientes acciones:

  1. Crea un Asset vacío a través del método CreateEmptyAsset definido en el paso anterior.

  2. Crea una instancia AssetFile asociada al Asset.

  3. Carga el archivo multimedia asociado al AssetFile en los Media Services.

noteNota
La instancia AssetFile y el archivo multimedia real son dos objetos diferentes. La instancia AssetFile contiene metadatos sobre el archivo multimedia, mientras que en el archivo multimedia se encuentra el contenido multimedia real.

static public IAsset CreateAssetAndUploadSingleFile( AssetCreationOptions assetCreationOptions, string singleFilePath)
{   
    var assetName = "UploadSingleFile_" + DateTime.UtcNow.ToString();
    var asset = CreateEmptyAsset(assetName, assetCreationOptions);
    var fileName = Path.GetFileName(singleFilePath);
    var assetFile = asset.AssetFiles.Create(fileName);

    Console.WriteLine("Created assetFile {0}", assetFile.Name);
    Console.WriteLine("Upload {0}", assetFile.Name);

    assetFile.Upload(singleFilePath);
    Console.WriteLine("Done uploading of {0}", assetFile.Name);

    return asset;

}

El código de esta sección efectúa las siguientes acciones:

  1. Crea un recurso vacío a través del método CreateEmptyAsset definido en el paso anterior.

  2. Crea una instancia AccessPolicy que define los permisos y la duración del acceso al recurso.

  3. Crea una instancia Locator que da acceso al recurso.

  4. Crea una instancia BlobTransferClient. Este tipo representa a un cliente que opera en los blobs de Azure. En este ejemplo, usamos el cliente para supervisar el progreso de la carga.

  5. Enumera los archivos del directorio especificado y crea una instancia AssetFile para cada archivo.

  6. Carga los archivos en los Media Services a través del método UploadAsync.

    TipSugerencia
    Use el método UploadAsync para asegurarse de que las llamadas no se bloquean y de que los archivos se cargan en paralelo.

static public IAsset CreateAssetAndUploadMultipleFiles(AssetCreationOptions assetCreationOptions, string folderPath)
{
      var assetName = "UploadMultipleFiles_" + DateTime.UtcNow.ToString();
      var asset = CreateEmptyAsset(assetName, assetCreationOptions);
      var accessPolicy = _context.AccessPolicies.Create(assetName, TimeSpan.FromDays(30), AccessPermissions.Write | AccessPermissions.List);
      var locator = _context.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy);

      var blobTransferClient = new BlobTransferClient();
      blobTransferClient.NumberOfConcurrentTransfers = 20;
      blobTransferClient.ParallelTransferThreadCount = 20;
      blobTransferClient.TransferProgressChanged += blobTransferClient_TransferProgressChanged;

       var filePaths = Directory.EnumerateFiles(folderPath);

       Console.WriteLine("There are {0} files in {1}", filePaths.Count(), folderPath);

       if (!filePaths.Any())
       {
           throw new FileNotFoundException(String.Format("No files in directory, check folderPath: {0}", folderPath));
       }

       var uploadTasks = new List<Task>();
       foreach (var filePath in filePaths)
       {
            var assetFile = asset.AssetFiles.Create(Path.GetFileName(filePath));

            Console.WriteLine("Start uploading of {0}", assetFile.Name);
            uploadTasks.Add(assetFile.UploadAsync(filePath, blobTransferClient, locator, CancellationToken.None));
       }

      Task.WaitAll(uploadTasks.ToArray());
      Console.WriteLine("Done uploading the files");

      blobTransferClient.TransferProgressChanged -= blobTransferClient_TransferProgressChanged;
      locator.Delete();
      accessPolicy.Delete();

      return asset;

}

static void  blobTransferClient_TransferProgressChanged(object sender, BlobTransferProgressChangedEventArgs e)
{
    Console.WriteLine("{0}% upload competed for {1}.", e.ProgressPercentage, e.LocalFile);
}

Ya puede pasar al tema siguiente: Ingesta en bloque de recursos con el SDK de Servicios multimedia para .NET.

Vea también

Mostrar:
© 2014 Microsoft