Dynamic Streaming — адаптивное качество


Динамический стриминг (dynamic streaming) — это процесс эффективной доставки видео пользователям изменяя качество и размер видео потока по ходу просмотра. Это дает возможность пользователям получить наилучшее доступное им качество видео при их скорости Интернет канала и вычислительной мощности процессора (не все компьютеры справятся с ренедрингом HD видео). Важной особенностью динамического стриминга является возможность сделать процесс плавным и незаметным для пользователя настолько, чтобы он не замечал переключения. Интересное применение этой функциональности — разрешение платным пользователям переключаться в HD видео поток при просмотре контента.
В этой статье мы рассмотрим данную технологию и особенности ее применения.

При просмотре длительного контента (как правило более 5 минут) высокого качества пользователи часто наблюдают флуктуации доступной им полосы пропускания. Такое часто случается из-за использования нескольких сетевых приложений на компьютере, изменения качества беспроводного соединения или просто при совместном использовании одного канала (например, в офисе). В конечном результате пользователь может испытывать регулярные буферизации, даже при наличии в среднем более высокой ширины канала, чем битрейт просматриваемого видео. Динамический стриминг отслеживает такие флуктуации и переключается между потоками разных битрейтов для того, чтобы качество видео соответствовало доступной пользователю ширине Интернет канала.
Другим интересным применением данной функциональности является старт видео в низком качестве и дальнейшее повышение качества до доступного пользователю в соответствии с его параметрами Интернет канала и вычислительной мощности компьютера. Тем самым Вы можете достичь большей интерактивности своего видео портала, когда видео начинает воспроизведение существенно быстрее, т.к. требуется существенно меньший объем буфера для начала воспроизведения.
Серьезной проблемой, особенно при просмотре HD видео, могут быть ограничения оборудования пользователя. Если CPU не может достаточно быстро декодировать видео поток, то это приводит к увеличению dropped frames, что может привести к воспроизведению видео рывками. В данной ситуации понижение качества видео потока приведет к улучшению воспроизведения.
Динамический стриминг решает задачи соответствия сетевым флуктуациям и перегрузкам CPU пользователя. Постоянный мониторинг QoS метрик на стороне клиента позволяет отследить моменты, когда стоит переключать качество видео вверх или вниз. Вам не требуется специальным образом транскодировать файлы, Вы можете использовать существующие видео файлы, созданные с разными битрейтами. Flash Media Server поддерживает динамический стриминг в том числе и для H.264 видео с AAC/AAC+ аудио (не только для FLV файлов).

Рекомендации по подготовке контента
Для наилучшего просмотра видео пользователями рекомендуется соблюдать следующие основные моменты:

  • Соответствие временных шкал всех видео единиц
  • Для плавного перехода желательно использовать одинаковые кодеки и аудио битрейты во всех потоках. В противном случае возможны звуковые всплески в момент переключения качества.
  • Хотя это и не требуется, но все же желательно обеспечить одинаковый интервал ключевых кадров (частота ключевых кадров) и частота кадров (fps) во всех потоках. Чем меньше интервал ключевых кадров, тем быстрее сервер может переключить потоки.
  • Используйте одинаковый аудио битрейт. Для низкого качества можно экономить суммарный битрейт за счет перехода в моно режим.

Как работает динамический стриминг
Динамический стриминг работает на Flash Media Server 3.5 и Flash Player 10 (или AIR 1.5) на стороне клиента. Он доступен во всех версиях Flash Media Server (Interactive, Streaming, Developer) и не требует никаких дополнительных настроек. При некотором шаманстве достичь подобной функциональности можно и при использовании других медиа серверов (или даже HTTP PD).

