Windows Azure Media Services

Yuriy O.

Если вы следите за облачными новостями, наверное вы уже знаете, что Windows Azure Media Services использовались при трансляции Олимпийских Игр 2012 в Лондоне.

Давайте разберёмся, что они из себя представляют и как их можно использовать

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

Windows Azure Media Services предоставляют следующие сервисы для построение собственных медиа-сервисов и приложений:

  • загрузку контента,
  • перекодирование,
  • конвертацию форматов,
  • защиту контента,
  • вещание по запросу и
  • живое вещание, а также
  • аналитику и рекламу.

Или, если представить всё вышесказанное в виде схемы, то архитектура Windows Azure Media Services будет выглядеть следующим образом: Что такое Windows Azure Media Services и как их можно использоватьЧто такое Windows Azure Media Services и как их можно использоватьЧто такое Windows Azure Media Services и как их можно использовать

Если приглядеться к схеме, можно увидеть ещё одну замечательную особенность Windows Azure Media Services — они могут быть источником медиа контента практически для всех типов устройств, присутствующих сейчас на рынке: начиная, от обычных настольных компьютеров и заканчивая телевизионными приставками или смартфонами.

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

Итак, теперь у вас есть общее представление о том, что из себя представляют Windows Azure Media Services. Давайте познакомимся с ними поближе.

Разработка клиентов сервиса

Мак и ПК

Сейчас вы можете разработывать для Мака и ПК с использованием Microsoft Silverlight. Через некоторые время будет доступен SDK для разработки клиента на Flash. Доступные SDK для Silverlight:
Smooth Streaming Client for Silverlight
Microsoft Media Platform: Player Framework for Silverlight

Windows 8

Для разработки WinRT прилодений под Windows 8, можно разрабатывать на HTML/JS, C# или C++, используя следующие SDK:
Smooth Streaming Client SDK for WinRT Windows 8applications
Microsoft Media Platform: Player Framework for WinRT Windows 8 Applications

Windows Phone

Microsoft предоставляет SDK для построения видео-приложений по Windows Phone.
Smooth Streaming Client for Silverlight
Microsoft Media Platform: Player Framework for Silverlight

iOS устройства

Для iOS устройств, включая iPhone, iPod, и iPad, Microsoft поставляет Smooth Streaming SDK for iOS Devices with PlayReady.
Smooth Streaming SDK for iOS Devices with PlayReady

Android устройства

Партнёры Microsoft разрабатывают и поставляют SDK для этих устройств.

Xbox

Xbox поддерживает Xbox LIVE приложения с Smooth Streaming. Xbox LIVE Application Development Kit (ADK) содержит:
Smooth Streaming client for Xbox LIVE ADK
Microsoft Media Platform: Player Framework for Xbox LIVE ADK

Встраиваемые и другие устройства

Для встраиваемых устройств, таких как телевизоры, телевизионные приставки, медиа-плееры и т.д., то есть для устройств с собственным фреймвоком разработки и работы с медиа-контеном, можно лицензировать пакеты для портирования:
Smooth Streaming Client Porting Kit
Microsoft PlayReady Device Porting Kit

Работа с сервисной частью

Для начала работы с Windows Azure Media Services необходимо их сначала создать у себя на портале управления Windows Azure (он сейчас находится в стадии беты):
Что такое Windows Azure Media Services и как их можно использоватьЧто такое Windows Azure Media Services и как их можно использоватьЧто такое Windows Azure Media Services и как их можно использовать

После того, как состояние сервиса стане Active — он готов к работе.
Что такое Windows Azure Media Services и как их можно использоватьЧто такое Windows Azure Media Services и как их можно использоватьЧто такое Windows Azure Media Services и как их можно использовать

После этого, если вы разработчик на .NET, и у вас уже установлена Visual Studio 2010 SP1, дополнительно необходимо установить:

Теперь вы полностью готовы к разработке приложений, использующих Windows Azure Media Services.

Давайте создадим простое приложение, работающее с Windows Azure Media Services.

Создайте в Visual Studio проект консольного приложение для .NET Framework 4. Добавьте к проекту в Reference следующие библиотеки:

