среда, 1 марта 2017 г.

AWS. Wowza SE Origin-Edge на базе ASG

Wowza SE 4.6. Лицензии от AWS. Деплоймент через пакеты не доступен, он просто не работает, игнорируются в UserData все служебные константы и запускается default.zip package.
Будем использовать AMI с лицензиями от AWS.
По сути задачу поставили так - общая точка входа для публикации потока и общая точка для просмотра потоков. Требуется обеспечить LIVE и VOD. Будем пытаться экономить на активных инстансах (убирать при отсутствии в них надобности). Так же требуется транскодинг и запись всех входящих потоков для последующего воспроизведения в плеерах на разных платформах. HLS, RTMP/RTSP.

Структура вырисовывалась такая:
ELB -> ASG Origins
S3 bucket
ELB -> ASG Edges

Деплоймент в ASG WSE не так сложен в принципе. В UserData я прописываю команды копирования конфигов (XML файлов) с S3, заранее мною подготовленных и помещенных на S3, поверх тех, что развернуться с  AMI. И далее запуск скрипта подготовки плагинов, прав, дополнительных действий.

Сложность появилась сразу в том, что ELB не будет ибо не умеет и не должна уметь поддерживать Stiky Session не для HTTP. В моем случае это RTMP (1935/TCP).
Главная беда - это аутентикация RTMP. В случае с ELB ничего работать не будет. Аутентикация пройдет на одном Origin, а следующим действием ELB перебросит клиента с уже сгенерированым ключом на другой Origin, который не знает ничего про ключ и будет ошибка аутентикации. Вариантов было несколько для решения. Родной LoadBalance AddOn от Wowza я не смог заставить работать с RTMP. Пришлось уйти на вариант с DNS RoundRobin, TTL=60sec + HealthCheck. Конечно, это был Route 53 от AWS.
Как сделать скрипты автоматизации для этого варианта я описывал уже в блоге.

Задачу по транскодингу решал так:
Мне было проще в том плане, что задача говорила записать все входящие потоки. Ничего делать дополнительно не надо в этом случае, WSE умеет это делать из коробки - крыжик записывать все потоки. Пишет оно потоки в HOME/content. Это по умолчанию. Поскольку у меня ASG, и Origin серверов будет много, мне нужно записывать файлы в итоге на S3.
Сначала я пытался работать с S3FS. Постоянно обрывается связь даже при конфигурации с EndPoint S3. Выкинул s3fs, взял S3Uploader plugin. С ним и сдавал работу. Плагин перехватывает событие завершения записи файла и копирует его на S3 bucket , удаляет в случае успеха с EC2 этот файл. Требуется много параметров прописать в XML для его работы. Самое не приятное что плагин хочет работать с ключами доступа и не работает с правами инстанса. Транскод плагин генерирует ветви входящего потока в описанных в шаблоне разрешениях и профайлах. В итоге на один входящий поток я получал записанных 3 файла (360p, 720p, 1080p). Кстати я использовал Transrate. Если вам потребуется работать с NGRP, то используйте Transcode, он поддерживает NGRP. А Transrate - нет.

Итак есть часть задачи - аутентикация по RTMP, приложение live принимает потоки, транскодирует, отдает при необходимости всем Edge серверам, по завершении потока файлы переносятся на S3 bucket и далее уже доступны как VoD через Edge серверы.

Теперь ASG Edge. С ней проблем не было вначале. Пока не дошли до момента а как же показывать LIVE поток, если не известно какой Origin его принимает? Для Edge серверов и приложения ретрансляции (liveedge) есть специальные поля - primary/secondary Origin серверы. То есть как бы два то указать можно (по форуму стало ясно что указать можно до 5). Но какие серверы активны - не понятно, да и потом их может и больше быть чем 2 или даже 5.
На помощь пришел плагин StreamResolver. Это как бы расширение функции primary/secondary. Плагин умеет искать поток по имени на всех Origin, которые ему прописаны в файле конфигурации. Кстати, что будет если имена потоков будут одинаковые на разных Origin - я не знаю. Мы просто по задаче запретили одинаковые имена в принципе.
Плагин ищет потоки на origin серверах перебираю http запросами их. То есть будет задержка по ответу, имейте ввиду.
Для проигрывания VoD с Edge серверов, использовали настройку MediaCache с amazon S3 - встроенная фишка WSE. Смотрите MediaCache -> Sources.

Проблемы, которые не удалось решить - это ABR. Как Live (для всех) так и VoD для HLS.
Для проигрывания ABR я использовал плагин от Wowza Guru. Это Java API (AMLST).
Прекрасно все делает, но есть в нем ошибка или не доделка. При запросе HLS playlist.m3u8 я не получаю полное имя CODECS:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=972000,CODECS="avc1,mp4a.40.2",RESOLUTION=640x360
chunklist_w460187801_b972000.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1434000,CODECS="avc1,mp4a.40.2",RESOLUTION=1280x720
chunklist_w460187801_b1434000.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3144000,CODECS="avc1,mp4a.40.2",RESOLUTION=1920x1080
chunklist_w460187801_b3144000.m3u8

То есть значение в CODECS равно avc1 а дальше нет профиля. например вот так:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=953582,CODECS="avc1.66.30,mp4a.40.34",RESOLUTION=320x180
chunklist_w1947483272.m3u8

А жаль, все так было хорошо.:)
Пока эту фишку отменили на проекте.
На доработке.
На андроиде кстати отлично в браузере работают ссылки по типу HLS :)
http://Edge/edge/_definst_/amazons3/streamName/playlist.m3u8






Комментариев нет: