2012-05-11 2 views
7

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

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 (e.g., services, value objects) here --> 
</fx:Declarations> 
</s:View> 

аргументы

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

Добавлено Обновлено закодировать иметь слушателя StageVideoEvent и упрощения d одной из точек зрения (также знать 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 (e.g., services, value objects) here --> 
</fx:Declarations> 
</s:View> 

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

+0

Вы могли решить мерцающий и черный экран? – mik

ответ

0

Одна из возможных причин для мерцания заключается в том, что вы не слушаете StageVideo, перед тем как позвонить по телефону _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 e.g. addRegularVideo(); 
     } 

     playVideo(); 
    } 

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

Getting started with stage video

и этот учебник предоставляет некоторые больше образцов кода:

Creating a StageVideo Test in FDT with Flex 4.5 and FlashPlayer 10.2

+0

Кажется, все еще мерцает. Я добавил прослушиватель событий для stageVideoAvailability и попытался упростить его до одного вида. Новый код находится в нижней части сообщения под добавлением. Должна просто копировать представление и аргументы компилятора и устанавливать renderMode, чтобы направить и добавить видео и посмотреть его. спасибо за помощь, кстати! – Justin

0

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

Смежные вопросы