Microsoft.WindowsAzure.MediaServices.Client.dll
Program Files (x86)Microsoft SDKsWindows Azure Media ServicesServices SDKv1.0
Microsoft.WindowsAzure.StorageClient.dll
Program FilesWindows Azure SDKv1.6bin
Microsoft.Data.Edm.dll
(Program Files (x86)Microsoft WCF Data Services5.0bin.NETFramework
Microsoft.Data.OData.dll
(Program Files (x86)Microsoft WCF Data Services5.0bin.NETFramework
Microsoft.Data.Services.Client.dll
(Program Files (x86)Microsoft WCF Data Services5.0bin.NETFramework
Microsoft.Data.Services.dll
(Program Files (x86)Microsoft WCF Data Services5.0bin.NETFramework
System.Spatial.dll
(Program Files (x86)Microsoft WCF Data Services5.0bin.NETFramework

System.Configuration

Добавте в app.config вашего приложения настройки аккаунта Media Services:

<code><?xml version="1.0"?> <configuration>   <startup>     <supportedRuntime version=<span>"v4.0" sku=".NETFramework,Version=v4.0" /></span>   </startup>   <appSettings>     <add key=<span>"accountName" value="Add-Media-Services-Account-Name" /></span>     <add key=<span>"accountKey" value="Add-Media-Services-Account-Key" /></span>   </appSettings> </configuration>

Добавим в код переменные, указывающие на локальный файл с видео и уже существующую папку для результатов работы:

<code>private static readonly string _singleInputFilePath =                                               Path.GetFullPath(@"C:mediaFilesinterview.wmv");  private static readonly string _outputFilesFolder =                                                Path.GetFullPath(@"C:outputfiles");

Замените блок using в файле на следующий:

<code>using System.Linq; using System; using System.Configuration; using System.IO; using System.Threading; using System.Collections.Generic; using Microsoft.WindowsAzure.MediaServices.Client;

Определите переменные, которые будут содержать данные вашего аккаунта:

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

Определите переменные, для ссылки на серверный контекст и на результат работы:

<code>private static CloudMediaContext _context = null;  static string _outputAssetID = null;

В метод Main добавьте создание сервисного контекста:

<code>_context = new CloudMediaContext(_accountName, _accountKey); 

Теперь необходимо создать и загрузить медиа данные на сервис:

<code>static IAsset CreateAndUploadAsset(string inputMediaFilePath) {    IAsset theAsset = _context.Assets.Create(inputMediaFilePath, AssetCreationOptions.StorageEncrypted);    Console.WriteLine("Asset name: " + theAsset.Name);    Console.WriteLine("Asset ID: " + theAsset.Id);    Console.WriteLine("Time created: " + theAsset.Created.Date.ToString());    Console.WriteLine("Encrypted status: " + theAsset.Options.ToString());    return theAsset; }  IAsset asset = CreateAndUploadAsset(_singleInputFilePath); 

Для задач перекодирования на сервере создадим несколько вспомогательных функций:

<code>// Основаня функция  static void CreateEncodingJob(IAsset asset, string outputFolder) {    IJob job = _context.Jobs.Create("My Encoding Job");    // Получаем медиа-процессор   IMediaProcessor processor = GetMediaProcessor("Windows Azure Media Encoder");    // Создаём задачу перекодирование   ITask task = job.Tasks.AddNew("My encoding task", processor, "H.264 256k DSL CBR", TaskCreationOptions.None);    // Указываем, что перкодировать   task.InputMediaAssets.Add(asset);    // Добавляем Asset для результатов работы   task.OutputMediaAssets.AddNew("Output asset", true, AssetCreationOptions.None);    // Запускаем процесс.    job.Submit();    // Ждём результата и выводим сообщения в консоль   CheckJobProgress(job.Id);    // Получаем ссылку на Job   job = GetJob(job.Id);    // Получаем ссылку на результат   IAsset outputAsset = job.OutputMediaAssets[0];    // Устанавливаем значение глобальной перменной   _outputAssetID = outputAsset.Id;    // Получаем SAS URL для доступа к результатам кодирования   string sasUrl = GetAssetSasUrl(outputAsset, TimeSpan.FromMinutes(30));    // Записываем URL в локальный файл   string outFilePath = Path.GetFullPath(outputFolder + @"" + "SasUrl.txt");   WriteToFile(outFilePath, sasUrl); } 

Вспомогательные функции.

Ждём окончания работы и выводим статус в консоль:

<code>private static void CheckJobProgress(string jobId) {   // Флаг окончания работы    bool jobCompleted = false;    // Интервал опроса   const int JobProgressInterval = 20000;    while (!jobCompleted) {      // Получаем свежую ссылку на Job      IJob theJob = GetJob(jobId);       // Проверяем состояние и выводим на консоль      switch (theJob.State) {         case JobState.Finished:            jobCompleted = true;            Console.WriteLine("");            Console.WriteLine("********************");            Console.WriteLine("Job state: " + theJob.State + ".");            Console.WriteLine("Please wait while local tasks complete...");            Console.WriteLine();            break;         case JobState.Queued:         case JobState.Scheduled:         case JobState.Processing:            Console.WriteLine("Job state: " + theJob.State + ".");            Console.WriteLine("Please wait...");            Console.WriteLine();            break;         case JobState.Error:            break;         default:            Console.WriteLine(theJob.State.ToString());            break;      }       // Ждём, прежде чем проверить состояение снова      Thread.Sleep(JobProgressInterval);   } } 

Запрашиваем медиа процессор:

<code>private static IMediaProcessor GetMediaProcessor(string mediaProcessor) {   // Возможные строки для получения ссылки на медиа процессор   //    MP4 to Smooth Streams Task   //    Windows Azure Media Encoder   //    PlayReady Protection Task   //    Smooth Streams to HLS Task    //    Storage Decryption    // Запрашиваем, чтобы получить ссылку на медиа процессор   var theProcessor = from p in _context.MediaProcessors                      where p.Name == mediaProcessor                      select p;    // Кастуем в IMediaprocessor.   IMediaProcessor processor = theProcessor.First();    if (processor == null)      throw new ArgumentException(string.Format(System.Globalization.CultureInfo.CurrentCulture, "Unknown processor", mediaProcessor));    return processor; } 

Получение ссылки на Job:

<code>static IJob GetJob(string jobId) {   // Запрашиваем Job по Id   var job =       from j in _context.Jobs       where j.Id == jobId       select j;    //Получаем её из результатов запроса   IJob theJob = job.FirstOrDefault();    // Проверяем, что Job есть :)    if (theJob != null)      return theJob;   else      Console.WriteLine("Job does not exist.");   return null; } 

Получение SAS URL для результатов кодирования:

<code>static String GetAssetSasUrl(IAsset asset, TimeSpan accessPolicyTimeout) {    // Создаём полиси   IAccessPolicy readPolicy = _context.AccessPolicies.Create("My Test Policy", accessPolicyTimeout, AccessPermissions.Read);    // Создаём locator, который обеспечивает доступ к asset с наложенной полиси   ILocator locator = _context.Locators.CreateSasLocator(asset,        readPolicy,       DateTime.UtcNow.AddMinutes(-5));    Console.WriteLine("Locator path: ");   Console.WriteLine(locator.Path);   Console.WriteLine();    // Получаем ссылку на mp4 файл - нам не нужны метаданные - xml   var theOutputFile =                       from f in asset.Files                       where f.Name.EndsWith(".mp4")                       select f;    // Кастуем IQueryable в IFileInfo.   IFileInfo theFile = theOutputFile.FirstOrDefault();   string fileName = theFile.Name;    // Строим окончательный SAS URL   var uriBuilder = new UriBuilder(locator.Path);   uriBuilder.Path += "/" + fileName;   Console.WriteLine("Full URL to file: ");   Console.WriteLine(uriBuilder.Uri.AbsoluteUri);   Console.WriteLine();    return uriBuilder.Uri.AbsoluteUri; } 

Вспомогательный метод записи в файл:

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

Осталось добавить в Main:

<code>CreateEncodingJob(asset, _outputFilesFolder); 

И можно запускать нашу программу.

Пример результатов работы программы
<code>Asset name: interview Asset ID: nb:cid:UUID:xyzxyza-318a-4a47-b996-27353b23abc3 Time created: 5/24/2012 12:00:00 AM Encrypted status: StorageEncrypted Job state: Queued. Please wait...  Job state: Processing. Please wait...  Job state: Processing. Please wait... ******************** Job state: Finished. Please wait while local tasks complete...  Locator path:  https://MediaServicesServer.blob.core.windows.net/asset-zzzz374-1234-4c60-9da8-3daf  7a6dabcd?st=2012-05-24T21%3A59%3A55Z&se=2012-05-24T22%3A29%3A55Z&sr=c&si=b1a0cf8 f-45bf-4f77-a84a-a38c3f8a002d&sig=tWmPLPpNuQpEXvCd2Ik8rCfY5AqjII3gnWgi9ustBI4%3D Full URL to file: https:// MediaServicesServer.blob.core.windows.net/asset- zzzz374-1234-4c60-9da8-3daf 7a6dabcd/interview.mp4?st=2012-05-24T21%3A59%3A55Z&se=2012-05-24T22%3A29%3A55Z&s r=c&si=b1a0cf8f-45bf-4f77-a84a-a38c3f8a002d&sig=tWmPLPpNuQpEXvCd2Ik8rCfY5AqjII3g nWgi9ustBI4%3D 

Итак, мы познакомились с сервисами Windows Azure Media Services и даже попробовали написать простую программу, пользующуюся простейшими возможностями, предоставляемыми сервисами. Подробнее о сервисах можно прочитать по следующей ссылке: www.windowsazure.com/en-us/develop/net/how-to-guides/media-services/

Написать комментарий