За последний год, видео было одной из главных тенденций в сети Интернет, главным образом за счет Adobe Flash Player. H.264 и full-screen поддерживались ещё во Flash Player 9 в 2007 году сделав поддержку HD-видео в вебе реальностью. Последние изменения Flash Player для мобильных устройств стали в области отображения видео и улучшения условий работы пользователей.

Традиционный метод представления видео во Flash Player – это Video объект. Video объект обрабатывается также, как и любой другой объект на сцене, что дает разработчику полный контроль над ним. Например видео может быть отображено на каждой грани вращаемого куба, или несколько видео может быть смешано между собой. Video объект обрабатывается, как и другие DisplayObject. Рисунок 1:

Для поддержки такого уровня контроля видео, Flash Player должен обрабатывать каждый кадр видео. В зависимости от мощности основного устройства, это может уменьшать частоту кадров видео или увеличивать нагрузку на процессор.

Новый способ отображения видео

Для улучшения производительности обработки видео, Adobe представляет Stage Video, как новый способ отображения видео. Этот подход использует аппаратное ускорение видео. В результате, снимая нагрузку с процессора, отображая видео с большей частотой кадров на менее мощных устройствах и используя меньше памяти. StageVideo не находится в списке отображения Flash Player’a , он находится за ней. На рисунке 2 это показано:

Преимущество в производительности особенно заметно для телевизоров, ТВ-приставок и мобильных устройств. У этих устройств нет таких мощных процессоров, как у настольных компьютеров, но они имеют мощные видео декодеры для обработки высококачественного видео минимально используя процессор. Как разработчик, вы должны понимать, что stage video — это второй этап улучшения связанный с видео ускорением во Flash Player. Первый этап это кодирование видео, чтобы максимально использовать аппаратное ускорение. Кодек H.264 — это лучший друг stage video; используя его, вы обеспечите себе полное GPU ускорение от декодирования видео до его отображения. С данным подходом нет обратного чтения (то есть отправки данных из GPU в процессор) это требуется для соединения видео кадров в списке отображения. Формат YUV 4:2:0 собирает видео кадры, то есть конвертирует в RGB через GPU шейдеры (DirectX9 или OpenGL) и выводит на экран. В результате высокое качество воспроизведения, уменьшение нагрузки на процессор и минимальность затрачиваемой памяти.

Ограничения

Stage video – это видео, которое обрабатывается через flash.media.StageVideo объект, что быстрее чем обработка через Video объект. Объект StageVideo всегда отображается в прямоугольном окне. Другая графика может быть только на слое/уровне выше StageVideo объекта, но не за видео объектом.

Следующие возможности недоступны при использовании StageVideo:

  • StageVideo объект не может быть повернут. Возможны вращения только под 90 градусов.
  • К объекту StageVideo не могут быть применены colorTransform или 3D трансформация. Т.к. это приведет к искажению видео.
  • К объекту StageVideo не могут быть применены alpha канал, blendMode, фильтры, маски или scale9Grid.
  • Видео не может быть скопировано в BitmapData (BitmapData.draw).
  • Видео не может быть растрово-кэшировано.
  • Видео не может быть добавлено в SWF файл. StageVideo может использовать только видео из NetStream объекта.
  • В зависимости от используемого оборудования, некоторые цвета могут не поддерживаться. В этих случаях Flash Player будет выбирать цвет заменитель. В ActionScript API предоставит средства для запроса цветов, которые используются.
  • В зависимости от платформы, количество отображаемых видео одновременно ограничено. На большинстве мобильных систем, разрешено отображение только одного видео. То есть, если у вас открыто несколько SWF файлов с видео, то аппаратное ускорение получит первое видео.
  • Для совместимости плеера на десктопах и на ТВ, режим WMODE нужно установить в режим DIRECT.
  • По возможности не использовать wmode=»transparent», т.к. например Google TV этого не поддерживает.
  • Если при разработке все ограничения соблюдены, то рекомендуется использовать StageVideo.

The Stage Video API

