2012-05-11 9 views
7

Tengo una clase de video de escenario que la utilizo para reproducir un video en una tableta, pero cada vez que reproduzco un video, la pantalla de la tableta parpadea un par de veces (se pone negra y sale unas cuatro veces). Me pregunto qué podría estar causando esto Hace esto mientras cambio a la vista con la reproducción del video. La URL del video se pasa a la vista de video mxml. Estoy usando flex 4.6 y una tableta Android (EEE transformer prime).Parpadeo con StageVideo en una tableta 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(); 
    } 
} 

}

Aquí está mi código de la opinión de que reproduce el vídeo cuando el vídeo se completa

<?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> 

argumentos del compilador

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

Agregado Actualización de código tener un oyente StageVideoEvent y simplifie d para una vista (también para conocer la renderMode será el director)

<?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> 

El único otro punto de vista en esta aplicación sólo tiene un botón con navigator.pushView (Copyofvideo, null, null); y cada vez que se hace clic en el botón, la pantalla parpadea y luego se reproduce el video.

+0

¿Pudo resolver la pantalla parpadeante y negra? – mik

Respuesta

0

Una posible razón del parpadeo es que no escuchas la disponibilidad de StageVideo antes de llamar al _ns.play(). Al escuchar StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, puede administrar ganar y perder el StageVideo.

En lugar de

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

    playVideo(); 
} 

hacer esto

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 discute cómo escuchar disponibilidad StageVideo en este tutorial:

Getting started with stage video

y este tutorial proporciona algunos más ejemplos de código:

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

+0

Parece que todavía parpadea. Agregué un Oyente de evento para stageVideoAvailability e intenté simplificarlo en una sola vista. El nuevo código se encuentra en la parte inferior de la publicación debajo de agregado. Solo debería poder copiar la vista y los argumentos del compilador y establecer el modo de renderización para dirigir y agregar un video y verlo. gracias por tu ayuda por cierto! – Justin

0

¿trató de cambiar el modo de procesado? Tuve problemas con Stage Video cuando estaba en modo directo. Cambiarlo a CPU parecía solucionar los problemas con StageVideo que tenía.

Cuestiones relacionadas