销售电话: 1-800-867-1380

使用用于 .NET 的 Media Services SDK 引入资产

更新时间: 2014年8月

本主题说明如何将内容引入(上载)到 媒体服务 中。在媒体服务应用程序中,引入任务是将内容(资产、媒体文件等)上载到系统中的过程。媒体服务中最基本的内容对象为 IAsset,这是一个与一组媒体文件相关的元数据的集合。每个 IAsset 都包含一个或多个 IAssetFile 对象。有关媒体服务中 Asset 的详细说明,请参阅资产

note备注
构建流内容的 URL 时,Media Services 会使用 IAssetFile.Name 属性的值(如 http://{WAMSAccount}.origin.mediaservices.windows.net/{GUID}/{IAssetFile.Name}/streamingParameters)。出于这个原因,不允许使用百分号编码。Name 属性的值不能含有任何以下保留的百分号编码字符:!*'();:@&=+$,/?%#[]"。此外,文件扩展名中只能含有一个“.”。

有一些不同的方法可将资产引入媒体服务:

  • 创建一个 Asset,再创建一个或多个与 Asset 关联的 AssetFiles,然后将 AssetFiles 上载到 Microsoft Azure Media Services。当处理较小的媒体文件集合,以及不使用单独的上载解决方案时,请使用这种方法。本主题中的所有示例均属于这种类型。

  • 通过准备清单批量引入一组文件,然后使用单独的上载解决方案将其上载到 Microsoft Azure Media Services。有关这种方法的详细信息,请参阅使用用于 .NET 的 Media Services SDK 批量引入资产

Tip提示
上载大量资产时,请考虑执行以下操作。

本主题中的代码说明了如何执行以下常见任务:

note备注
若要创建任何资产,首先必须获取对媒体服务服务器上下文的引用,如主题使用 Media Services SDK 连接到 Media Services所述。在以下代码示例中,上下文对象由名为 _context 的变量表示。

你必须先使用 CreateCreateAsync 方法创建一个资产,然后才能将文件上载到媒体服务服务器。这两个方法都将资产名称和加密选项作为参数。

在创建资产时,可以指定三种不同的加密选项:

  • AssetCreationOptions.None:不加密。

  • AssetCreationOptions.CommonEncryptionProtected:用于受常用加密 (CENC) 保护的文件。示例为一组已经由 PlayReady 加密的文件。

  • AssetCreationOptions.StorageEncrypted:存储加密。加密明文输入文件,然后将其上载到 Azure 存储。

    note备注
    请注意,媒体服务仅提供磁盘上的存储加密,而不是通过数字权限管理解决方案 (DRM) 等线路提供加密。

CreateEmptyAsset 方法说明了如何创建空资产。

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;
}

本部分中的代码执行以下操作:

  1. 使用在上一步定义的 CreateEmptyAsset 方法创建一个空 Asset

  2. 创建一个与 Asset 关联的 AssetFile 实例。

  3. 将与 AssetFile 关联的媒体文件上载到媒体服务。

note备注
AssetFile 实例和实际媒体文件是两个不同的对象。AssetFile 实例包含有关媒体文件的元数据,而媒体文件包含实际媒体内容。

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;

}

本部分中的代码执行以下操作:

  1. 使用在上一步定义的 CreateEmptyAsset 方法创建一个空资产。

  2. 创建 AccessPolicy 实例以定义资产的访问权限和持续时间。

  3. 创建提供资产访问权限的 Locator 实例。

  4. 创建一个 BlobTransferClient 实例。此类型代表在 Azure BLOB 上运行的客户端。在此示例中,我们使用该客户端来监视上载进度。

  5. 枚举指定目录中的文件并为每个文件创建一个 AssetFile 实例。

  6. 使用 UploadAsync 方法将这些文件上载到媒体服务。

    Tip提示
    使用 UploadAsync 方法确保调用不会受到阻止且文件是以并行方式上载的。

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);
}

你已做好准备,可以继续下一个主题: 使用用于 .NET 的 Media Services SDK 批量引入资产.

另请参阅

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft