Silverlight

индекс
62,31

Smooth Streaming в Silverlight

В этом топике я не буду учить вас настраивать Smooth Streaming под IIS для Silverlight, не буду давать примеры кода для воспроизведения видео. Я ставлю цель рассказать принцип работы Smooth Streaming в Silverlight, недостаток IIS в роли streaming сервера и как Microsoft решила эту проблему. Я хочу получить отзывы от хабрасообщества о возможной применимости в жизни данного подхода вещания видео в Интернет.

Весь процесс от подготовки видео и до его трансляции конечному пользователю я представил в виде трех шагов.

Шаг первый.


Подготовка видео. Видео ролик хорошего качества специальным образом конвертируют (для этого можно использовать Expression Encoder 3, со специальным профилем настроек).

После конвертации получается несколько файлов с расширением ism, ismc и ismv.
Файлы с расширением .ismv это видео/аудио поток в формате mp4. Если вы захотите его скормить проигрывателю то, скорее всего он откажется вам его воспроизвести, т.к. в нем не хватает, необходимых для воспроизведения, данных. Таких файлов может быть несколько и зависит это от установок конвертации.

Файл с расширением ism связывает файла .ismv с битрейтом потока, который в нем содержится. Формат файла интуитивно понятный xml.
Файл .ismc содержит информацию о транслируемом потоке — количество и тип дорожек в потоке (audio и video), а также дополнительную информацию о параметрах и возможностях каждой дорожки — это количество и продолжительность ключевых кадров, количество и качество видео/аудио потоков, имя кодека, высоту и ширину кадра (только для видео), CodecPrivateData необходимую для воспроизведения в Silverlight).
Подведя итог, имеем: несколько файлов с видео/аудио данными с различным битрейтом и разрешением, а также файл — описание полученных качеств и файл описания трансляции (метаинформация), в котором указаны все дорожки и доступные качества для каждой дорожки.

Шаг второй.


Размещение или публикация на web сервере, в нашем случае это IIS. Перед публикацией видео, IIS нужно немного настроить, а именно установить бесплатное решение для адаптивного вещания и создать web узел с одной папкой, куда мы будем складывать наши видео файлы. Никаких дополнительных действий делать не нужно, расширение само зарегистрирует необходимые обработчики на нужные файлы. После всей настройки мы просто копируем/переносим файлы, полученные на первом шаге, в папку которая размещена в нашем web узле.
Если после этих не хитрых действий в строке web проводника указать адрес до файла с расширением .ism/manifest, то в результате мы получим содержимое .ismc файла.
В задачу сервера входит раздача файлов .ismc и формирование-раздача небольших фрагментов потока в формте mp4 по заданному смещению во времени и битрейту.

Шаг третий.


Трансляция видео пользователю через проигрыватель Silverlight. На мой взгляд это самый интересный этап.
Начну издалека. IIS спроектирован так, что он может достаточно хорошо обрабатывать большое количество коротких (в плане объема передаваемых данных) запросов, а при длительных и объемных запросах происходит стремительная утечка памяти. Поэтому транслировать видео, а это довольно много данных, не получится, если конечно вы не собираетесь обслуживать более ста подключений. Выходов в этой ситуации два, наращивать оперативную память или использовать собственный или сторонний стриминг сервер.
С выходом Silverlight 2 ситуация изменилась, а именно, теперь для воспроизведения видео исчезла необходимость в постоянном соединении с сервером, мы можем загрузить видео хоть в десять запросов, и все это благодаря грамотному подходу в архитектуре приема данных MediaElement'ом в SL. Теперь IIS нет необходимости обрабатывать один большой запрос и передавать видео целиком, теперь один видео ролик можно разбить на множество небольших кусочков, где каждый кусочек это отдельный запрос и каждый кусочек это отдельный ключевой кадр. Все это, вместе с режимом keep-alive (заставляет web обозреватель держать соединение с сервером открытым), дает очень хорошие результаты, например: расход оперативной памяти существенно снижается, с целью удаления утечек памяти мы можем переодически перезагружать рабочий процесс IIS без разрыва в проигрывании видео и т.д.
Вернемся к первоначальному вопросу — как происходит адаптивное вещания видео в Silverlight?
На клиенте оно происходит в три этапа:
  1. Загрузка и разбор .ism/manifest файла метаинформация. Это необходимо для того что бы:
    • достать информацию о шаблоне запроса до нужного фрагмента трансляции;
    • получить максимальное разрешение;
    • узнать продолжительности;
    • получить список ключевых кадров;
    • узнать количество дорожек и количество уровней деградации изображения;
    • также получить специальный параметре PrivateCodecData и т.д.
  2. Загрузка первого фрагмента трансляции. Для этого используем обычный HTTP GET запрос сформированный по заданному шаблону. Далее формирование пакета данных и отправка их встроенному декодеру Silverlight для отображения на экране пользователя.
  3. Анализ возможностей сетевого канала и получение битрейта, который будет доступен для воспроизведения без задержек, за тем формируется адрес следующего HTTP GET запроса до необходимого фрагмента видео, и так по кругу до тех пор пока просматриваемая трансляция не закончится.

