Если вы следите за облачными новостями, наверное вы уже знаете, что 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 — они могут быть источником медиа контента практически для всех типов устройств, присутствующих сейчас на рынке: начиная, от обычных настольных компьютеров и заканчивая телевизионными приставками или смартфонами.
И, конечно же, этот замечательный функционал доступен разработчика через 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 и как их можно использовать
После того, как состояние сервиса стане Active — он готов к работе.
Что такое Windows Azure Media Services и как их можно использоватьЧто такое Windows Azure Media Services и как их можно использовать
После этого, если вы разработчик на .NET, и у вас уже установлена Visual Studio 2010 SP1, дополнительно необходимо установить:
- Windows Azure SDK 1.6, используя Web Platform Installer
- Windows Azure Media Services SDK for .NET
- WCF Data Services 5.0 for OData v3
Теперь вы полностью готовы к разработке приложений, использующих Windows Azure Media Services.
Давайте создадим простое приложение, работающее с Windows Azure Media Services.
Создайте в Visual Studio проект консольного приложение для .NET Framework 4. Добавьте к проекту в Reference следующие библиотеки:
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/