Мерцание с StageVideo на планшете Android?

У меня есть класс stageVideo, который я использую для воспроизведения видео на планшете, но каждый раз, когда я воспроизвожу видео, экран планшета мерцает несколько раз (идет черным, затем выходит из него примерно четыре или около того) Мне интересно, что может быть причиной это. Он делает это, пока я переключаюсь на представление при воспроизведении видео. URL-адрес видео передается в виде просмотра видео mxml. Я использую flex 4.6 и планшет Android (EEE transformer prime).

package ios { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.NetStatusEvent; import flash.events.StageVideoAvailabilityEvent; import flash.events.StageVideoEvent; import flash.geom.Rectangle; import flash.media.StageVideo; import flash.media.StageVideoAvailability; import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; [Bindable] public class iOSStageVideo extends Sprite { private var videoPath:String; private var videoWidth:Number; private var videoHeight:Number; private var _sv:StageVideo; private var _vd:Video; private var _obj:Object; private var _ns:NetStream; public function iOSStageVideo( path:String , w:Number , h:Number ):void { videoPath = path; videoWidth = w; videoHeight = h; addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); } //stage is ready private function onAddedToStage(e:Event):void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; var nc:NetConnection = new NetConnection(); nc.connect(null); _ns = new NetStream(nc); _obj = new Object(); _ns.client = _obj; _ns.bufferTime = 2; _ns.client = _obj; _obj.onMetaData = MetaData; _sv = stage.stageVideos[0]; _sv.viewPort = new Rectangle(0, 42, videoWidth , videoHeight ); _sv.attachNetStream(_ns); playVideo(); } //video is ready, play it //public, can be called externally public function playVideo():void{ _ns.play( videoPath ); _ns.addEventListener(NetStatusEvent.NET_STATUS, videoStatus); } //required metadata for stagevideo, even if not used private function MetaData(info:Object):void{ } //get video status private function videoStatus(e:NetStatusEvent):void{ switch(e.info.code){ case "NetStream.Play.StreamNotFound": //do something break; case "NetStream.Play.Start": //do something break case "NetStream.Play.Stop": //do something trace('the video has ended'); stopVideo(); break; case "NetStream.Buffer.Empty": //do something break; case "NetStream.Buffer.Full": //do something break; case "NetStream.Buffer.Flush": //do something break; case "NetStream.Play.Complete": //do something break; } } //stop and clear the video //public, can be called externally public function stopVideo():void{ trace("StopVideo is ran."); _ns.close(); _ns.dispose(); dispatchEvent( new Event('videoDone', true ) ); } public function stopVideoBack():void { _ns.close(); _ns.dispose(); } } 

}