Если смотреть на это через снифер, то будет видно множество HTTP запросов, вида .ism/QualityLevels({bitrate})/Fragments(video={time}), посылаемых web проводником, это и есть запросы на фрагменты видео. Как видно запросов много, а трансляция идет без разрыва.


Используя подобный подход, можно придумать и реализовать массу протоколов и улучшений вещания видео в интернете. Тем более что можно подсмотреть как написан SmoothStreaming на Silverlight и сделать свою реализацию. Серверную часть так же можно написать самому, например, для трансляции flv файлового архива (причины для этого я описывал в своем топике на Хабре Проигрывание FLV в Silverlight — Для чего это нужно).

_________
Текст подготовлен в ХабраРедакторе
+11
9 января 2010, 23:55
10

комментарии (25)

+1
outcoldman #
так и не понял смысл статьи. Вроде 3 шага для размещения публикации видео и настройки Smooth Streaming на IIS. А 3-й шаг — это уже не руководство к действую, а описание о том как все работает, за что отдельное спасибо, было интересно.
+1
Kano #
Первые два шага подготавливают к третьему, что бы было понятно что и от куда берется и кто за что отвечает.
+1
Chkon #
Лично мне статья понравилась, как раз подходит для первого ознакомления.
0
Kano #
Мало того, в этой статье я хотел показать гибкость настройки потока вещания в Silverlight.
+2
Sergun #
Интересно, почитал, спасибо :). Я тоже как-то написал серию статей по этому поводу.
www.gotdotnet.ru/blogs/sergun/5106/
www.gotdotnet.ru/blogs/sergun/5108/
www.gotdotnet.ru/blogs/sergun/6701/
www.gotdotnet.ru/blogs/sergun/6703/
www.gotdotnet.ru/blogs/sergun/6704/

