Блог

Полезные статьи и новости о жизни WaveAccess

Как стримить видео в Azure Media Services: опыт разработчика

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

Jisp — это сервис рекомендаций услуг на основании анализа интересов и поведения  пользователя, собственная разработка WaveAccess на базе технологий машинного обучения. Jisp поддерживает технологию iBeacon: когда пользователь прикасается к маячку iBeacon, которыми оффлайн-магазины оснащают свой товар, приложение Jisp использует эту информацию для “обучения” алгоритма рекомендаций, а пользователь может подробнее ознакомиться с характеристиками товара, отмеченного данным маячком iBeacon прямо в приложении Jisp. Также Jisp предоставляет возможность делиться товарами, видеороликами о них и спецпредложениями, реализуя функциональность социальной сети для любителей выгодных покупок.

Jisp был отмечен премией Microsoft Partner Awards 2017 в номинации Business Analytics  за реализацию системы на основе машинного обучения. Разработанный WaveAccess алгоритм позволил воссоздать профиль потребителя на основании его интересов и сделанных им выборов — как онлайн, так и оффлайн. Создание точного портрета облегчает взаимодействие с потребителем и позволяет делать ему персонализированные предложения, которыми он с большой вероятностью воспользуется.      

Постановка задачи 

Но вернемся к постановке задачи: как было сказано, Jisp позволяет делиться видеозаписями — а именно, видеороликами с пропорцией 1:1, привязанными к  определенной позиции на карте. На практике это означает, что полное видео смогут увидеть лишь пользователи, находящиеся в непосредственной близости от указанной точки на карте. По замыслу разработчиков Jisp, видео о товаре “по акции” должны увидеть те, кто может его купить в ближайшее время, — значит, имеет смысл показывать его находящимся поблизости людям. Остальным же доступен короткий ознакомительный фрагмент, длину которого определяет сам автор, опубликовавший видео.

В процессе реализации такой функциональности нам пришлось столкнуться с рядом ограничений при обработке и поддержке стриминга видео надлежащего качества и формата для iOS, Android и веб-платформ. Для стриминга остановились на платформе Azure Media Services (AMS), а серверная инфраструктура была реализована на .NET.

Настраиваем доступ к видеохранилищу

Для настройки доступа к облаку с видеофайлами создаем аккаунты Azure Storage Account и Media Service Account.

Azure Storage Account служит для хранения “сырых” видео и другой информации, исключая метаданные.

Media Service Account используется для хранения метаданных о видеофайлах. Метаданные характеризуются следующими параметрами:

  • Location —  расположение дата-центра, в котором создается ресурс;

  • Resource group — идентификатор, позволяющий группировать ресурсы;

  • Storage account — облачное хранилище для файлов типа Asset (о них ниже).

Выбираем тип авторизации

Как только созданы аккаунты хранения (Azure Storage Account и Media Service Account), можно настроить авторизацию. API AMS поддерживает авторизацию через Azure Active Directory (Azure AD) двумя способами:

  1. Авторизация пользователя (User authentication);

  2. Авторизация субъект-службы (Service principal authentication).

Авторизация пользователя применима в случае, когда приложение напрямую взаимодействует с AMS, минуя промежуточный сервис, самостоятельно осуществляющий авторизацию. Такое приложение напрямую запрашивает у пользователя данные учетной записи Azure Active Directory.

Стрим видео в Azure Media Services: процесс авторизации пользователя

Рис. 1. Авторизация пользователя

Авторизация субъект-службы используется, когда в десктоп-приложении есть специальный сервис авторизации пользователей (субъект-служба). Субъект-службами обладают, как правило, приложения со своим бэкендом, где ключи доступа к AMS хранятся на сервере, а пользователи авторизуются согласно бизнес-логике приложения.

Стрим видео в Azure Media Services: авторизация субъект-службы

Рис. 2. Авторизация субъект-службы

Интегрируем Azure Media Services с .NET SDK

Когда аккаунты хранения созданы и авторизация настроена, начинаем интегрировать Azure Media Services с .NET SDK.

В Azure SDK существует класс CloudMediaContext для работы с AMS-сущностями. Объект класса CloudMediaContext инициализируется следующим кодом:

var azureKey = new AzureAdClientSymmetricKey(clientId, clientKey);
var credentials = new AzureAdTokenCredentials(tenant, azureKey, AzureEnvironments.AzureCloudEnvironment);
var tokenProvider = new AzureAdTokenProvider(credentials);
var context = new CloudMediaContext(new Uri(url), tokenProvider);

Работаем с сущностями типа Asset

Инициализировав CloudMediaContext, переходим к загрузке видео. Для хранения видео в AMS используются сущности типа Asset — ресурсы, которые содержат все компоненты, имеющие отношение к видео: видеопоток, аудиодорожку, превью, thumbnail и другие.

Создаем ресурс Asset

var inputAsset = context.Assets.Create(assetName, storageName, AssetCreationOptions.None);

Добавляем требуемый исходный видеофайл в Asset

var assetFile = inputAsset.AssetFiles.Create(fileName);

Модифицируем видеофайл для поддержки адаптивного стриминга


var job = context.Jobs.CreateWithSingleTask("Media Encoder Standard", "Adaptive Streaming", inputAsset, "Adaptive Bitrate MP4", AssetCreationOptions.None);
job.Submit();
job = job.StartExecutionProgressTask(
    j =>
    {
        Console.WriteLine("Job state: {0}", j.State);
        Console.WriteLine("Job progress: {0:0.##}%", j.GetOverallProgress());
    }, CancellationToken.None).Result;