Flash Media Server управляет переключением потоков для пользователя на основе запросов, генерируемых на стороне клиентского приложения. После получения запроса на переключение потока на другое качество (битрейт) сервер некоторое время ожидает наиболее оптимальной точки для осуществления перехода, чтобы этот переход был как можно менее заметен. Это происходит в ближайшем ключевом кадре для видео потока. Это означает, что если видео подготовлено с ключевыми кадрами раз в шесть секунд, то переключение может занять до шести секунд. После этого сервер отправляет событие об успешном переключение.
Также важно контроллировать размер доступного буфера. Стоит убедиться, что доступного буфера достаточно для выполнения перехода на другой поток, т.к. после отправки запроса на переключение старый поток перестанет пополнятся. Клиентское приложение получает уведомления об основных событиях в течение перехода. После того как сервер получает запрос на переключение и начинает его обрабатывать, генерируется NetStatusEvent с info Object и свойством code (event.info.code) установленным в NetStream.Play.Transition. Это означает, что сервер начал процесс переключения качества и ожидает следующего ключевого кадра для выполнения переключения.

После успешного переключения видео потока генерируется событие со статусом воспроизведения, вызывается обработчик события onPlayStatus() объекта NetStream. Единственный параметр — объект со свойством code установленным в NetStream.Play.TransitionComplete.

Клиентский ActionScript API включает свойство info класса NetStream. Когда Вы обращаетесь к данному свойству он возвращает снимок доступных QoS метрик в виде объекта класса NetStreamInfo. Этот класс содержит 19 свойств, каждое из которых описывает определенный аспект качества связи и характеристик воспроизведения. На основе этих метрик Вы можете строить уникальные стратегии динамического переключения.

Два наиболее важных свойства — это NetStreamInfo.maxBytesPerSecond и NetStreamInfo.droppedFrames. Свойство NetStreamInfo.maxBytesPerSecond — один из простейших и прямых путей определения максимальной пропускной способности Интернет канала пользователя. NetStreamInfo.droppedFrames отображает общее число отброшенных кадров к моменту, когда NetStream.info был запрошен. Для корректного мониторинга данного свойства Вам стоит периодически проверять значение и сравнивать его с предыдущим. В случае если изменение больше чем на 20%, возможно Вам стоит осуществить понижение качества видео потока.

Adobe предлагает некоторые готовые разработки для реализации динамического стриминга в Ваших приложениях. Наиболее интересными являются классы DynamicStream и DynamicStreamItem. Их можно скачать со страницы Flash Media Server Tools. Эти классы предлагают мощные средства быстрой реализации функций динамического стриминга без разработки сложных алгоритмов мониторинга QoS метрик и продумывания стратегий переключения. Классы DynamicStream и DynamicStreamItem используют основные QoS метрики доступные из свойства NetStream.info и предлагают простой в использовании API, который позволяет управлять всем процессом вручную. Опять же обладая всеми исходными кодами Вы всегда можете доработать алгоритмы по Вашему усмотрению.

Класс DynamicStream расширяет класс NetStream и используется как альтернатива NetStream. Для использования класса DynamicStream Вам нужно создать инстанс этого класса, передав ему ссылку на объект NetConnection через который он будет работать, также как это делается при использовании обычного NetStream. Объект DynamicStream содержит метод startPlay() в который можно передать массив потоков, подготовленных в разном качестве, в виде объектов класса DynamicStreamItem.
Примерный код инициализации динамического стриминга

1
2
3
4
5
6
7
8
var ds:DynamicStream = new DynamicStream( myNetConnection );
 
var dsi:DynamicStreamItem = new DynamicStreamItem();
dsi.addStream( "MP4:sample1_500kbps.f4v", 500 );
dsi.addStream( "MP4:sample1_700kbps.f4v", 700 );
dsi.addStream( "MP4:sample1_1000kbps.f4v", 1000 );
 
ds.startPlay( dsi );

С точки зрения разработки данной функциональности в существующем плеере Вы можете перейти на использование DynamicStream, доступного для скачивания на сайте Adobe. Альтернативный вариант реализации — перейти на использование OSMF и подключить соответствующий плагин (SMIL — он создает корректный MediaElement из файла с описанием динамического видео элемента). Кстати, Adobe настоятельно рекомендует переходить на использование OSMF в своих проектах, т.к. именно это направление будет активно развиваться в дальнейшем.