Видео рабочей области представляет собой механизм среды выполнения, который улучшает качество воспроизведения видео и повышает производительность устройства. Среда выполнения создает и поддерживает работу данного механизма. Разработчик должен настроить конфигурацию приложения, чтобы можно было воспользоваться всеми его преимуществами.
Для использования видео рабочей области необходимо реализовать среду обработчиков событий, которые будут обнаруживать, что видео становится недоступным. При получении уведомления о том, что видео рабочей области стало доступным, извлеките объект StageVideo из свойства
Stage.stageVideos
. Среда выполнения заполняет данный объект Vector, используя один или несколько объектов StageVideo. Затем для отображения потокового видео вместо объекта Video можно использовать один из предоставленных объектов StageVideo.
В проигрывателе Flash Player при получении уведомления о том, что видео рабочей области больше недоступно, переключите поток видео на объект Video.
Примечание.
Объекты StageVideo нельзя создавать.
Свойство Stage.stageVideos
Свойство
Stage.stageVideos
— это объект Vector, который предоставляет доступ к экземплярам StageVideo. Этот вектор может содержать до четырех объектов StageVideo, в зависимости от аппаратных средств и системных ресурсов. На мобильных устройствах это может быть один объект или ни одного.
Когда видео рабочей области не доступно, этот вектор не содержит объектов. Чтобы избежать возникновения ошибок среды выполнения, убедитесь, что обращение к элементам этого вектора происходит только когда последнее событие
StageVideoAvailability
, сообщает о доступности видео рабочей области.
События StageVideo
API-интерфейс StageVideo включает следующие события:
-
StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
-
Отправляется при изменении свойства
Stage.stageVideos
. Свойство
StageVideoAvailabilityEvent.availability
имеет значение
AVAILABLE
или
UNAVAILABLE
. Используйте это событие, чтобы определить, содержит ли свойство
stageVideos
объекты StageVideo, вместо того, чтобы напрямую проверять длину вектора
Stage.stageVideos
.
-
StageVideoEvent.RENDER_STATE
-
Отправляется, если объект NetStream или Camera был присоединен к объекту StageVideo и сейчас воспроизводится. Указывает тип используемого сейчас декодирования: аппаратное, программное или недоступно (ничего не отображается). Цель события содержит свойства
videoWidth
и
videoHeight
, которые можно использовать для изменения размера окна просмотра видео.
Важная информация.
Для координат, полученных от целевого объекта StageVideo, используются координаты рабочей области, поскольку они не являются частью стандартного списка отображения.
-
VideoEvent.RENDER_STATE
-
Отправляется, когда используется объект Video. Указывает тип используемого декодирования: программное или с аппаратным ускорением. Если это событие показывает декодирование с аппаратным ускорением, переключитесь на объект StageVideo, если это возможно. Цель события видео содержит свойства
videoWidth
и
videoHeight
, которые можно использовать для изменения размера окна просмотра видео.
Рабочий процесс для реализации функции StageVideo
Для реализации функции StageVideo выполните указанные ниже действия верхнего уровня.
-
Прослушивайте событие
StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
, чтобы узнать, когда вектор изменился
Stage.stageVideos
. См. раздел
Использование события StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
.
-
Если событие
StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
сообщает о доступности видео рабочей области, используйте объект Vector
Stage.stageVideos
в обработчике событий для получения доступа к объекту StageVideo.
-
Присоедините объект NetStream с использованием функции
StageVideo.attachNetStream()
или присоедините объект Camera с использованием функции
StageVideo.attachCamera()
.
-
Воспроизведение видео использование
NetStream.play ()
.
-
Прослушивайте событие
StageVideoEvent.RENDER_STATE
на объекте StageVideo, чтобы определить состояние воспроизведения видео. Получение этого события также означает, что были инициализированы или изменены свойства ширины и высоты видео. См. раздел «
Использование событий StageVideoEvent.RENDER_STATE и VideoEvent.RENDER_STATE
».
-
Прослушивайте событие
VideoEvent.RENDER_STATE
для объекта Video. Это событие предлагает те же самые состояния, что и событие
StageVideoEvent.RENDER_STATE
. Таким образом, его можно также использовать для определения доступности ускорения графического процессора. Получение этого события также означает, что были инициализированы или изменены свойства ширины и высоты видео. См. раздел «
Использование событий StageVideoEvent.RENDER_STATE и VideoEvent.RENDER_STATE
».
Инициализация прослушивателей событий StageVideo
Настройте прослушиватели событий StageVideoAvailabilityEvent и VideoEvent при инициализации приложения. Например, эти прослушиватели можно инициализировать в обработчике событий
flash.events.Event.ADDED_TO_STAGE
. Данное событие гарантирует, что приложение отображается в рабочей области:
public class SimpleStageVideo extends Sprite
private var nc:NetConnection;
private var ns:NetStream;
public function SimpleStageVideo()
{
// Constructor for SimpleStageVideo class
// Make sure the app is visible and stage available
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
//...
// Connections
nc = new NetConnection();
nc.connect(null);
ns = new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
ns.client = this;
// Screen
video = new Video();
video.smoothing = true;
// Video Events
// the StageVideoEvent.STAGE_VIDEO_STATE informs you whether
// StageVideo is available
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY,
onStageVideoState);
// in case of fallback to Video, listen to the VideoEvent.RENDER_STATE
// event to handle resize properly and know about the acceleration mode running
video.addEventListener(VideoEvent.RENDER_STATE, videoStateChange);
//...
}
Использование события StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
В обработчике
StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
укажите, какой объект, Video или StageVideo, будет использоваться в зависимости от доступности StageVideo. Если для свойства
StageVideoAvailabilityEvent.availability
установлено значение
StageVideoAvailability.AVAILABLE
, используйте StageVideo. В этом случае у вас будет уверенность, что вектор Stage.stageVideos содержит один или несколько объектов StageVideo. Получите объект StageVideo из свойства
Stage.stageVideos
и присоедините к нему объект NetStream. Поскольку объекты StageVideo всегда отображаются на заднем плане, удалите все существующие объекты Video (всегда находятся на переднем плане). С помощью обработчика этого события можно также добавить прослушиватель для события
StageVideoEvent.RENDER_STATE
.
Если для свойства
StageVideoAvailabilityEvent.availability
установлено значение
StageVideoAvailability.UNAVAILABLE
, не используйте StageVideo и не обращайтесь к вектору
Stage.stageVideos
. В этом случае присоедините объект NetStream к объекту Video. В конце добавьте объект StageVideo или Video в рабочую область и вызовите
NetStream.play()
.
В коде ниже показано, как обрабатывать событие
StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
.
private var sv:StageVideo;
private var video:Video;
private function onStageVideoState(event:StageVideoAvailabilityEvent):void
{
// Detect if StageVideo is available and decide what to do in toggleStageVideo
toggleStageVideo(event.availability == StageVideoAvailability.AVAILABLE);
}
private function toggleStageVideo(on:Boolean):void
{
// To choose StageVideo 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 you use StageVideo, remove from the display list the
// Video object to avoid covering the StageVideo object
// (which is 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);
}
}
Важная информация.
При первом обращении приложения к элементу вектора в Stage.stageVideos[0] свойство «rect» имеет по умолчанию значение 0,0,0,0, а в свойствах «pan» и «zoom» используются значения по умолчанию. Для этих параметров всегда можно установить свои значения. Свойства
videoWidth
и
videoHeight
для цели события
StageVideoEvent.RENDER_STATE
или
VideoEvent.RENDER_STATE
можно использовать для расчета размера окна просмотра видео.
Полный исходный код этого примера приложения можно загрузить на странице «
Приступая к работе со Stage Video
».
Использование событий StageVideoEvent.RENDER_STATE и VideoEvent.RENDER_STATE
Объекты StageVideo и Video отправляют события, чтобы сообщить программе об изменении среды визуализации. Этими событиями являются
StageVideoEvent.RENDER_STATE
и
VideoEvent.RENDER_STATE
.
Объект StageVideo или Video объект отправляет событие состояния визуализации, когда присоединяется объект NetStream и запускается воспроизведение. Объект также отправляет это событие при изменении среды визуализации, например после изменения размеров окна просмотра видео. Используйте эти уведомления, чтобы восстановить для окна просмотра текущие значения
videoHeight
и
videoWidth
целевого объекта события.
Сообщается о следующих состояниях визуализации:
Состояния визуализации показывают, когда используется декодирование с аппаратным ускорением (независимо от класса воспроизводимого в настоящее время видео). По свойству
StageVideoEvent.status
можно узнать о доступности необходимого декодирования. Если это свойство имеет значение «unavailable», объект StageVideo не сможет воспроизвести видео. Этот статус означает, что нужно немедленно заново присоединить объект NetStream к объекту Video. Другие статусы сообщают о текущих условиях визуализации приложения.
В таблице ниже описывается влияние всех значений состояния визуализации для объектов StageVideoEvent и VideoEvent в проигрывателе Flash Player.
|
VideoStatus.ACCELERATED
|
VideoStatus.SOFTWARE
|
VideoStatus.UNAVAILABLE
|
StageVideoEvent
|
Декодирование и визуализация выполняются на аппаратном уровне. (Наилучшая производительность.)
|
Визуализация выполняется на аппаратном уровне, а декодирование — на программном. (Приемлемое быстродействие.)
|
Для обработки видео недоступны ресурсы графического процессора, и ничего не отображается.
Переход к объекту Video.
|
VideoEvent
|
Визуализация выполняется на программном уровне, а декодирование — на аппаратном. (Приемлемая производительности только на современных настольных системах. Низкая производительность полноэкранном режиме.)
|
Визуализация и декодирование выполняются на программном уровне. (Наихудшая производительность. Низкая производительность полноэкранном режиме.)
|
(Н/Д)
|
Цветовые пространства
Видео рабочей области использует аппаратные возможности для обеспечения поддержки цветовых пространств. SWF-содержимое может содержать метаданные с указанием предпочтительного цветового пространства. Однако возможность использования цветового пространства определяется графическим оборудованием устройства. Одни устройства могут поддерживать несколько цветовых пространств, тогда как другие могут не поддерживать ни одного. Если оборудование не поддерживает запрошенное цветовое пространство, Flash Player попытается найти наиболее похожее цветовое пространства из набора поддерживаемых.
Чтобы запросить, какие цветовые пространства поддерживает оборудование, используйте свойство
StageVideo.colorSpaces
. Данное свойство возвращает список поддерживаемых цветовых пространств в векторе String:
var colorSpace:Vector.<String> = stageVideo.colorSpaces();
Чтобы узнать, какое цветовое пространство используется в воспроизводимом видео, проверьте свойство
StageVideoEvent.colorSpace
. Проверьте это свойство в обработчике события
StageVideoEvent.RENDER_STATE
:
var currColorSpace:String;
//StageVideoEvent.RENDER_STATE event handler
private function stageVideoRenderState(event:Object):void
{
//...
currColorSpace = (event as StageVideoEvent).colorSpace;
//...
}
Если Flash Player не может найти замену для неподдерживаемого цветового пространства, будет использовано цветовое пространство по умолчанию — BT.601. Например, видео с кодировкой H.264 обычно использует цветовое пространство BT.709. Если BT.709 не поддерживается на устройстве, свойство
colorSpace
возвращает
"BT601"
. Если свойство
StageVideoEvent.colorSpace
имеет значение
"unknown"
, это означает, что оборудование не предоставляет возможности запроса цветового пространства.
Если текущее цветовое пространство окажется неподходящим для приложения, можно переключиться с объекта StageVideo на объект Video. Класс Video поддерживает все цветовые пространства за счет программного совмещения.
|
|
|