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

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

Обновлено: Август 2014 г.

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

noteПримечание
Службы Media Services используют значение свойства 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, как описано в теме Подключение к службам мультимедиа с помощью пакета 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. Этот тип представляет клиент, который выполняет операции с большими двоичными объектами 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.

См. также

Показ:
© 2014 Microsoft