导出 (0) 打印
全部展开

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

更新时间: 2014年8月

本主题演示如何将内容引入(上载)到 Media Services 中。在 Media Services 应用程序中,引入任务是将内容(资产、媒体文件等)上载到系统中的过程。Media Services 中最基本的内容对象是 IAsset,后者是有关一组媒体文件的元数据的集合。每个 IAsset 均包含一个或多个 IAssetFile 对象。有关 Media Services 中的Asset是什么的更详细解释,请参阅资产

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

可通过几种不同方法来将资产引入到 Media Services 中:

  • 创建一个Asset,创建一个或多个与该Asset关联的 AssetFiles,然后将 AssetFiles 上载到 Microsoft Azure Media Services。在处理较小的媒体文件集并且未在使用单独的上载解决方案时,使用此方法。本主题中的所有示例都属于此类型。

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

Tip提示
上载大量资产时,请注意以下事项。

本主题中的代码显示如何执行以下常见任务:

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

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

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

  • AssetCreationOptions.None:不加密。

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

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

    note备注
    请注意,Media Services 只提供磁盘上的存储加密,而不是通过数字权限管理解决方案 (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 关联的媒体文件上载到 Media Services 中。

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 方法将文件上载到 Media Services 中。

    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 批量引入资产.

另请参阅

显示:
© 2014 Microsoft