Вот мой код для представления, воспроизводящего видео, когда видео завершено

 <?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="" backgroundAlpha="0" creationComplete="init(event)" addedToStage="onAddedToStage(event)" > <fx:Script> <![CDATA[ import ios.iOSStageVideo; import mx.core.UIComponent; import mx.events.FlexEvent; protected var path:String = new String(""); protected var backPage:String = new String(""); protected var vid:iOSStageVideo = new iOSStageVideo( path , 1280 , 720 ); private var arr:Array; //protected var vid:iOSStageVideo; protected var container:UIComponent = new UIComponent(); protected function init(event:FlexEvent):void { // Sets up the back button to back to the right slide arr = data as Array; trace(data); path = String(arr[0]); backPage = String(arr[1]) //creates the video vid = new iOSStageVideo( path , 1280 , 720 ); loadVideo(); //takes out the trash when the back button is hit so the stage video is ready when the new view is loaded stage.addEventListener("keyDown", handleButtons, false,1); stage.addEventListener("keyUp", handleButtons, false, 1); } override public function createReturnObject():Object { var returnedObject:Object = new Object(); returnedObject.myValue = arr[2]; trace("arr[2] ->" + arr[2]) return returnedObject; } protected function loadVideo():void { //loades the video vid.addEventListener('videoDone' , videoStop); container.width = stage.stageWidth; container.height = stage.stageHeight; addElement( container ); container.addChild( vid ); } protected function playVideo(event:MouseEvent):void { vid.playVideo(); } private function videoStop(e:Event):void { //removes container container.removeChild( vid ); removeElement( container ); navigator.popView(); } private function removeEverything():void { vid.stopVideoBack(); try { container.removeChild( vid ); removeElement( container ); } catch(error:Error) { trace("error with container"); } } protected function onAddedToStage(event:Event):void { if (stage.autoOrients) { stage.removeEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging); stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging, false, 100, true); } } private function orientationChanging(event:StageOrientationEvent):void { event.stopImmediatePropagation(); if (event.afterOrientation == StageOrientation.ROTATED_LEFT || event.afterOrientation == StageOrientation.ROTATED_RIGHT) { event.preventDefault(); } } protected function handleButtons(event:KeyboardEvent):void { if (event.keyCode == Keyboard.HOME) { // Handle Home button. } else if (event.keyCode == Keyboard.BACK) { // Hanlde back button. removeEverything(); } } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visual elements (eg, services, value objects) here --> </fx:Declarations> </s:View> 

Компиляторы

 -locale en_US -swf-version=13 -target-player=11.0 -define CONFIG::LOGGING false -define CONFIG::FLASH_10_1 true 

Добавлен обновленный код для прослушивания StageVideoEvent и упрощен до одного представления (также для того, чтобы знать, что renderMode настроен на прямой)

 <?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="video" backgroundAlpha="0" creationComplete="init(event)" > <fx:Script> <![CDATA[ import mx.core.UIComponent; protected var videoPath:String = new String("video.mp4"); private var videoWidth:Number = 1280; private var videoHeight:Number = 680; private var stageVideoAvail:Boolean; private var sv:StageVideo; private function init(e:Event):void { trace("ran one"); onAddedToStage(); } private function onAddedToStage():void { trace('test'); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onStageVideoAvailability); } private function onStageVideoAvailability( e : StageVideoAvailabilityEvent ) : void { if (e.availability == StageVideoAvailability.AVAILABLE){ stageVideoAvail = true; initVideo(); } else { stageVideoAvail = false; } } private function initVideo():void { var obj:Object = new Object(); var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = obj; if(stageVideoAvail) { sv = stage.stageVideos[0]; sv.addEventListener(StageVideoEvent.RENDER_STATE, onRender); sv.attachNetStream(ns); trace('available'); } else { var vid:Video = new Video(videoWidth, 768); addChild(vid); vid.attachNetStream(ns); trace('not'); } ns.play( videoPath ); } private function onRender(e:StageVideoEvent):void { sv.viewPort = new Rectangle(0, 0, videoWidth, 768); } public function onMetaData(e:Object):void { } public function onXMPData(e:Object):void { } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visual elements (eg, services, value objects) here --> </fx:Declarations> </s:View> 

Единственное другое представление в этом приложении просто имеет кнопку с navigator.pushView (Copyofvideo, null, null); И когда нажата кнопка, экран мерцает, а затем воспроизводится видео.

Одной из возможных причин мерцания является то, что вы не слушаете доступность _ns.play() прежде чем вы _ns.play() . Выслушав StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY , вы можете управлять получением и проигрыванием StageVideo .

Вместо

 private function onAddedToStage(e:Event):void { ... _sv = stage.stageVideos[0]; _sv.viewPort = new Rectangle(0, 42, videoWidth , videoHeight ); _sv.attachNetStream(_ns); playVideo(); } 

сделай это

  private function onAddedToStage(e:Event):void { stage.addEventListener( StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onStageVideoAvailability ); } private function onStageVideoAvailability( event : StageVideoAvailabilityEvent ) : void { var available : Boolean = (event.availability == StageVideoAvailability.AVAILABLE); ... if ( available ) { addStageVideo(); } else { //implement an alternative eg addRegularVideo(); } playVideo(); } 

Adobe Developer Connection обсуждает, как прослушивать доступность StageVideo в этом учебнике:

Начало работы со сценовым видео

И этот учебник содержит несколько примеров кода:

Создание теста StageVideo в FDT с помощью Flex 4.5 и FlashPlayer 10.2

Вы пытались изменить режим рендеринга? У меня были проблемы с Stage Video, когда он был в режиме Direct. Изменение его на CPU, похоже, помогло решить проблемы с StageVideo, которые у меня были.