В феврале также должна выйти моя большая статья на эту тему в журнале DevConnections (http://www.devconnections.com/)
0
Kano #
После прочтения приведенных выше статей у меня возник вопрос — каким образом Silverlight приложение определяет загруженность процессора для выбора оптимального битрейта?
Когда я разбирался с этим вопросом и подглядывал в исходники библиотеки, отвечающей за стриминг, я ничего подобного не нашел.
0
Sergun #
Это размышления или вопрос?
0
olegafx #
> у меня возник вопрос
0
Sergun #
Вообще, есть такой тип размышлений в стиле вопросов.
Если это вопрос ко мне — не знаю, настолько глубоко не копался. Однако, материалы, которые были у меня под рукой говорили о том, что оно действительно так.
0
olegafx #
Очевидно же — у человека возник вопрос, он искал ответ, но не нашел. А раз вопрос остался нерешенным, то он спрашивает ответ у Вас, как автора данных статей.
0
Sergun #
Олег, не все вещи такие очевидные как кажутся. Эта истина приходит к человеку со временем.
0
XaocCPS #
отлично! спасибо, жду продолжения, материала по теме мало на русском языке
0
ixside #
Эт, получается, на сервере будут лежать куча одних и тех же видео, но с разным битрейтом?
0
Kano #
Почему куча?
Минимум на одно видео будет 3 файла, на у максимум зависит от ваших возможностей.
На каждое видео можно иметь два качества или даже одно. Я считаю что смысл не в том что будет адаптивное вещание, а в том что IIS, наконец, может полноценно раздавать видео потоки.
+1
ixside #
А я представлял себе динамическое реалтайм кодирование в нужное качество :(
0
A1lfeG #
А есть информация о том, как организовывают онлайн вещание через Smooth Streaming?
Пару таких вещаний было от MS пресконфренций и кажется в прощальнии с Джесоном
0
gaploid #
Online вещание SS делается на данный момент с помощью железок, например вот этой inlethd.com/?q=products/spinnaker на ней происходит нарезка видео потока в smooth streaming format, который публикуется push`em на IIS сервера.
0
Kano #
Я лично не разбирался с этой темой.
Только знаю что Silverlight 4 Beta может захватывать и передавать видео на сервер, а что с ним происходит дальше я не знаю. Скорее всего это формирования куска видео (MP4 файл) на клиенте и последующая его загрузка на сервер (думаю это будет простой POST запрос), после чего он будет передан по назначению подписчикам.
+3
gaploid #
Пара комментариев:
1. Мне кажется, стоит упоминуть, что в контейнере mp4, может хранится данные в следующих кодеках, в VC-1, h264, WMA, AAC. Так же видел что deep zoom composer Jpegи кладет в этот формат и iis это тоже все отлично вещает.
2. IIS всегда отдавал по умолчанию в progressive download, другими словами всегда было много http stateless запросов со смещением. В этом плане тут ничего не изменилось и выход silvelight 2 тут не причем. Возможно вы путаете с проколами MMS или RTSP да там идет потоковое вещание и сервер хранит информацию о подключенных клиентах, но поддержка этих протоколах есть в Windows media services, и в IIS ее не было.
3. Основное приемущество это динамическое и плавное переключение между разными качествами контента.
4. Вот тут очень подробно расписано alexzambelli.com/blog/2009/02/10/smooth-streaming-architecture/
0
Kano #
2. Отдавал и отдает, это верно, но когда отдаем видео большим куском происходит утечка памяти. Особенно это заметно когда много подключений и много видео. Из этого я сделал вид что для progressive video download IIS как то не заточен.
Я не путаю ни с MMS, ни с RTSP. Я знаю что такое Windows media services и как этим пользоваться. Я разрабатываю видео хостинг на IIS и очень хорошо представляю все недостатки IIS в этом плане. Причем от версии к версии (а начинал я с версии IIS 5.1) ничего в этом плане не меняется.
3. Основное приемущество в том что IIS теперь может вещать видео в масштабах более 1000 одновременных подключений.
4. Спасибо за ссылку много становится понятным.
0
A1lfeG #
>IIS спроектирован так, что он может достаточно хорошо обрабатывать большое количество коротких (в плане объема передаваемых данных) запросов, а при длительных и объемных запросах происходит стремительная утечка памяти

А можно с этого места поподробнее? Впервые слышу о такой проблеме.

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

А то из вашей статьи можно сделать вывод, что вся технология была создана только потому, что в IIS плохая реализация отдачи больших файлов, что тоже вызывает сомнения.
0
Sapercheg #
IIS никогда не мог отдать файл больше 4 Гб
0
Kano #
Все что вы написали верно и об этом было сказано во многих местах и можно было додуматься самому, немного «пораскинув мозгами». Но никто не дал мне ответа на вопрос почему IIS так странно ведет себя при передаче больших файлов. Я на это деле получил много синяков и шишек. Читал всевозможные статьи в Интернет, смотрел зарубежные блоги и коментарии, но находил только вопросы похожие на мой.
Возможно дело в кешировании, но я отключал все возможные настройки связанные с кешированием, смотрел счетчики производительности и расхода памяти и ничего не давало мне ответа на мой вопрос.
Проблему решил написав свой сервер progressive video download который мог на одной машине обрабатывать до 2000 одновременных подключений (на большее не хватало канала и винчестеры не справлялись с нагрузкой). У данного решения масса недостатков, но главное приемущество он мог работать месяцами и не падать.
0
gaploid #
Зачем нужно было писать свой сервер?? есть бесплатный Windows media services в нем можно включить http протокол. Это и будет progressive streaming, отлично держит тысячи одновременных подключений.
0
Kano #
Возможно для SL он и подойдет, но для Flash будет бесполезен.

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