Использование API-интерфейсов StageVideo

Видео рабочей области представляет собой механизм среды выполнения, который улучшает качество воспроизведения видео и повышает производительность устройства. Среда выполнения создает и поддерживает работу данного механизма. Разработчик должен настроить конфигурацию приложения, чтобы можно было воспользоваться всеми его преимуществами.

Для использования видео рабочей области необходимо реализовать среду обработчиков событий, которые будут обнаруживать, что видео становится недоступным. При получении уведомления о том, что видео рабочей области стало доступным, извлеките объект 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 выполните указанные ниже действия верхнего уровня.

  1. Прослушивайте событие StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY , чтобы узнать, когда вектор изменился Stage.stageVideos . См. раздел Использование события StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY .

  2. Если событие StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY сообщает о доступности видео рабочей области, используйте объект Vector Stage.stageVideos в обработчике событий для получения доступа к объекту StageVideo.

  3. Присоедините объект NetStream с использованием функции StageVideo.attachNetStream() или присоедините объект Camera с использованием функции StageVideo.attachCamera() .

  4. Воспроизведение видео использование NetStream.play () .

  5. Прослушивайте событие StageVideoEvent.RENDER_STATE на объекте StageVideo, чтобы определить состояние воспроизведения видео. Получение этого события также означает, что были инициализированы или изменены свойства ширины и высоты видео. См. раздел « Использование событий StageVideoEvent.RENDER_STATE и VideoEvent.RENDER_STATE ».

  6. Прослушивайте событие 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 целевого объекта события.

Сообщается о следующих состояниях визуализации:

  • RENDER_STATUS_UNAVAILABLE

  • RENDER_STATUS_SOFTWARE

  • RENDER_STATUS_ACCELERATED

Состояния визуализации показывают, когда используется декодирование с аппаратным ускорением (независимо от класса воспроизводимого в настоящее время видео). По свойству 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 поддерживает все цветовые пространства за счет программного совмещения.