понедельник, 28 января 2013 г.

Сервер онлайн-вещаний на базе nginx

Привет всем! Несколько месяцев назад на Хабре была опубликована статья «Вещание онлайн-видео с помощью nginx» , в которой Aecktann рассказал о своем опыте внедрения разрабатываемого мной модуля к nginx для вещания видео — nginx-rtmp-module. С тех пор продукт активно развивался и в этой статье я более подробно расскажу о нем.

Вещатель нужен для передачи видео-потока клиенту. Речь идет либо о живом потоке, либо о вещании записанного видео (VOD, Video-on-demand). Существует большое количество технологий вещания видео. Среди них можно выделить традиционные протоколы, такие как RTMP или MPEG-TS, а также появившиеся в последнее время технологии адаптивного вещания поверх HTTP. К последним относятся HLS (Apple), HDS (Adobe), Smooth Streaming (Microsoft), MPEG-DASH. При выборе технологии основным фактором является ее поддержка на клиентской стороне. Именно поэтому вещание в формате RTMP на текущий момент является одним из самых распространенных. Протокол HLS поддерживается устройствами компании Apple, а также некоторыми версиями Android.


Разработка видеохостинга на Erlang

Представляем вашему вниманию доклад Максима Лапшина, сделанный им на конференции Application Developer Days. Мы собрали воедино видео и аудио, слайды презентации, а также стенограмму доклада. Последнее потребовало огромных усилий, но оно явно того стоит. Сорокаминутный доклад можно «услышать» в несколько раз быстрее.

Свел видео и презентацию в единый ролик, а также записал стенограмму Стас Фомин (человек и пароходлокомотив :)).

Аннотация


Максим Лапшин (erlyvideo), разработчик масштабируемых веб-сервисов, рассказал о разработке сервера видеостриминга на Erlang. Речь идет об open-source проекте ErlyVideo — набирающем популярность надежном, масштабируемом и бесплатном сервере для трансляции любого видео — от охранных камер до видеоконференций. Особый интерес представляет именно технология, ведь именно выбор такого малоизвестного языка как Erlang, обеспечил высокую надежность, масштабируемость и скорость разработки.

Erlang — надежный объектный язык для создания сетевых сервисов. Принятые в нём концепции процессов и немутабельности данных, делают его единственной платформой в которой одновременно существует и сборка мусора, и фиксированное время смерти объекта. Семантика языка одна из самых простейших среди распространенных на рынке.

Эти особенности делают Erlang прекрасным выбором для обслуживания statefull клиентов: видеостриминговый сервер (erlyvideo), самый распространенный jabber-сервер (ejabberd), покерные серверы (OpenPoker) и т.п. В докладе рассмотрено, почему же именно на Erlang такое делать очень удобно.

Реализация простого видеочата на ASP.NET MVC

Но для начала предыстория. Мы запускаем сервис видеоконсультаций с врачом через интернет. О нём обязательно будет отдельная статья, а сейчас хотим выяснить, насколько большую нагрузку смогут выдержать сервера и каналы.
Для этого мы написали небольшое веб-приложение, исходным кодами и описанием которого рад с вами поделиться. 
Основная идея позаимствована у чатрулетки: заходишь в общий чат, выбираешь любого собеседника и общаешься по видео. 
Исходный код проекта опубликован на codeplex.com под свободной лицензией, буду рад комментариям/замечаниям/предложениям. 

Итак. В качестве протокола я выбрал RTMP как наиболее распространённый. Почему не RTMFP? Просто используя RTMFP сложно добиться устойчивого соединения между клиентами, что необходимо для оказания платных видеоконсультаций, да и серверная реализация раздачи айдишников недоступна для стабильного использования. В качестве сервера – Wowza Media Server, т.к. в отличие от бесплатного Red5 (да простят меня его сторонники) у него внятная документация с примерами, и в отличие от FMS пробный период в 30 дней и приемлемая ценовая политика. А качество работы проверим на практике, насколько я представляю, сильной разницы между всеми тремя по производительности нет. Как альтернативу мы рассматриваемerlyvideo, но подробно посмотреть и попробовать его пока возможности не было.

Пишется всё под ASP.NET MVC 4. И для реализации текстового чата и общения между клиентами используется библиотека SignalR.

Далее по пунктам.

Server implementations


Take 3 VOD and Live supports HLS for IOS as well as Flash for Android and PC all based on Google's Widevine DRM
  • MACNETIX VOD Server supports HLS playback and MACNETIX Transcoder supports Live.TV streaming to STBs and mobile devices
  • Anevia ViaMotion Servers support several protocols (HTTP Live Streaming, MS Smooth StreamingADS FlashMPEG DASH) for targeting any device. They support both live and on-demand streaming.
  • Packet Ship Overview:Origin server and Streamline video server both support HLS for on-demand, live and catch-up streaming.[2]
  • TVersity supports HTTP Live streaming in conjunction with on-the-fly transcoding for playback of any video content on iOS devices.
  • Helix Universal Server from RealNetworks supports iPhone OS 3.0 and later for live and on-demand HTTP Live or On-Demand streaming of H.264 and AAC content to iPhone, iPad and iPod.
  • IIS Media Services from Microsoft supports live and on-demand Smooth Streaming and HTTP Live Streaming.
  • Wowza Media Server from Wowza Media Systems supports live and on-demand streaming.
  • VODOBOX Live Server supports HTTP Live Streaming for iPhone, iPad, iPod and Google Android devices (Honeycomb 3.0 and above).
  • Akamai supports HTTP Dynamic Streaming for live and on-demand streams.
  • Level 3 supports HTTP Dynamic Streaming for live and on-demand streams.
  • InstaTV Server supports HTTP Live Streaming of ATSC/ClearQAM HDTV from Windows PC with any TV tuner card to iPhone, iPod, and iPad.
  • Unreal Media Server supports low latency HTTP Live Streaming as of version 9.5.
  • VLC Media Player supports HTTP Live Streaming for serving live and on-demand streams as of version 2.0[3]
  • Uplynk supports live and on-demand streaming for all devices by storing a single non-proprietary HLS encode.[4]
  • Erlyvideo[5] can stream HLS in a cache-friendly manner, allowing to reuse cached chunks for live stream and for archive viewing.