Если вы следите за облачными новостями, наверное вы уже знаете, что Windows Azure Media Services использовались при трансляции Олимпийских Игр 2012 в Лондоне.
Давайте разберёмся, что они из себя представляют и как их можно использовать
Если немного упростить, то Windows Azure Media Services — это технологии платформы Microsoft Media Platform, а также наших партнёров перенесённые большей частью в облако. Другими словами, с одной стороны, это проверенные и знакомые решения, с другой стороны, возможность масштабировать эти решения и интегрировать их в собственные процессы кодирования, вещания и распространения медиа-контента.
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 (он сейчас находится в стадии беты):
После того, как состояние сервиса стане Active — он готов к работе.
После этого, если вы разработчик на .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:
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
<appSettings>
<add key="accountName" value="Add-Media-Services-Account-Name" />
<add key="accountKey" value="Add-Media-Services-Account-Key" />
</appSettings>
</configuration>
Добавим в код переменные, указывающие на локальный файл с видео и уже существующую папку для результатов работы:
private static readonly string _singleInputFilePath =
Path.GetFullPath(@"C:mediaFilesinterview.wmv");
private static readonly string _outputFilesFolder =
Path.GetFullPath(@"C:outputfiles");
Замените блок using в файле на следующий:
using System.Linq;
using System;
using System.Configuration;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using Microsoft.WindowsAzure.MediaServices.Client;
Определите переменные, которые будут содержать данные вашего аккаунта:
private static readonly string _accountKey = ConfigurationManager.AppSettings["accountKey"];
private static readonly string _accountName = ConfigurationManager.AppSettings["accountName"];
Определите переменные, для ссылки на серверный контекст и на результат работы:
private static CloudMediaContext _context = null;
static string _outputAssetID = null;
В метод Main добавьте создание сервисного контекста:
_context = new CloudMediaContext(_accountName, _accountKey);
Теперь необходимо создать и загрузить медиа данные на сервис:
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);
Для задач перекодирования на сервере создадим несколько вспомогательных функций:
// Основаня функция
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);
}
Вспомогательные функции.
Ждём окончания работы и выводим статус в консоль:
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);
}
}
Запрашиваем медиа процессор:
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:
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 для результатов кодирования:
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;
}
Вспомогательный метод записи в файл:
static void WriteToFile(string outFilePath, string fileContent) {
StreamWriter sr = File.CreateText(outFilePath);
sr.Write(fileContent);
sr.Close();
Осталось добавить в Main:
CreateEncodingJob(asset, _outputFilesFolder);
И можно запускать нашу программу.
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/
Автор: stasus