«

»

Мар 20 2017

Распечатать Запись

Построение системы доставки живого видео наподобие Periscope. Nimble Streamer, Larix SDK и другое ПО

Сегодня я публикую очередную гостевую статью от компании Софтвелум, разработчика популярного медиа-сервера Nimble Streamer, веб-сервиса WMSPanel и другого ПО для онлайн видео-вещания. Хочу отметить, что я со своими коллегами хорошо знакомы с их решениями и являемся официальными партнерами и интеграторами программных продуктов этой компании, поэтому мы всегда рады сотрудничеству в этом направлении, так что обращайтесь.

Рассмотрим популярный сценарий видео-вещания

Давайте рассмотрим сценарий, который последние года два стал очень популярен среди наших клиентов. Речь о системах вещания видео в реальном времени с мобильных устройств. Первопроходцем и лицом подобного подхода стал Periscope, купленный Twitter’ом в марте позапрошлого года — именно он показал потенциал новой ниши.

Надо сказать, что его появление было обусловлено несколькими важными факторами. Во-первых, каналы связи на западном рынке доросли до пропускной способности и уровня стабильности, которые дают возможность передавать устойчивый поток. Второе, и самое важное, это возможности “железа” и ОС мобильных устройств. Например, Android уже с версии 4.1 (т.е. API 16) даёт возможность работать со встроенным энкодером устройства без каких-либо существенных ограничений.

Итак, есть отличный пример успешного внедрения, есть техническая возможность и запрос от индустрии. Компания-создатель каждого нового сервиса добавляет что-то своё и применяет технологию в той нише, с которой больше всего знакома — это привязка к местным сообществам, к профессиональным нишам, т.е. к любой аудитории, которую разработчик может задействовать эффективно.

Давайте посмотрим как строятся системы доставки видео подобного рода на примере наших разработок.

Принцип действия

Общая схема цепочки публикации видео с устройства-источника на устройство-получатель выглядит так:

  1. Приложение на источнике. Оно позволяет снять поток с нужного сенсора (фронтальная/задняя камера в нужном разрешении), обработать его (сделать поворот изображения, наложение эффектов), закодировать и отправить наружу по одному из протоколов, поддерживающих живую передачу.
  2. Приложение на сервере — программный медиа-сервер. Его задача — принять поток от источника, провести авторизацию, перепаковать и перекодировать в те форматы, которые нужны конечным пользователям, а потом обеспечить доставку до зрителей.
  3. Приложение на стороне зрителя. Здесь возможно использование различных технологий — от проигрывания в браузере мобильного телефона до приложения на телевизоре со всеми остановками на настольных ПК, set-top-boxes и мобильных приложениях.

Проиллюстрировать это можно примерно так:

Мы расскажем подробно про первые два элемента этой цепи, наиболее сложные с точки зрения разработки и внедрения. В качестве примера возьмём Андроид, но всё описанное справедливо и для iOS, и для Windows Phone — для них у нас тоже есть соответствующие SDK.

 Передача потока с борта Android

Как уже говорилось выше, у Андроида давно есть почти всё, что нужно для работы с медиа-контентом. Нам нужно было собрать всё вместе, дописать обработку хитрых сценариев с привлечением OpenGL, и потом добавить функциональность потоковой передачи. Итог нашей работы — библиотека мобильного вещания, которая покрывает все потребности в передаче медиа, и его использование сильно экономит ресурсы при разработке. SDK с этой библиотекой доступен для лицензирования.

При работе с самим контентом Андроид даёт максимум гибкости как из коробки через свой API, так и посредством OpenGL:

  • Поддержка фронтальной и основной камер с быстрым переключением: автор говорит в камеру, потом показывает на что-то перед собой, потом возвращает обратно.
  • Поддержка ландшафтного и портретного режимов с поддержкой динамической ориентации при повороте: начали снимать в одном режиме, повернули телефон — изображение при просмотре изменит размер, но вверху по-прежнему будет небо, а снизу — земля.
  • Андроид позволяет иметь полный контроль над камерой и изображением — фокусировка, баланс белого, выставление экспозиции, антифликер, вспышка и т.п.. Все эти функции доступны через методы библиотеки.
  • Запись в MP4 и сохранение снимков также доступны — это поддерживается API Андроида.
  • Контент при этом кодируется в H.264/AAC — нынешние стандарты де-факто в Интернете. Кодирование делается силами энкодеров платформы.

Далее наша библиотека публикует поток по протоколам RTSP или RTMP, при этом поддерживаются базовый и дайджестный методы аутентификации. Поддерживается одновременная публикация на несколько разных серверов по разным протоколам — вы можете вещать на Twitch, и параллельно себе на сервер для дальнейшей обработки и монетизации. Также можно вещать в YouTube, Facebook, сеть Limelight и любые другие сервисы с поддержкой RTMP/RTSP. Число одновременных сессий в библиотеке не ограничено. Что важно — публиковаться будет одно и тоже, и энкодинг делается один раз.

