Как стать автором
Обновить

Smooth Streaming в Silverlight

Время на прочтение4 мин
Количество просмотров4.7K
В этом топике я не буду учить вас настраивать 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 — Для чего это нужно).

Теги:
Хабы:
Всего голосов 55: ↑33 и ↓22+11
Комментарии25

Публикации

Ближайшие события