Microsoft Windows Azure

Media Services

Разбить на страницы
Показывать лекцию целиком

Реализация медиа-сценариев с Windows Azure Media Services

Сервис Windows Azure Media Services формирует расширяемую пользователем облачную подплатформу для обработки мультимедиа-контента и имеет в своей основе платформу Windows Azure (обработка и хранение контента) и IIS Media Services (доставка контента). Сервис позволяет построить пользовательское приложение, перенеся все рутинные задачи по оборудованию, конвертированию, стримингу и другим задачам, связанным с мультимедиа, на облачные ресурсы.

Функциональность Windows Azure Media Services

Сервис Windows Azure Media Services предоставляет следующий набор функциональности для разработки мультимедиа-приложений в облаке:

Поглощение. Операция поглощения загружает так называемые ассеты в систему, например, загружает и кодирует их перед помещением непосредственно в хранилище.

Кодирование. Операции кодирования включают кодировние, трансформацию и конвертирование ассетов. Задачи кодирования в облаке можно запустить, используя Media Encoder, интегрированный в Windows Azure Media Services. Опции кодирования включают в себя следующие пункты: использование Windows Azure Media Encoder и работу с широким набором стандартных кодеков и форматов, включающим IIS Smooth Streaming, MP4 и конвертирование в Apple HTTP Live Streaming; конвертирование целых библиотек или отдельных файлов с полным контролем над входов и выходом; большой набор поддерживаемых типов файлов, форматов и кодеков; поддерживаемые направления конвертирования – Windows Azure Media Services позволяет конвертировать ISO MP4 (.mp4) в Smooth Streaming File Format (PIFF 1.3) (.ismv, .isma), Smooth Streaming File Format (PIFF) в Apple HTTP Live Streaming (.msu8, .ts). Также разработчики могут работать с форматом MPEG-DASH для трансляции контента по запросу (Video on Demand).

MPEG-DASH доступен также через функцию динамической упаковки (формат трансляции задается по запросу и формируется динамически без прохождения предварительного конвертирования).

Защита. Операция защиты контента означает шифрование live streaming или доступного по требованию контента для обеспечения безопасной передачи, хранения и доставки. WAMS предоставляет DRM-решение для защиты контента, которое поддерживает следующие DRM-технологии: Microsoft PlayReady Protection и MPEG Common Encryption.

Стриминг. Операция стриминга контента включает в себя как живой стриминг, так и доставку контента по требованию из облака. Windows Azure Media Services предоставляет решение для стриминга контента, поддерживая Smooth Streaming, Apple HTTP Live Streaming и MP4. Примечание: вы можете доставлять подобный контент, используя CDN Windows Azure или стороннего вендора.

Сценарии разработки с Media Services

В таблицу ниже сведены несколько общих сценариев разработки с использованием Windows Azure Media Services.

Сценарии разработки с Media Services
Сценарий Описание
Создание корпоративных решений Создание корпоративных мультимедиа-приложений, находящихся в облаке. Для этой задачи Windows Azure Media Services предлагает широкий спектр компонентов для реализации различных сценариев – от загрузки мультимедиа до доставки контента.
Создание гибридных решений Windows Azure Media Services может быть интегрирована с существующей локальной инфраструктурой: например, контент может кодироваться локально, после чего загружаться в Windows Azure Media Services для кодирования или конвертирования, после чего распространяться с использованием CDN. Windows Azure Media Services может быть вызван с помощью стандартных REST API для интеграции со внешними приложениями и сервисами.
Поддержка облака для мультимедиа-плееров Существуют средства разработки для iOS, Android и Windows-устройств.

Необходимо уточнить, что на данный момент Windows Azure Media Services поддерживает только ключевой сценарий VOD (Video-On-Demand), то есть сценарий загрузки контента, дальнейшего его конвертирования и доставки по точкам доставки. Например, контент может быть конвертирован в MP4/H.264 с использованием Smooth Streaming, Apple HTTP Live Streaming (HLS).

Термины Windows Azure Media Services

Asset

Ключевой термин, обозначающий сущность, содержащую информацию о контенте. Может состоять из одного или нескольких файлов, которые необходимо обработать – например, аудио, видео и т.д.

File

Файлы, хранящие контент для обработки, размещаются в хранилище блобов Windows Azure. Всегда ассоциируются с соответствующими ассетами.

Job

Работа – это сущность, которая отображает любую единицу работы, которая должна быть выполнена для обработки ассетов и файлов. Содержит набор задач (tasks).

Task

Операция, которую необходимо произвести над ассетом или файлом. Содержится в работе.

Locator

Запись, которая содержит URL. Используется для предоставления временного доступа к ассету. Работает в связке с политиками доступа.

Access Policies

Политики доступа используются для определения прав на ассет или файл (r/w/d/list/none) и временного промежутка, в пределах которого эти права работают.

Job Template

Шаблоны работ используются для сохранения периодически выполняемых работ.

Content Key

Ключи контента используются в процессе шифрования ассетов.

Task Template

Шаблоны задач используются для сохранения периодически выполняемых задач.

Ingestion

Процесс помещения ассетов в сервис Windows Azure Media Services – загрузка файлов в блобы, шифрование.

Использование Windows Azure Media Services

Регистрация Windows Azure Media Services, который используется для хранения, шифрования, управления и других задач управления контентом, происходит с помощью портала управления Windows Azure. Во время создания аккаунта Windows Azure Media Services происходит также создание аккаунта хранилища в том же регионе, где и аккаунт самого сервиса.

На портале управления Windows Azure необходимо нажать NEW | MEDIA SERVICES | QUICK CREATE и ввести данные в соответствующие поля.

(рис 13.1) Создание Windows Azure Media Services

Создадим новый проект C# Console Application и добавим в него ссылку на сборку System.Configuration. Добавим также ссылки на сборки Windows Azure SDK for .NET.(Microsoft.WindowsAzure.StorageClient.dll), Windows Azure Media Services SDK for .NET(Microsoft.WindowsAzure.MediaServices.Client.dll) и WCF Data Services 5.0 for OData V3(Microsoft.Data.OData.dll), используя Nuget-пакет windowsazure.mediaservices: для этого выберем TOOLS -> Library Package Manager -> Package Manager Console. В консоли введем Install-Package [package name] и нажмем Enter (в данном случае: Install-Package windowsazure.mediaservices.)

Добавим в файл app.config секцию Settings, и укажем значения имени и ключа аккаунта Windows Azure Media Services, которые должны быть записаны во время настройки аккаунта. В Visual Studio 2012 файл App.config добавляется автоматически. В Visual Studio 2010 необходимо создать файл вручную.