Начиная с Flash Player 10.2, существует новый класс StageVideo, который отображает одно видео с поддержкой аппаратного ускорения. StageVideo объекты создаются только Flash Player’ом.

var v:Vector.<StageVideo> = stage.stageVideos;
var sv:StageVideo;
if ( v.length >= 1 )
{
sv = v[0];
}

Длина вектора stage.stageVideos может быть разной, в зависимости от платформы и наличия аппаратных средств. Максимальное количество StageVideo объектов равно 8. Поэтому, если в вашем приложении требуется несколько StageVideo объектов, то это возможно на десктопе. На мобильных платформах – только один! Кроме того, длина вектора иногда может быть не равной нулю. Для того, чтобы узнать длину вектора stageVideos нужно слушать событие StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY.

Слушать данное событие можно всё время:

stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onStageVideoState);

Он будет отправлен один раз, сразу после регистрации обработчика событий, а также всякий раз, когда изменится. Более подробно об этом здесь.
В onStageVideoHandler, нужно проверять status — свойство доступа к объекту события StageVideoAvailability:

private function onStageVideoState(event:StageVideoAvailabilityEvent):void
{
var available:Boolean = (event.availability == StageVideoAvailability.AVAILABLE);
}

Свойство status может иметь следующие значения:

  • StageVideoAbility.AVAILABLE: видео доступно, по крайней мере один StageVideo объект находится в stageVideos.
  • StageVideoEvent.UNAVAILABLE: видео недоступно; stageVideos пуст.

Объект StageVideo может быть извлечен из stage.stageVideos. Если видео недоступно, нужно работать со стандартным Video объектом и использовать его в качестве запасного варианта:

private function toggleStageVideo(on:Boolean):void
{
// if StageVideo is available, attach the NetStream to StageVideo
if (on)
{
if ( sv == null )
{
// retrieve the first StageVideo object
sv = stage.stageVideos[0];
sv.addEventListener(StageVideoEvent.RENDER_STATE, stageVideoStateChange);
}
sv.attachNetStream(ns);
} else {
video.attachNetStream(ns);
stage.addChildAt(video, 0);
}
ns.play(FILE_NAME);
}

Заметьте, что мы слушаем новое событие StageVideoEvent.RENDER_STATE для StageVideo объекта, аналогично есть и для обычного Video объекта — это VideoEvent.RENDER_STATE:

private function stageVideoStateChange(event:StageVideoEvent):void
{
var status:String = event.status;
resize();
}

Во Flash Player 10.1 это было недоступно. Свойство status может иметь следующие значения, которые доступны как для StageVideoEvent, так и для VideoEvent:

  • StageVideoEvent.RENDER_STATUS_ACCELERATED: видео декодируется и собрано через GPU.
  • StageVideoEvent.RENDER_STATUS_SOFTWARE: видео декодируется с помощью ПО и собраны через GPU (если отправлено через StageVideo) или только с помощью ПО (если отправлено через Video).
  • StageVideoEvent.RENDER_STATUS_UNAVAILABLE: декодирование видео прекращено.

StageVideoEvent отправляется, как только NetStream присоединяется к объекту StageVideo, или VideoEvent для объекта Video. Например, если отправляется StageVideoEvent.RENDER_STATUS_SOFTWARE, сообщая, что видео декодируется с помощью ПО, вы можете попробовать переключиться на другой видео поток, такой как H.264 или поток с другим качеством, чтобы было больше возможностей, для декодирования с помощью GPU. Если аппаратное декодирование недоступено, вы можете перейти на не-аппаратное ускорение.

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

Следующий код вычисляет максимальные размеры видео при сохранении пропорции видео:

private function resize ():void
{
rc = computeVideoRect(sv.videoWidth, sv.videoHeight);
sv.viewPort = rc;
}

Запомните, что StageVideo это не DisplayObject, поэтому он не реагирует на свойства, которые используют для размещения и масштабирования DisplayObject во Flash. Предыдущий код использует свойство viewport, а не обычные свойства width и height, для определения размеров видео.