Увидеть SDK в работе можно установив наше приложение Larix Broadcaster — оно демонстрирует все возможности. Кроме того, его исходники доступны как часть самого SDK, т.е. лицензировав его, вы можете сразу сделать своё приложение с минимальными затратами времени.

Обрабатываем и раздаём поток

У нас есть поток с устройства — теперь нужно раздать его на всех желающих. С самого устройства это сделать нельзя — просто канала не хватит. Для этой цели существует класс решений, называемых “медиа-сервер”. Медиа-сервер принимает входящие потоки, преобразует их так, как вам нужно, и на выходе даёт возможность забрать поток по тому протоколу, который больше подходит для плеера или приложения вашего зрителя.

Если предполагается большое число зрителей, да ещё и из разных сегментов Интернета, то из медиа-серверов строится система доставки контента — CDN. Причем CDN можно выбрать готовый — благо их сейчас немало. Однако если вам нужно что-то своё — достаточно поднять ещё несколько машин, настроить повторную публикацию потока на них — и далее настроить балансировку клиентских приложений зрителей на подходящие сервера.

Наша команда давно и успешно работает над Nimble Streamer — это бесплатный медиа-сервер на архитектурах x64, ARM и Power8 для любых популярных ОС — Linux, Windows и MacOS. Немало клиентов использует для развертывания своей инфраструктуры вещания облачные сервисы — Google Cloud, Amazon, Microsoft Azure, DigitalOcean — они все дают разнообразные возможности по развертыванию своих сетей.

Ставится Нимбл несложно, инструкции можно посмотреть здесь. После установки вам будет предложено зарегистрировать Нимбл в нашей облачной панели управления — WMSPanel. Она позволяет удобно через веб-интерфейс настраивать сценарии, по которым потоки будут приниматься от источников и преобразовываться в нужный вид. Кроме того, панель предоставляет большое количество статистики, оценивающей ваши потоки с точки зрения аудитории. Вы можете смотреть её сами, можете снимать показания через API, а можете сразу давать на просмотр вашим клиентам через white label.

Нередко при трансляции на разные устройства и в разных каналах связи возникает необходимость создания потоков с ABR (Adaptive BitRate, адаптивный битрейт). Вы наверняка обращали внимание в YouTube на выпадающий список с выбором разрешения: им активно пользуются, когда видео подтормаживает — ведь меньшее разрешение требует меньшей скорости передачи.

Для этой задачи у нас есть Транскодер — платное дополнение к Нимбл Стримеру, которое может не только создавать потоки меньшего качества, но и сделать любые другие преобразования на лету — наложить логотип, изменить качество, сделать картинку-в-картинке, скадрировать изображение или наложить преобразованный звук и т.п. Транскодер умеет всё это и даже больше.

Больше контроля

Если делать свой сервис, где много людей будут снимать и смотреть видео в реальном времени, то нужно позаботиться о том, чтобы иметь возможность контролировать как просмотр видео, так и его передачу.

Например, кто-то отдаёт нелегальный контент со своего устройства и вам нужно иметь возможность отключить нарушителя. Или у вас сервис, где клиенты платят деньги за передачу своего видео (например, онлайн-семинара), а автор канала ещё не заплатил за услугу. Для этого предусмотрена функция publish control — она даёт позволяет связываться серверу с вашим приложением и давать ему возможность указывать, кому можно вещать, а кому — нет.

 Другой класс сценариев, требующих контроля — это всё, что связано с монетизацией. Например, вам нужно сделать так, чтобы смотреть могли только авторизованные зрители и чтобы нельзя было оплаченную ссылку расшаривать посторонним. Это называется hotlink protection — защита от прямой вставки. Или же вы хотите контролировать поведение каждого отдельного зрителя — тогда вам нужна функция pay-per-view. Вдобавок вы можете настроить ограничение по географии, и обозначить, зрители из каких стран смогут увидеть ваши трансляции. Всё это входит в набор функциональности под общим названием Paywall.

Таким образом контент можно контролировать с двух сторон — на входе от девайса к медиа-серверу, и на выходе перед зрителями.

Что дальше?

Теперь можно строить свои цепочки доставки живого контента своим зрителям на их устройства. Приведенные выше базовые инструменты можно использовать в разных вариантах и сочетаниях. На самих устройствах можно проигрывать потоки как во встроенном браузере, так и в своих же приложениях — тут возможности весьма обширны.

Приведенная выше схема обобщает то, что нужно для создания своей сети живого вещания с мобильных устройств. И если нужно больше подробностей по каждому элементу — спрашивайте, объясним более подробно.

Всего хорошего!

 Если у вас появились какие-то вопросы по медиа-серверам, пишите нам. Если вам нужно что-то настроить или получить консультацию по медиа-серверам и системам видео-вещания, также можете обращаться ко мне и нашей команде. Разную полезную информацию на данную тему вы можете найти в нашем Справочнике по видеотрансляциям.

 Приглашаю всех подписаться на новости моей публичной страницы ВКонтакте, ее адрес http://vk.com/itmultimedia. Буду рад видеть Вас в своих подписчиках.


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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>