Экспорт (0) Печать
Развернуть все

Получение активов с помощью пакета SDK служб мультимедиа для .NET

Обновлено: Февраль 2015 г.

В этом разделе показано, как получить (отправить) контент в Службы Media Services. В приложении Службы Media Services получение задач — это процесс отправки контента (активов, файлов мультимедиа и т. д.) в систему. Самый основной объект контента в Службы Media Services — это IAsset, который является коллекцией метаданных о наборе файлов мультимедиа. Каждый IAsset содержит один или несколько объектов IAssetFile. Более подробное объяснение того, что такое Asset в Службы Media Services, см. в разделе Asset.

noteПримечание
Службы мультимедиа используют значение свойства IAssetFile.Name при формировании URL-адресов для потоковой передачи контента (например, http://{WAMSAccount}.origin.mediaservices.windows.net/{GUID}/{IAssetFile.Name}/streamingParameters.) Поэтому кодирование в последовательность с процентом не разрешено. Свойство Name не может содержать следующие зарезервированные символы, закодированные в последовательность с процентом: !*'();:@&=+$,/?%#[]". Кроме того, может использоваться только одна точка (".") для расширения имени файла.

Существуют разные подходы к получению активов в Службы Media Services:

  • Создайте Asset, создайте один или несколько AssetFiles, связанных с Asset, а затем отправьте AssetFiles в Microsoft Azure Media Services. Используйте этот подход при работе с более мелкими наборами файлом мультимедиа, если не используется отдельное решения отправки. Все примеры в этом разделе принадлежат данному типу.

  • Массовое получение набора файлов путем подготовки манифеста и отправка их в Microsoft Azure Media Services с помощью отдельного решения отправки. Дополнительные сведения об этом подходе см. в разделе Массовое получение активов с помощью пакета SDK служб мультимедиа для .NET.

TipСовет
При отправке большего количества активов рассмотрите следующее.

  • Создайте новый объект CloudMediaContext на поток. Класс CloudMediaContext не является потокобезопасным.

  • Увеличьте значение NumberOfConcurrentTransfers со значения по умолчанию (2) до более высокого значения, например, 5. Указание значения для этого свойства повлияет на все экземпляры CloudMediaContext.

  • Оставьте для ParallelTransferThreadCount значение по умолчанию (10).

В коде этого раздела показано, как выполнить следующие стандартные задачи.

noteПримечание
Чтобы создать актив, сначала необходимо указать ссылку на контекст сервера Службы Media Services, как описано в разделе Connect to Media Services Using the Media Services SDK. Объект контекста в следующих примерах кода представлен переменной _context.

Перед отправкой файла на сервер Службы Media Services необходимо создать актив, использующий метод Create или CreateAsync. Оба метода используют имя актива и способ шифрования в качестве параметров.

При создании активов можно указать три разных параметра для шифрования.

  • 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. Создает пустой Asset, используя метод CreateEmptyAsset, определенный в предыдущем шаге.

  2. Создает экземпляр AssetFile, связанный с Asset.

  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. Этот тип представляет клиент, который работает в BLOB-объектах Azure. В этом примере используется клиент для мониторинга прогресса отправки.

  5. Перечисляет файлы в указанном каталоге и создает экземпляр AssetFile для каждого файла.

  6. Отправляет файл в Службы Media Services, используя метод 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);
}

Далее можно перейти к следующему разделу: Массовое получение активов с помощью пакета SDK служб мультимедиа для .NET.

См. также

Показ:
© 2015 Microsoft