<configuration>
  . . . 
  <appSettings>
    <add key="accountName" value="Add-Media-Services-Account-Name" />
    <add key="accountKey" value="Add-Media-Services-Account-Key" />
  </appSettings>
</configuration>

Создадим новую директорию supportFiles на локальном диске. В ней будут храниться файлы для обработки. Добавим следующий код. Значение _supportFilespath должно совпадать с путем созданной ранее папки.

private static readonly string _supportFiles =
            Path.GetFullPath(@"../..\supportFiles");
private static readonly string _singleInputFilePath =
    Path.GetFullPath(_supportFiles + @"\multifile\interview2.wmv");
private static readonly string _outputFilesFolder =
Path.GetFullPath(_supportFiles + @"\outputfiles");

Добавим код, получающий настройки из файла настроек App.config.

private static readonly string _accountKey = ConfigurationManager.AppSettings["accountKey"];
private static readonly string _accountName = ConfigurationManager.AppSettings["accountName"];

Добавим код, создающий статическую ссылку на контекст.

// Контекст сервиса.
private static CloudMediaContext _context = null;

Контекст Media Services является объектом, содержащим все основные объекты и коллекции, использующиеся для доступа к Media Services, включая ссылки на такие важные коллекции, как коллекции работ (jobs), ассетов (assets), файлов (files), политик доступа, локаторов (locators) и прочего. Для того, чтобы программно использовать Media Services, необходимо получить и использовать контекст.

Добавим в файл Program.cs в метод Main код, который будет использоваться для получения имени и ключа аккаунта из файла app.config для создания контекста.

_context = new CloudMediaContext(_accountName, _accountKey);

