2012-05-11 119 views
7

我有一个stageVideo类,我使用它在平板电脑上播放视频,但每次播放视频时,平板电脑屏幕会闪烁几次(变黑,然后出现约四次左右),我在想什么造成这种情况。它在切换到视频播放视图时执行此操作。视频的网址传递到视频mxml视图。我正在使用flex 4.6和Android平板电脑(EEE变压器素数)。Android平板电脑上的StageVideo闪烁?

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> 

编译参数

-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

闪烁的一个可能的原因是您在拨打_ns.play()之前不要听取StageVideo的可用性。通过收听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(); 
    } 

Adob​​e开发者讨论了如何在本教程监听的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

你有没有尝试改变渲染模式?当处于直接模式时,我遇到了舞台视频的问题。改变它到CPU似乎解决了我有StageVideo的问题。