Объект StageVideo имеет следующие свойства:

  • colorSpaces:Vector: доступные «цветовые пространства».
  • depth:int: Глубина объекта StageVideo. Это свойство позволяет упорядочить несколько объектов StageVideo.
  • pan:Point: Координаты (по аналогии с X и Y); по умолчанию (0,0).
  • videoHeight:int: Реальная высота видео (свойство только для чтения).
  • videoWidth int: Реальная ширина видео (свойство только для чтения).
  • viewport:Rectangle: видимая поверхность (по аналогии с шириной и высотой);
  • zoom:Point: Масштаб; По умолчанию (1,1).

Работа с цветовыми пространствами

Свойство colorsSpaces доступно для объекта StageVideo и возвращает Vector.< Strings>:

var colorSpace:Vector.<String> = stageVideo.colorSpaces;

Имена цветовых пространств перечислены во flash.media.VideoColorSpace:

VideoColorSpace.BT601 = "BT.601";
VideoColorSpace.UNKNOWN = "unknown";
VideoColorSpace.BT709 = "BT.709";
VideoColorSpace.SMPTE_240M = "SMPTE-240M";
VideoColorSpace.USFCC:String = "USFCC";

За / Против

StageVideo не может быть доступно, пока SWF-файл обрабатывается, но оно может быть получено через некоторое время. Т.к. wmode параметр, которое вы выберете при интеграции SWF файлов будет определять последовательность загрузки видео во всех браузерах. Также, в некоторых случаях, вы не можете иметь возможность установить wmode = » direct». Кроме того, в полноэкранном режиме видео всегда будет доступно независимо от wmode значение. Но при выходе из полноэкранного режима, видео может снова стать недоступным (влияние wmode параметра).

Примечание: Из-за такого поведения, используя StageVideo API, вы всегда должны иметь объект Video для использования в качестве запасного варианта.

В результате, если stage video становится доступным, нужно присоединить к NetStream объект StageVideo. Когда он становится недоступным, просто прикрепить к созданному NetStreamVideo объект. Ниже представлен код, который демонстрирует описанный выше алгоритм:

private function toggleStageVideo(on:Boolean):void
{
 // if StageVideo is available, attach the NetStream to StageVideo
 if (on)
 {
 stageVideoInUse = true;
 if ( sv == null )
 {
 sv = stage.stageVideos[0];
 sv.addEventListener(StageVideoEvent.RENDER_STATE, stageVideoStateChange);
 }
 sv.attachNetStream(ns);
 if (classicVideoInUse)
 {
 // If using StageVideo, just remove the Video object from
 // the display list to avoid covering the StageVideo object
 // (always in the background)
 stage.removeChild(video);
 classicVideoInUse = false;
 }
 } else {
 // Otherwise attach it to a Video object
 if (stageVideoInUse) stageVideoInUse = false;
 classicVideoInUse = true;
 video.attachNetStream(ns);
 stage.addChildAt(video, 0);
 }
 if ( !played )
 {
 played = true;
 ns.play(FILE_NAME);
 }
}

Сценарии

  • Video object playing a non-accelerated codec: Для декодирования и композитинга будет использоваться процессор.
  • Video object playing a GPU accelerated codec (H.264): GPU будет использоваться для декодирования, но для композитинга используется процессор.
  • StageVideo object playing a non-accelerated codec: процессор будет использоваться для декодирования, для композитинга используется GPU.
  • StageVideo object playing a GPU accelerated codec (H.264): GPU используется для композитинга и декодирвоания. Процессор не используется. Это лучшее решение.

Заключение

И так новый Adobe Flash Player 10.2 бета-версия, в котором много новых функций и плюшек, включая аппаратное ускорение видео, которое позволяет значительно расширить качество воспроизведения видео.
StageVideo API — это большой шаг в сторону производительности видео во Flash. В некоторых случаях нагрузка на процессор уменьшается до 85 процентов.

Исходники и примеры.

Оригинал статьи — http://www.adobe.com/devnet/flashplayer/articles/stage_video.html