Код, который будет рассмотрен далее, делает следующее:

  • Создает пустой ассет. При создании ассета возможно указать три различных опции для его шифрования:

    AssetCreationOptions.None: без шифрования

    AssetCreationOptions.CommonEncryptionProtected: для файлов Common Encryption Protected (CENC). Пример: набор файлов, которые уже зашифрованы PlayReady.

    AssetCreationOptions.StorageEncrypted: шифрование хранилища. Зашифровывает файл перед его загрузкой в хранилище Azure.

  • Создает экземпляр AssetFile, который ассоциируется с ассетом.
  • Создает экземпляр AccessPolicy, определяющий набор разрешений на доступ к ассету и время их действия.
  • Создает экземпляр Locator, который предоставляет доступ к ассету.
  • Загружает файл в Media Services. Процесс создания и загрузки называется "поглощением ассета" (ingesting asset).
  • Добавим в класс следующие методы.

    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;
    }
    
    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);
    
        var accessPolicy = _context.AccessPolicies.Create(assetName, TimeSpan.FromDays(3), 
    AccessPermissions.Write | AccessPermissions.List);
    
        var locator = _context.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy);
    
        Console.WriteLine("Upload {0}", assetFile.Name);
    
        assetFile.Upload(singleFilePath);
        Console.WriteLine("Done uploading of {0} using Upload()", assetFile.Name);
    
        locator.Delete();
        accessPolicy.Delete();
    
        return asset;
    }
    

    Добавим в метод Main после context = new CloudMediaContext(accountName, _accountKey); следующий код:

    IAsset asset = CreateAssetAndUploadSingleFile(AssetCreationOptions.None, _singleInputFilePath)
    

    В Windows Azure Media Services необходимо создавать работы (jobs) обработки мультимедиа-контента: шифрования, кодирования, конвертирования и т.д.. Работа Media Services всегда содержит в себе определение нескольких задач. Далее мы создадим простую задачу кодирования, после чего запустим ее на выполнение с Windows Azure Media Encoder. Задача будет использовать специальную строку настройки – пресет (preset) – для того, чтобы определить тип кодирования. Windows Azure Media Services поддерживвает аналогичный Microsoft Expression Encoder набор форматов.

    Ниже приведен метод CreateEncodingJob, который необходимо добавить в класс. Метод выполняет следующие задачи:

  • Определяет новую работу
  • Определяет обработчик мультимедиа (media processor) для обработки работы. Обработчик мультимедиа – это компонент, который выполняет шифрование, кодирование, конвертирование и другие задачи. Всего есть несколько доступных обработчиков, список которых можно получить, вызвав _context.MediaProcessors. Метод GetLatestMediaProcessorByName возвращает обработчик.
  • Определяет новую задачу. Каждая работа содержит одну и более задач. Задача определяется ее именем, экземпляром обработчика мультимедиа, строки конфигурации задачи и различных опций создания задачи. Строка конфигурации задачи определяет настройки кодирования. Например, здесь используется настройка H264 Broadband 720p, и этот пресет ведет к созданию одного файла MP4.
  • Добавляет в задачу входной ассет. В этом примере входной ассет был создан ранее.
  • Добавляет в задачу выходной ассет. Для выходного ассета определяется имя, булево значение, обозначающее, сохранять результат на сервере или нет, и AssetCreationOptions.None, обозначающий, что результат не шифруется при передаче и транспортировке.
  • Устанавливает работу в очередь.
  • Метод также демонстрирует выполнение других задач, таких как отслеживание статуса выполнения задачи и получение доступа к ассету, созданному работой кодирования.

    static IJob CreateEncodingJob(IAsset asset, string inputMediaFilePath, string outputFolder)
    {
        IJob job = _context.Jobs.Create("My encoding job");
    
        IMediaProcessor processor = GetLatestMediaProcessorByName("Windows Azure Media Encoder");
    
        ITask task = job.Tasks.AddNew("My encoding task",
            processor,
            "H264 Broadband 720p",
            Microsoft.WindowsAzure.MediaServices.Client.TaskOptions.ProtectedConfiguration);
    
        task.InputAssets.Add(asset);
        task.OutputAssets.AddNew("Output asset",
            AssetCreationOptions.None);
        job.StateChanged += new
                EventHandler<JobStateChangedEventArgs>(StateChanged);
        job.Submit();
    
        LogJobDetails(job.Id);
    
        // Проверка выполнения работы и ожидание ее окончания. 
        Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);
        progressJobTask.Wait();
    
        // Код показывает, как можно получить доступ к ассетам-результату работы двумя способами – 
    созданием URL-ов к ассетам и простому скачиванию 
    
        job = GetJob(job.Id);
    
        if (job.State == JobState.Error)
        {
            Console.WriteLine("\nExiting method due to job error.");
            return job;
        }
    
        IAsset outputAsset = job.OutputMediaAssets[0];
        IAccessPolicy policy = null;
        ILocator locator = null;
    
        policy =
            _context.AccessPolicies.Create("My 30 days readonly policy",
                TimeSpan.FromDays(30),
                AccessPermissions.Read);
    
        // Создание локатора Shared Access Signature для предоставления прямого доступа 
    к ассету в хранилище блобов. Можно вызывать синхронный или асинхронный метод создания. 
    Можно задавать опциональный параметр startTime, равный значению, 
    на пять минут раннему нежели  Now, 
    для выравнивания различий во времени между часами клиента и сервера. 
    
        locator = _context.Locators.CreateLocator(LocatorType.Sas, outputAsset,
            policy,
            DateTime.UtcNow.AddMinutes(-5));
    
        List<String> sasUrlList = GetAssetSasUrlList(outputAsset, locator);
    
        // Запись списка URL-ов в локальный файл. Можно использовать 
    сохраненные URL-ы для получения файлов ассета. 
        if (sasUrlList != null)
        {
            string outFilePath = Path.GetFullPath(outputFolder + @"\" + "FileSasUrlList.txt");
            StringBuilder fileList = new StringBuilder();
            foreach (string url in sasUrlList)
            {
                fileList.AppendLine(url);
                fileList.AppendLine();
            }
            WriteToFile(outFilePath, fileList.ToString());
    
            DownloadAssetToLocal(job.Id, outputFolder);
        }
    
    
        return job;
    }
    

    Добавим в метод Main вызов метода CreateEncodingJob после добавленного ранее кода.

    CreateEncodingJob(asset, _singleInputFilePath, _outputFilesFolder);
    

    Добавим приведенный ниже код, необходимый для выполнения метода CreateEncodingJob. Он выполняет следующие задачи:

    1. Метод GetLatestMediaProcessorByName возвращает обработчик мультимедиа, выполняющий различные задачи. Вы создаете обработчик, используя имя обработчика. Возможные значения имени: Windows Azure Media Encoder,Windows Azure Media Packager,Windows Azure Media Encryptor,Storage Decryption.

    private static IMediaProcessor GetLatestMediaProcessorByName(string mediaProcessorName)
    {
           var processor = _context.MediaProcessors.Where(p => p.Name == mediaProcessorName).
            ToList().OrderBy(p => new Version(p.Version)).LastOrDefault();
    
        if (processor == null)
            throw new ArgumentException(string.Format("Unknown media processor", mediaProcessorName));
    
        return processor;
    }
    

    Код ниже содержит обработчик события StateChanged, необходимый для отслеживания выполнения работы и логирования.

    private static void StateChanged(object sender, JobStateChangedEventArgs e)
    {
        Console.WriteLine("Job state changed event:");
        Console.WriteLine("  Previous state: " + e.PreviousState);
        Console.WriteLine("  Current state: " + e.CurrentState);
    
        switch (e.CurrentState)
        {
            case JobState.Finished:
                Console.WriteLine();
                Console.WriteLine("********************");
                Console.WriteLine("Job is finished.");
                Console.WriteLine("Please wait while local tasks or downloads complete...");
                Console.WriteLine("********************");
                Console.WriteLine();
                Console.WriteLine();
                break;
            case JobState.Canceling:
            case JobState.Queued:
            case JobState.Scheduled:
            case JobState.Processing:
                Console.WriteLine("Please wait...\n");
                break;
            case JobState.Canceled:
            case JobState.Error:
                // Приведение к типу
                IJob job = (IJob)sender;
                // Логирование
                LogJobStop(job.Id);
                break;
            default:
                break;
        }
    }
    
    private static void LogJobStop(string jobId)
    {
        StringBuilder builder = new StringBuilder();
        IJob job = GetJob(jobId);
    
        builder.AppendLine("\nThe job stopped due to cancellation or an error.");
        builder.AppendLine("***************************");
        builder.AppendLine("Job ID: " + job.Id);
        builder.AppendLine("Job Name: " + job.Name);
        builder.AppendLine("Job State: " + job.State.ToString());
        builder.AppendLine("Media Services account name: " + _accountName);
    
        if (job.State == JobState.Error)
        {
            builder.Append("Error Details: \n");
            foreach (ITask task in job.Tasks)
            {
                foreach (ErrorDetail detail in task.ErrorDetails)
                {
                    builder.AppendLine("  Task Id: " + task.Id);
                    builder.AppendLine("    Error Code: " + detail.Code);
                    builder.AppendLine("    Error Message: " + detail.Message + "\n");
                }
            }
        }
        builder.AppendLine("***************************\n");
    
        string outputFile = _outputFilesFolder + @"\JobStop-" + JobIdAsFileName(job.Id) + ".txt";
        WriteToFile(outputFile, builder.ToString());
        Console.Write(builder.ToString());
    }
    
    private static void LogJobDetails(string jobId)
    {
        StringBuilder builder = new StringBuilder();
        IJob job = GetJob(jobId);
    
        builder.AppendLine("\nJob ID: " + job.Id);
        builder.AppendLine("Job Name: " + job.Name);
        builder.AppendLine("Job submitted (client UTC time): " + DateTime.UtcNow.ToString());
        builder.AppendLine("Media Services account name: " + _accountName);
    
        string outputFile = _outputFilesFolder + @"\JobDetails-" + JobIdAsFileName(job.Id) + ".txt";
        WriteToFile(outputFile, builder.ToString());
        Console.Write(builder.ToString());
    }
    
    private static string JobIdAsFileName(string jobID)
    {
        return jobID.Replace(":", "_");
    }
    

    Метод WriteToFile записывает файл в указанную директорию.

    static void WriteToFile(string outFilePath, string fileContent)
    {
        StreamWriter sr = File.CreateText(outFilePath);
        sr.Write(fileContent);
        sr.Close();
    }
    

    После получения ассетов получить к ним доступ возможно двумя способами:

  • Создав SAS URL ассета на сервере
  • Скачав ассеты с сервера
  • Метод GetAssetSasUrlList создает список SAS URL-ов на все файл ассета.

    static List<String> GetAssetSasUrlList(IAsset asset, ILocator locator)
    {
        List<String> fileSasUrlList = new List<String>();
    
        foreach (IAssetFile file in asset.AssetFiles)
        {
            string sasUrl = BuildFileSasUrl(file, locator);
            fileSasUrlList.Add(sasUrl);
        }
        return fileSasUrlList;
    }
    
    static string BuildFileSasUrl(IAssetFile file, ILocator locator)
    {
        // Получение пути-локатора, добавление имени файла для получения полного SAS URL для доступа к файлу. 
        var uriBuilder = new UriBuilder(locator.Path);
        uriBuilder.Path += "/" + file.Name;
    
        Console.WriteLine("Locator path: ");
        Console.WriteLine(locator.Path);
        Console.WriteLine();
        Console.WriteLine("Full URL to file: ");
        Console.WriteLine(uriBuilder.Uri.AbsoluteUri);
        Console.WriteLine();
    
        return uriBuilder.Uri.AbsoluteUri;
    }
    

    Метод DownloadAssetToLocal скачивает все файлы ассета в локальную директорию. В данном примере, так как ассет был создан из одного входящего файла, выходной ассет будет иметь колллекцию, содержащую два файла – закодированный файл (.mp4) и .xml файл с метаданными ассета. Метод скачивает оба файла.

    static IAsset DownloadAssetToLocal(string jobId, string outputFolder)
    {
        // Этот метод показывает, как скачивать один ассет. Доступ ко всем ассетам можно получить 
    с помощью коллекции OutputAssets. 
        IJob job = GetJob(jobId);
        IAsset outputAsset = job.OutputMediaAssets[0];
    
        IAccessPolicy accessPolicy = _context.AccessPolicies.Create("File Download Policy", 
    TimeSpan.FromDays(30), AccessPermissions.Read);
        ILocator locator = _context.Locators.CreateSasLocator(outputAsset, accessPolicy);
        BlobTransferClient blobTransfer = new BlobTransferClient
        {
            NumberOfConcurrentTransfers = 10,
            ParallelTransferThreadCount = 10
        };
    
        var downloadTasks = new List<Task>();
        foreach (IAssetFile outputFile in outputAsset.AssetFiles)
        {
            outputFile.DownloadProgressChanged += DownloadProgress;
    
            string localDownloadPath = Path.Combine(outputFolder, outputFile.Name);
    
            Console.WriteLine("File download path:  " + localDownloadPath);
    
            downloadTasks.Add(outputFile.DownloadAsync(Path.GetFullPath(localDownloadPath), 
    blobTransfer, locator, CancellationToken.None));
    
            outputFile.DownloadProgressChanged -= DownloadProgress;
        }
    
        Task.WaitAll(downloadTasks.ToArray());
    
        return outputAsset;
    }
    
    static void DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine(string.Format("{0} % download progress. ", e.Progress));
    }
    

    Методы GetJob и GetAsset запрашивают и возвращают ссылки на работу и ассет с указанными идентификаторами.

    static IJob GetJob(string jobId)
    {
    
        var jobInstance =
            from j in _context.Jobs
            where j.Id == jobId
            select j;
    
        IJob job = jobInstance.FirstOrDefault();
    
        return job;
    }
    static IAsset GetAsset(string assetId)
    {
        var assetInstance =
            from a in _context.Assets
            where a.Id == assetId
            select a;
    
        IAsset asset = assetInstance.FirstOrDefault();
    
        return asset;
    }
    

    Нажмем F5. В консоль должен быть выведен подобный приведенному ниже текст (ниже приведен сокращенный вариант):

    Asset name: UploadSingleFile_11/14/2012 10:09:11 PM
    Time created: 11/14/2012 12:00:00 AM
    Created assetFile interview2.wmv
    Upload interview2.wmv
    Done uploading of interview2.wmv using Upload()
    
    …
    
    Locator path:
    https://mediasvcd08mtz29tcpws.blob.core.windows-int.net/asset-4f5b42f4-3ade-4c2c
    -9d48-44900d4f6b62?st=2012-11-14T22%3A07%3A01Zse=2012-11-14T23%3A07%3A01Zsr=c
    si=d07ec40c-02d7-4642-8e54-443b79f3ba3csig=XKMo0qJI5w8Fod3NsV%2FBxERnav8Jb6hL7f
    xylq3oESc%3D
    
    Full URL to file:
    https://mediasvcd08mtz29tcpws.blob.core.windows-int.net/asset-4f5b42f4-3ade-4c2c
    -9d48-44900d4f6b62/interview2_metadata.xml?st=2012-11-14T22%3A07%3A01Zse=2012-1
    1-14T23%3A07%3A01Zsr=csi=d07ec40c-02d7-4642-8e54-443b79f3ba3csig=XKMo0qJI5w8F
    od3NsV%2FBxERnav8Jb6hL7fxylq3oESc%3D
    
    Downloads are in progress, please wait.
    
    File download path:  C:\supportFiles\outputfiles\interview2.mp4
    1.70952185308162 % download progress.
    3.68508804454907 % download progress.
    6.48870388360293 % download progress.
    6.83808741232649 % download progress.
    . . . 
    99.0763740574049 % download progress.
    99.1522674787341 % download progress.
    100 % download progress.
    File download path:  C:\supportFiles\outputfiles\interview2_metadata.xml
    100 % download progress.
    

    После запуска приложения происходит следующая последовательность действий:

  • В Media Services загружается .wmv.
  • Файл кодируется с использованием H264 Broadband 720p. Windows Azure Media Encoder.
  • В supportFiles\outputFiles создается файл FileSasUrlList.txt, содержащий URL на закодированный ассет.
  • Файлы .mp4 и _metadata.xmml скачиваются в директорию outputFiles.
  • Масштабирование Media Services

    На платформе Windows Azure доступно два режима масштабирования различных аспектов функциональности Media Service: On-Demand Streaming Reserved Units и Encoding Reserved Units.

    On-Demand Streaming Reserved Units

    On-Demand Streaming Units – это специально зарезервированные ресурсы, состоящие из двух компонент – исходящей пропускной способности (с инкрементом в 200 Мбит) и дополнительной функциональностью. По умолчанию стриминг осуществляется на Shared-основе, то есть пропускная способность и другие ресурсы делятся между несколькими пользователями. По этой причине многие проекты могут испытывать недостаток в мощностях, который может быть покрыт с помощью выделения зарезервированных ресурсов. Для того, чтобы сделать это, необходимо на панели управления Media Service перейти на вкладку ORIGINS, выбрать default и указать необходимое количество юнитов (равных 200 Мбит).

    (рис 13.2) Масштабирование пропускной способности

    Encoding Reserved Units

    Путем увеличения количества Encoding Reserved Units разработчик увеличивает количество одновременно обрабатывающихся мультимедиа-задач (Tasks). Таким образом, подняв это количество до 25 (максимальное количество), разработчик укажет, что в один момент времени может происходить обработка 25 задач, если таковое количество наличествует.

    Для изменения количества Encoding Reserved Units достаточно указать необходимое количество на вкладке PROCESSORS панели управления Media Services.

    (рис 13.3) Масштабирование зарезервированных ресурсов

    Заключение

    Сервис Windows Azure Media Services предоставляет возможность переноса нагрузок по кодированию и прочим задачам обработки мультимедиа-контента с локальных ресурсов на облачные. Сервис Windows Azure Media Services является масштабируемым и эффективным решением, способным выдержать любые нагрузки, в том числе такие, какие были, например, на Олимпиаде в Лондоне, трансляция которой была реализована с помощью облачного сервиса Windows Azure Media Services.

    Страницы:

    Реализация медиа-сценариев с Windows Azure Media Services

    Сервис Windows Azure Media Services формирует расширяемую пользователем облачную подплатформу для обработки мультимедиа-контента и имеет в своей основе платформу Windows Azure (обработка и хранение контента) и IIS Media Services (доставка контента). Сервис позволяет построить пользовательское приложение, перенеся все рутинные задачи по оборудованию, конвертированию, стримингу и другим задачам, связанным с мультимедиа, на облачные ресурсы.

    Функциональность Windows Azure Media Services

    Сервис Windows Azure Media Services предоставляет следующий набор функциональности для разработки мультимедиа-приложений в облаке:

    Поглощение. Операция поглощения загружает так называемые ассеты в систему, например, загружает и кодирует их перед помещением непосредственно в хранилище.

    Кодирование. Операции кодирования включают кодировние, трансформацию и конвертирование ассетов. Задачи кодирования в облаке можно запустить, используя Media Encoder, интегрированный в Windows Azure Media Services. Опции кодирования включают в себя следующие пункты: использование Windows Azure Media Encoder и работу с широким набором стандартных кодеков и форматов, включающим IIS Smooth Streaming, MP4 и конвертирование в Apple HTTP Live Streaming; конвертирование целых библиотек или отдельных файлов с полным контролем над входов и выходом; большой набор поддерживаемых типов файлов, форматов и кодеков; поддерживаемые направления конвертирования – Windows Azure Media Services позволяет конвертировать ISO MP4 (.mp4) в Smooth Streaming File Format (PIFF 1.3) (.ismv, .isma), Smooth Streaming File Format (PIFF) в Apple HTTP Live Streaming (.msu8, .ts). Также разработчики могут работать с форматом MPEG-DASH для трансляции контента по запросу (Video on Demand).

    MPEG-DASH доступен также через функцию динамической упаковки (формат трансляции задается по запросу и формируется динамически без прохождения предварительного конвертирования).

    Защита. Операция защиты контента означает шифрование live streaming или доступного по требованию контента для обеспечения безопасной передачи, хранения и доставки. WAMS предоставляет DRM-решение для защиты контента, которое поддерживает следующие DRM-технологии: Microsoft PlayReady Protection и MPEG Common Encryption.

    Стриминг. Операция стриминга контента включает в себя как живой стриминг, так и доставку контента по требованию из облака. Windows Azure Media Services предоставляет решение для стриминга контента, поддерживая Smooth Streaming, Apple HTTP Live Streaming и MP4. Примечание: вы можете доставлять подобный контент, используя CDN Windows Azure или стороннего вендора.

    Сценарии разработки с Media Services

    В таблицу ниже сведены несколько общих сценариев разработки с использованием Windows Azure Media Services.

    Сценарии разработки с Media Services
    Сценарий Описание
    Создание корпоративных решений Создание корпоративных мультимедиа-приложений, находящихся в облаке. Для этой задачи Windows Azure Media Services предлагает широкий спектр компонентов для реализации различных сценариев – от загрузки мультимедиа до доставки контента.
    Создание гибридных решений Windows Azure Media Services может быть интегрирована с существующей локальной инфраструктурой: например, контент может кодироваться локально, после чего загружаться в Windows Azure Media Services для кодирования или конвертирования, после чего распространяться с использованием CDN. Windows Azure Media Services может быть вызван с помощью стандартных REST API для интеграции со внешними приложениями и сервисами.
    Поддержка облака для мультимедиа-плееров Существуют средства разработки для iOS, Android и Windows-устройств.

    Необходимо уточнить, что на данный момент Windows Azure Media Services поддерживает только ключевой сценарий VOD (Video-On-Demand), то есть сценарий загрузки контента, дальнейшего его конвертирования и доставки по точкам доставки. Например, контент может быть конвертирован в MP4/H.264 с использованием Smooth Streaming, Apple HTTP Live Streaming (HLS).

    Термины Windows Azure Media Services

    Asset

    Ключевой термин, обозначающий сущность, содержащую информацию о контенте. Может состоять из одного или нескольких файлов, которые необходимо обработать – например, аудио, видео и т.д.

    File

    Файлы, хранящие контент для обработки, размещаются в хранилище блобов Windows Azure. Всегда ассоциируются с соответствующими ассетами.

    Job

    Работа – это сущность, которая отображает любую единицу работы, которая должна быть выполнена для обработки ассетов и файлов. Содержит набор задач (tasks).

    Task

    Операция, которую необходимо произвести над ассетом или файлом. Содержится в работе.

    Locator

    Запись, которая содержит URL. Используется для предоставления временного доступа к ассету. Работает в связке с политиками доступа.

    Access Policies

    Политики доступа используются для определения прав на ассет или файл (r/w/d/list/none) и временного промежутка, в пределах которого эти права работают.

    Job Template

    Шаблоны работ используются для сохранения периодически выполняемых работ.

    Content Key

    Ключи контента используются в процессе шифрования ассетов.

    Task Template

    Шаблоны задач используются для сохранения периодически выполняемых задач.

    Ingestion

    Процесс помещения ассетов в сервис Windows Azure Media Services – загрузка файлов в блобы, шифрование.

    Использование Windows Azure Media Services

    Регистрация Windows Azure Media Services, который используется для хранения, шифрования, управления и других задач управления контентом, происходит с помощью портала управления Windows Azure. Во время создания аккаунта Windows Azure Media Services происходит также создание аккаунта хранилища в том же регионе, где и аккаунт самого сервиса.

    На портале управления Windows Azure необходимо нажать NEW | MEDIA SERVICES | QUICK CREATE и ввести данные в соответствующие поля.

    (рис 13.1) Создание Windows Azure Media Services

    Создадим новый проект C# Console Application и добавим в него ссылку на сборку System.Configuration. Добавим также ссылки на сборки Windows Azure SDK for .NET.(Microsoft.WindowsAzure.StorageClient.dll), Windows Azure Media Services SDK for .NET(Microsoft.WindowsAzure.MediaServices.Client.dll) и WCF Data Services 5.0 for OData V3(Microsoft.Data.OData.dll), используя Nuget-пакет windowsazure.mediaservices: для этого выберем TOOLS -> Library Package Manager -> Package Manager Console. В консоли введем Install-Package [package name] и нажмем Enter (в данном случае: Install-Package windowsazure.mediaservices.)

    Добавим в файл app.config секцию Settings, и укажем значения имени и ключа аккаунта Windows Azure Media Services, которые должны быть записаны во время настройки аккаунта. В Visual Studio 2012 файл App.config добавляется автоматически. В Visual Studio 2010 необходимо создать файл вручную.

    <configuration>
      . . . 
      <appSettings>
        <add key="accountName" value="Add-Media-Services-Account-Name" />
        <add key="accountKey" value="Add-Media-Services-Account-Key" />
      </appSettings>
    </configuration>
    

    Создадим новую директорию supportFiles на локальном диске. В ней будут храниться файлы для обработки. Добавим следующий код. Значение _supportFilespath должно совпадать с путем созданной ранее папки.

    private static readonly string _supportFiles =
                Path.GetFullPath(@"../..\supportFiles");
    private static readonly string _singleInputFilePath =
        Path.GetFullPath(_supportFiles + @"\multifile\interview2.wmv");
    private static readonly string _outputFilesFolder =
    Path.GetFullPath(_supportFiles + @"\outputfiles");
    

    Добавим код, получающий настройки из файла настроек App.config.

    private static readonly string _accountKey = ConfigurationManager.AppSettings["accountKey"];
    private static readonly string _accountName = ConfigurationManager.AppSettings["accountName"];
    

    Добавим код, создающий статическую ссылку на контекст.

    // Контекст сервиса.
    private static CloudMediaContext _context = null;
    

    Контекст Media Services является объектом, содержащим все основные объекты и коллекции, использующиеся для доступа к Media Services, включая ссылки на такие важные коллекции, как коллекции работ (jobs), ассетов (assets), файлов (files), политик доступа, локаторов (locators) и прочего. Для того, чтобы программно использовать Media Services, необходимо получить и использовать контекст.

    Добавим в файл Program.cs в метод Main код, который будет использоваться для получения имени и ключа аккаунта из файла app.config для создания контекста.

    _context = new CloudMediaContext(_accountName, _accountKey);
    

    Код, который будет рассмотрен далее, делает следующее:

  • Создает пустой ассет. При создании ассета возможно указать три различных опции для его шифрования:

    AssetCreationOptions.None: без шифрования

    AssetCreationOptions.CommonEncryptionProtected: для файлов Common Encryption Protected (CENC). Пример: набор файлов, которые уже зашифрованы PlayReady.

    AssetCreationOptions.StorageEncrypted: шифрование хранилища. Зашифровывает файл перед его загрузкой в хранилище Azure.

  • Создает экземпляр AssetFile, который ассоциируется с ассетом.
  • Создает экземпляр AccessPolicy, определяющий набор разрешений на доступ к ассету и время их действия.
  • Создает экземпляр Locator, который предоставляет доступ к ассету.
  • Загружает файл в Media Services. Процесс создания и загрузки называется "поглощением ассета" (ingesting asset).
  • Добавим в класс следующие методы.

    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;
    }
    
    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);
    
        var accessPolicy = _context.AccessPolicies.Create(assetName, TimeSpan.FromDays(3), 
    AccessPermissions.Write | AccessPermissions.List);
    
        var locator = _context.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy);
    
        Console.WriteLine("Upload {0}", assetFile.Name);
    
        assetFile.Upload(singleFilePath);
        Console.WriteLine("Done uploading of {0} using Upload()", assetFile.Name);
    
        locator.Delete();
        accessPolicy.Delete();
    
        return asset;
    }
    

    Добавим в метод Main после context = new CloudMediaContext(accountName, _accountKey); следующий код:

    IAsset asset = CreateAssetAndUploadSingleFile(AssetCreationOptions.None, _singleInputFilePath)
    

    В Windows Azure Media Services необходимо создавать работы (jobs) обработки мультимедиа-контента: шифрования, кодирования, конвертирования и т.д.. Работа Media Services всегда содержит в себе определение нескольких задач. Далее мы создадим простую задачу кодирования, после чего запустим ее на выполнение с Windows Azure Media Encoder. Задача будет использовать специальную строку настройки – пресет (preset) – для того, чтобы определить тип кодирования. Windows Azure Media Services поддерживвает аналогичный Microsoft Expression Encoder набор форматов.

    Ниже приведен метод CreateEncodingJob, который необходимо добавить в класс. Метод выполняет следующие задачи:

  • Определяет новую работу
  • Определяет обработчик мультимедиа (media processor) для обработки работы. Обработчик мультимедиа – это компонент, который выполняет шифрование, кодирование, конвертирование и другие задачи. Всего есть несколько доступных обработчиков, список которых можно получить, вызвав _context.MediaProcessors. Метод GetLatestMediaProcessorByName возвращает обработчик.
  • Определяет новую задачу. Каждая работа содержит одну и более задач. Задача определяется ее именем, экземпляром обработчика мультимедиа, строки конфигурации задачи и различных опций создания задачи. Строка конфигурации задачи определяет настройки кодирования. Например, здесь используется настройка H264 Broadband 720p, и этот пресет ведет к созданию одного файла MP4.
  • Добавляет в задачу входной ассет. В этом примере входной ассет был создан ранее.
  • Добавляет в задачу выходной ассет. Для выходного ассета определяется имя, булево значение, обозначающее, сохранять результат на сервере или нет, и AssetCreationOptions.None, обозначающий, что результат не шифруется при передаче и транспортировке.
  • Устанавливает работу в очередь.
  • Метод также демонстрирует выполнение других задач, таких как отслеживание статуса выполнения задачи и получение доступа к ассету, созданному работой кодирования.

    static IJob CreateEncodingJob(IAsset asset, string inputMediaFilePath, string outputFolder)
    {
        IJob job = _context.Jobs.Create("My encoding job");
    
        IMediaProcessor processor = GetLatestMediaProcessorByName("Windows Azure Media Encoder");
    
        ITask task = job.Tasks.AddNew("My encoding task",
            processor,
            "H264 Broadband 720p",
            Microsoft.WindowsAzure.MediaServices.Client.TaskOptions.ProtectedConfiguration);
    
        task.InputAssets.Add(asset);
        task.OutputAssets.AddNew("Output asset",
            AssetCreationOptions.None);
        job.StateChanged += new
                EventHandler<JobStateChangedEventArgs>(StateChanged);
        job.Submit();
    
        LogJobDetails(job.Id);
    
        // Проверка выполнения работы и ожидание ее окончания. 
        Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);
        progressJobTask.Wait();
    
        // Код показывает, как можно получить доступ к ассетам-результату работы двумя способами – 
    созданием URL-ов к ассетам и простому скачиванию 
    
        job = GetJob(job.Id);
    
        if (job.State == JobState.Error)
        {
            Console.WriteLine("\nExiting method due to job error.");
            return job;
        }
    
        IAsset outputAsset = job.OutputMediaAssets[0];
        IAccessPolicy policy = null;
        ILocator locator = null;
    
        policy =
            _context.AccessPolicies.Create("My 30 days readonly policy",
                TimeSpan.FromDays(30),
                AccessPermissions.Read);
    
        // Создание локатора Shared Access Signature для предоставления прямого доступа 
    к ассету в хранилище блобов. Можно вызывать синхронный или асинхронный метод создания. 
    Можно задавать опциональный параметр startTime, равный значению, 
    на пять минут раннему нежели  Now, 
    для выравнивания различий во времени между часами клиента и сервера. 
    
        locator = _context.Locators.CreateLocator(LocatorType.Sas, outputAsset,
            policy,
            DateTime.UtcNow.AddMinutes(-5));
    
        List<String> sasUrlList = GetAssetSasUrlList(outputAsset, locator);
    
        // Запись списка URL-ов в локальный файл. Можно использовать 
    сохраненные URL-ы для получения файлов ассета. 
        if (sasUrlList != null)
        {
            string outFilePath = Path.GetFullPath(outputFolder + @"\" + "FileSasUrlList.txt");
            StringBuilder fileList = new StringBuilder();
            foreach (string url in sasUrlList)
            {
                fileList.AppendLine(url);
                fileList.AppendLine();
            }
            WriteToFile(outFilePath, fileList.ToString());
    
            DownloadAssetToLocal(job.Id, outputFolder);
        }
    
    
        return job;
    }
    

    Добавим в метод Main вызов метода CreateEncodingJob после добавленного ранее кода.

    CreateEncodingJob(asset, _singleInputFilePath, _outputFilesFolder);
    

    Добавим приведенный ниже код, необходимый для выполнения метода CreateEncodingJob. Он выполняет следующие задачи:

    1. Метод GetLatestMediaProcessorByName возвращает обработчик мультимедиа, выполняющий различные задачи. Вы создаете обработчик, используя имя обработчика. Возможные значения имени: Windows Azure Media Encoder,Windows Azure Media Packager,Windows Azure Media Encryptor,Storage Decryption.

    private static IMediaProcessor GetLatestMediaProcessorByName(string mediaProcessorName)
    {
           var processor = _context.MediaProcessors.Where(p => p.Name == mediaProcessorName).
            ToList().OrderBy(p => new Version(p.Version)).LastOrDefault();
    
        if (processor == null)
            throw new ArgumentException(string.Format("Unknown media processor", mediaProcessorName));
    
        return processor;
    }
    

    Код ниже содержит обработчик события StateChanged, необходимый для отслеживания выполнения работы и логирования.

    private static void StateChanged(object sender, JobStateChangedEventArgs e)
    {
        Console.WriteLine("Job state changed event:");
        Console.WriteLine("  Previous state: " + e.PreviousState);
        Console.WriteLine("  Current state: " + e.CurrentState);
    
        switch (e.CurrentState)
        {
            case JobState.Finished:
                Console.WriteLine();
                Console.WriteLine("********************");
                Console.WriteLine("Job is finished.");
                Console.WriteLine("Please wait while local tasks or downloads complete...");
                Console.WriteLine("********************");
                Console.WriteLine();
                Console.WriteLine();
                break;
            case JobState.Canceling:
            case JobState.Queued:
            case JobState.Scheduled:
            case JobState.Processing:
                Console.WriteLine("Please wait...\n");
                break;
            case JobState.Canceled:
            case JobState.Error:
                // Приведение к типу
                IJob job = (IJob)sender;
                // Логирование
                LogJobStop(job.Id);
                break;
            default:
                break;
        }
    }
    
    private static void LogJobStop(string jobId)
    {
        StringBuilder builder = new StringBuilder();
        IJob job = GetJob(jobId);
    
        builder.AppendLine("\nThe job stopped due to cancellation or an error.");
        builder.AppendLine("***************************");
        builder.AppendLine("Job ID: " + job.Id);
        builder.AppendLine("Job Name: " + job.Name);
        builder.AppendLine("Job State: " + job.State.ToString());
        builder.AppendLine("Media Services account name: " + _accountName);
    
        if (job.State == JobState.Error)
        {
            builder.Append("Error Details: \n");
            foreach (ITask task in job.Tasks)
            {
                foreach (ErrorDetail detail in task.ErrorDetails)
                {
                    builder.AppendLine("  Task Id: " + task.Id);
                    builder.AppendLine("    Error Code: " + detail.Code);
                    builder.AppendLine("    Error Message: " + detail.Message + "\n");
                }
            }
        }
        builder.AppendLine("***************************\n");
    
        string outputFile = _outputFilesFolder + @"\JobStop-" + JobIdAsFileName(job.Id) + ".txt";
        WriteToFile(outputFile, builder.ToString());
        Console.Write(builder.ToString());
    }
    
    private static void LogJobDetails(string jobId)
    {
        StringBuilder builder = new StringBuilder();
        IJob job = GetJob(jobId);
    
        builder.AppendLine("\nJob ID: " + job.Id);
        builder.AppendLine("Job Name: " + job.Name);
        builder.AppendLine("Job submitted (client UTC time): " + DateTime.UtcNow.ToString());
        builder.AppendLine("Media Services account name: " + _accountName);
    
        string outputFile = _outputFilesFolder + @"\JobDetails-" + JobIdAsFileName(job.Id) + ".txt";
        WriteToFile(outputFile, builder.ToString());
        Console.Write(builder.ToString());
    }
    
    private static string JobIdAsFileName(string jobID)
    {
        return jobID.Replace(":", "_");
    }
    

    Метод WriteToFile записывает файл в указанную директорию.

    static void WriteToFile(string outFilePath, string fileContent)
    {
        StreamWriter sr = File.CreateText(outFilePath);
        sr.Write(fileContent);
        sr.Close();
    }
    

    После получения ассетов получить к ним доступ возможно двумя способами:

  • Создав SAS URL ассета на сервере
  • Скачав ассеты с сервера
  • Метод GetAssetSasUrlList создает список SAS URL-ов на все файл ассета.

    static List<String> GetAssetSasUrlList(IAsset asset, ILocator locator)
    {
        List<String> fileSasUrlList = new List<String>();
    
        foreach (IAssetFile file in asset.AssetFiles)
        {
            string sasUrl = BuildFileSasUrl(file, locator);
            fileSasUrlList.Add(sasUrl);
        }
        return fileSasUrlList;
    }
    
    static string BuildFileSasUrl(IAssetFile file, ILocator locator)
    {
        // Получение пути-локатора, добавление имени файла для получения полного SAS URL для доступа к файлу. 
        var uriBuilder = new UriBuilder(locator.Path);
        uriBuilder.Path += "/" + file.Name;
    
        Console.WriteLine("Locator path: ");
        Console.WriteLine(locator.Path);
        Console.WriteLine();
        Console.WriteLine("Full URL to file: ");
        Console.WriteLine(uriBuilder.Uri.AbsoluteUri);
        Console.WriteLine();
    
        return uriBuilder.Uri.AbsoluteUri;
    }
    

    Метод DownloadAssetToLocal скачивает все файлы ассета в локальную директорию. В данном примере, так как ассет был создан из одного входящего файла, выходной ассет будет иметь колллекцию, содержащую два файла – закодированный файл (.mp4) и .xml файл с метаданными ассета. Метод скачивает оба файла.

    static IAsset DownloadAssetToLocal(string jobId, string outputFolder)
    {
        // Этот метод показывает, как скачивать один ассет. Доступ ко всем ассетам можно получить 
    с помощью коллекции OutputAssets. 
        IJob job = GetJob(jobId);
        IAsset outputAsset = job.OutputMediaAssets[0];
    
        IAccessPolicy accessPolicy = _context.AccessPolicies.Create("File Download Policy", 
    TimeSpan.FromDays(30), AccessPermissions.Read);
        ILocator locator = _context.Locators.CreateSasLocator(outputAsset, accessPolicy);
        BlobTransferClient blobTransfer = new BlobTransferClient
        {
            NumberOfConcurrentTransfers = 10,
            ParallelTransferThreadCount = 10
        };
    
        var downloadTasks = new List<Task>();
        foreach (IAssetFile outputFile in outputAsset.AssetFiles)
        {
            outputFile.DownloadProgressChanged += DownloadProgress;
    
            string localDownloadPath = Path.Combine(outputFolder, outputFile.Name);
    
            Console.WriteLine("File download path:  " + localDownloadPath);
    
            downloadTasks.Add(outputFile.DownloadAsync(Path.GetFullPath(localDownloadPath), 
    blobTransfer, locator, CancellationToken.None));
    
            outputFile.DownloadProgressChanged -= DownloadProgress;
        }
    
        Task.WaitAll(downloadTasks.ToArray());
    
        return outputAsset;
    }
    
    static void DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine(string.Format("{0} % download progress. ", e.Progress));
    }
    

    Методы GetJob и GetAsset запрашивают и возвращают ссылки на работу и ассет с указанными идентификаторами.

    static IJob GetJob(string jobId)
    {
    
        var jobInstance =
            from j in _context.Jobs
            where j.Id == jobId
            select j;
    
        IJob job = jobInstance.FirstOrDefault();
    
        return job;
    }
    static IAsset GetAsset(string assetId)
    {
        var assetInstance =
            from a in _context.Assets
            where a.Id == assetId
            select a;
    
        IAsset asset = assetInstance.FirstOrDefault();
    
        return asset;
    }
    

    Нажмем F5. В консоль должен быть выведен подобный приведенному ниже текст (ниже приведен сокращенный вариант):

    Asset name: UploadSingleFile_11/14/2012 10:09:11 PM
    Time created: 11/14/2012 12:00:00 AM
    Created assetFile interview2.wmv
    Upload interview2.wmv
    Done uploading of interview2.wmv using Upload()
    
    …
    
    Locator path:
    https://mediasvcd08mtz29tcpws.blob.core.windows-int.net/asset-4f5b42f4-3ade-4c2c
    -9d48-44900d4f6b62?st=2012-11-14T22%3A07%3A01Zse=2012-11-14T23%3A07%3A01Zsr=c
    si=d07ec40c-02d7-4642-8e54-443b79f3ba3csig=XKMo0qJI5w8Fod3NsV%2FBxERnav8Jb6hL7f
    xylq3oESc%3D
    
    Full URL to file:
    https://mediasvcd08mtz29tcpws.blob.core.windows-int.net/asset-4f5b42f4-3ade-4c2c
    -9d48-44900d4f6b62/interview2_metadata.xml?st=2012-11-14T22%3A07%3A01Zse=2012-1
    1-14T23%3A07%3A01Zsr=csi=d07ec40c-02d7-4642-8e54-443b79f3ba3csig=XKMo0qJI5w8F
    od3NsV%2FBxERnav8Jb6hL7fxylq3oESc%3D
    
    Downloads are in progress, please wait.
    
    File download path:  C:\supportFiles\outputfiles\interview2.mp4
    1.70952185308162 % download progress.
    3.68508804454907 % download progress.
    6.48870388360293 % download progress.
    6.83808741232649 % download progress.
    . . . 
    99.0763740574049 % download progress.
    99.1522674787341 % download progress.
    100 % download progress.
    File download path:  C:\supportFiles\outputfiles\interview2_metadata.xml
    100 % download progress.
    

    После запуска приложения происходит следующая последовательность действий:

  • В Media Services загружается .wmv.
  • Файл кодируется с использованием H264 Broadband 720p. Windows Azure Media Encoder.
  • В supportFiles\outputFiles создается файл FileSasUrlList.txt, содержащий URL на закодированный ассет.
  • Файлы .mp4 и _metadata.xmml скачиваются в директорию outputFiles.
  • Масштабирование Media Services

    На платформе Windows Azure доступно два режима масштабирования различных аспектов функциональности Media Service: On-Demand Streaming Reserved Units и Encoding Reserved Units.

    On-Demand Streaming Reserved Units

    On-Demand Streaming Units – это специально зарезервированные ресурсы, состоящие из двух компонент – исходящей пропускной способности (с инкрементом в 200 Мбит) и дополнительной функциональностью. По умолчанию стриминг осуществляется на Shared-основе, то есть пропускная способность и другие ресурсы делятся между несколькими пользователями. По этой причине многие проекты могут испытывать недостаток в мощностях, который может быть покрыт с помощью выделения зарезервированных ресурсов. Для того, чтобы сделать это, необходимо на панели управления Media Service перейти на вкладку ORIGINS, выбрать default и указать необходимое количество юнитов (равных 200 Мбит).

    (рис 13.2) Масштабирование пропускной способности

    Encoding Reserved Units

    Путем увеличения количества Encoding Reserved Units разработчик увеличивает количество одновременно обрабатывающихся мультимедиа-задач (Tasks). Таким образом, подняв это количество до 25 (максимальное количество), разработчик укажет, что в один момент времени может происходить обработка 25 задач, если таковое количество наличествует.

    Для изменения количества Encoding Reserved Units достаточно указать необходимое количество на вкладке PROCESSORS панели управления Media Services.

    (рис 13.3) Масштабирование зарезервированных ресурсов

    Заключение

    Сервис Windows Azure Media Services предоставляет возможность переноса нагрузок по кодированию и прочим задачам обработки мультимедиа-контента с локальных ресурсов на облачные. Сервис Windows Azure Media Services является масштабируемым и эффективным решением, способным выдержать любые нагрузки, в том числе такие, какие были, например, на Олимпиаде в Лондоне, трансляция которой была реализована с помощью облачного сервиса Windows Azure Media Services.

    Вернуться к учебному плану