Console.WriteLine("Transcoding job finished.");
var outputAsset = job.OutputMediaAssets[0];

Обработанное видео публикуем в облаке с помощью Locator


context.Locators.Create(LocatorType.OnDemandOrigin, outputAsset, AccessPermissions.Read, TimeSpan.FromDays(365));

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

var videoUri = outputAsset.GetMpegDashUri();

Изменяем параметры видео с помощью фильтров

Фильтры (ресурс Azure Media Services — Filters)  — это правила, по которым реализуются определенные функции: например, проигрывание фрагмента видео, выбор определенных типов (расширений) видеофайлов, подлежащих обработке, установка качества видео или аудио, и другие функции.

Существует два типа фильтров по области их применения:

  • Локальные фильтры — создаются специально для отдельного видеофайла и применяются только к нему.

  • Глобальные фильтры — действуют в рамках аккаунта и могут быть применены к любому видеофайлу в данном аккаунте. С помощью глобальных фильтров можно реализовать, например, поддержку различных форматов видео для проигрывания на различных устройствах.

Создаем фильтр, ограничивающий воспроизведение видео заданным интервалом (фактически, это “обрезка” видео без изменения исходного файла)

var filterName = $"{length}seconds";
outputAsset.AssetFilters.Create(filterName,
	new PresentationTimeRange(start: 0, end: Convert.ToUInt64(10000000 * length)),
	new List());

Созданные фильтры могут быть вписаны в url файла для стриминга. При обращении по данному url приложение получает файл уже с примененными фильтрами.

Например, имеем исходный url:

http://testendpoint-testaccount.streaming.mediaservices.windows.net/fecebb23-46f6-490d-8b70-203e86b0df58/BigBuckBunny.ism/Manifest(format=mpd-time-csf)

Применили к видео фильтр 10seconds. Теперь url имеет вид:

http://testendpoint-testaccount.streaming.mediaservices.windows.net/fecebb23-46f6-490d-8b70-203e86b0df58/BigBuckBunny.ism/Manifest(format=mpd-time-csf,filter=10seconds)

Можно применять сразу несколько фильтров, указав это в url:

http://testendpoint-testaccount.streaming.mediaservices.windows.net/fecebb23-46f6-490d-8b70-203e86b0df58/BigBuckBunny.ism/Manifest(format=mpd-time-csf,filter=10seconds;square)

Реализуем поддержку масштабирования в AMS

В Azure Media Services доступны следующие виды масштабирования при обработке видео:

  • Масштабирование “вверх” — увеличение скорости обработки видеофайлов. Доступно несколько вариантов скорости — базовая (х1), а также увеличенные соответственно в два и в четыре раза — x2 и x4.

  • Масштабирование “вширь” — обработка нескольких видеофайлов одновременно. Для этого, подобно установкам скорости, можно задать необходимое число медиапроцессоров (MPUs), каждый из которых обрабатывает отдельный поток.

AMS автоматически меняет скорость обработки видео по мере необходимости. Однако можно гарантировать себе необходимую пропускную способность процессинга, воспользовавшись тарифами — Standard (до 600 Mbps) и Premium (до 200 Mbps на каждый медиапроцессор).

Увидеть, как скорость влияет на время обработки, можно на примере видеофрагментов различной длины. Так, при качестве 720p время обработки фрагментов длиной 30 секунд, 1 минута и 5 минут изменяется следующим образом:

Скорость

30 сек (4,4 Мб)

1 минута (8,1 Мб)

5 минут (44,9 Мб)

x1

1:32 (49 Кб/с)

2:14 (62 Кб/с)

8:38 (89 Кб/с)

x2

1:07 (68 Кб/с)

1:31 (91 Кб/с)

5:07 (150 Кб/с)

x4

0:33 (137 Кб/с)

0:45 (185 Кб/с)

1:49 (422 Кб/с)

Как видим, чем длиннее видео, тем больший эффект дает увеличение скорости его обработки, а при малой длительности видео выигрыш времени не столь значителен.

Обходим подводные камни

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

  1. Задержка между окончанием загрузки видео в облако и моментом запуска стриминга.

В идеале, мы стремились к тому, чтобы стриминг начинался сразу по окончании загрузки видеофайла. Однако подготовка Asset-файлов требует некоторого времени — чем и была вызвана задержка, поскольку по умолчанию стриминг требует наличия Asset-файла. Между тем, в AMS доступна и ссылка на “сырое” видео, не завернутое в Asset. Мы воспользовались этим и выгрузили необработанное видео в Azure Storage в обход AMS. Таким образом, пока видео обрабатывается, можно начинать стримить его “сырую” версию, а позже перейти к стримингу Asset по обычному сценарию.  

  1. Нестандартная пропорция видео (квадратный формат).

В ряде случаев AMS некорректно обрабатывает квадратные видео, что приводит к искажению thumbnail-изображения, так как в метаданных указаны другие пропорции. На помощь пришел FFmpeg — набор библиотек по работе с мультимедиа, в котором нашлись функции, решающие эту проблему.  

  1. Слишком большой шаг изменения длительности видео.

Оказалось, что по умолчанию в AMS длительность воспроизведения видео может быть только кратной шести секундам, что оказалось неудобным пользователям Jisp. С помощью расширенной конфигурации настроек AMS нам удалось сократить шаг изменения длительности видео до двух секунд.

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

Если вам интересны возможности Azure Media Services или нужна разработка грамотного проекта на базе облачных сервисов, пишите: hello@wave-access.com

Мы с радостью ответим на ваши вопросы!

Заказать звонок

Удобное время:

Отменить

Пишите!

Присоединить
Файл не больше 30 Мб.
Отменить