2012-03-14 27 views
1

私のアプリケーションでStageVideoを動作させようとしていますが、問題があります。私は一連のビデオを次々と再生する必要があります。最初のビデオは常に正常に再生されますが、他のビデオはオーディオのみが再生され、StageVideoは最初のビデオの最後のフレームを表示します。AS3 AIR iOS - StageVideoが正しく動作しない

StageVideoがフリーズしてビデオを再生しているように見えますが、私はそれを見ることはできません(聞くだけです)。

私はAdobe Air 3.2ベータ版でiPad2をテストしていますが、3.1と同じ結果でもテストしました。ここで

は、私のビデオクラスです:

package { 

    import flash.display.MovieClip; 
    import flash.text.TextField; 
    import flash.text.TextFormat; 
    import flash.events.Event; 
    import flash.media.StageVideo; 
    import flash.events.StageVideoEvent; 
    import flash.events.StageVideoAvailabilityEvent; 
    import flash.media.StageVideoAvailability; 
    import flash.net.NetStream; 
    import flash.net.NetConnection; 
    import flash.geom.Rectangle; 
    import flash.events.NetStatusEvent; 

    public class SVideo2 extends MovieClip { 

     public static const VIDEO_FINISHED:String = 'videoFinished'; 

     private var debugPanel:TextField; 
     private var addedToStage:Boolean = false; 

     private var videoFile:String; 

     private var hwaEnabled:Boolean = false; 

     private var video:StageVideo; 
     private var ns:NetStream; 
     private var nc:NetConnection; 

     public function SVideo2() { 
      addDebugPanel(); 

      addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     } 

     private function onAddedToStage(e:Event) :void{ 
      output('ADDED TO STAGE'); 
      addedToStage = true; 
      stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onAvail); 
      removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     } 

     public function playVideo(videoFile:String) :void{ 
      output('playVideo: '+videoFile); 
      if(addedToStage){ 
       this.videoFile = videoFile; 
       if(hwaEnabled){ 
        startPlaying(); 
       } 
       else{ 
        output('HWA NOT AVAILABLE'); 
       } 
      } 
      else{ 
       output('NOT ON STAGE'); 
      } 
     } 

     private function onAvail(e:StageVideoAvailabilityEvent) :void{ 
      output(e.availability); 
      if(e.availability == StageVideoAvailability.AVAILABLE){ 
       output('VIDEO AVAILABLE'); 
       hwaEnabled = true; 
      } 
     } 

     private function startPlaying() :void{ 
      output('STARTING TO PLAY'); 
      video = stage.stageVideos[0]; 
      video.addEventListener(StageVideoEvent.RENDER_STATE, onRender); 

      nc = new NetConnection(); 
      nc.connect(null); 
      ns = new NetStream(nc); 

      ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 

      ns.client = this; 

      video.attachNetStream(ns); 
      ns.play(videoFile); 
     } 

     private function onRender(e:StageVideoEvent) :void{ 
      output('onRender'); 
      video.viewPort = new Rectangle(192, 50, 640, 480); 
     } 

     private function onNetStatus(e:NetStatusEvent) :void{ 
      output(e.info.code); 
      if(e.info.code == 'Netstream.Play.Stop'){ 
       output('VIDEO STOPPED'); 
       dispatchEvent(new Event(VIDEO_FINISHED)); 
      } 
     } 

     private function addDebugPanel() :void{ 
      var tFormat:TextFormat = new TextFormat('Arial', 14, 0x000000, true); 
      var tField:TextField = new TextField(); 

      tField.setTextFormat(tFormat); 
      tField.multiline = true; 
      tField.border = true; 
      tField.borderColor = 0x000000; 
      tField.background = true; 
      tField.backgroundColor = 0xFFFFFF; 

      tField.x = 0; 
      tField.y = 568; 
      tField.width = 1024; 
      tField.height = 200; 

      this.debugPanel = tField; 
      addChild(debugPanel); 
     } 

     private function output(what:String) :void{ 
      debugPanel.appendText("\n"+what); 
     } 

     public function onXMPData(info:Object) :void{} 
     public function onMetaData(info:Object) :void{} 
     public function onCuePoint(info:Object) :void{} 
     public function onPlayStatus(info:Object) :void{} 

    } 

} 

そして、ここでは、私は、フレームに使用しているコードです:

import flash.display.Sprite; 
import flash.events.MouseEvent; 

var vid:SVideo2 = new SVideo2(); 
addChild(vid); 

var btn:Sprite = new Sprite(); 
btn.graphics.beginFill(0x333333); 
btn.graphics.drawRect(0, 0, 100, 40); 
btn.x = 462; 
btn.y = 518; 
btn.width = 100; 
btn.height = 40; 

addChild(btn); 

btn.addEventListener(MouseEvent.CLICK, onClick); 

function onClick(e:MouseEvent) :void{ 
    var rand:String = String(Math.floor(Math.random() * 37)); 
    vid.playVideo('mp4/result_'+rand+'.mp4'); 
} 

答えて

4

このバグと戦ってコードを完全に書き直した後、理由はStageVideoに添付されたnetStreamリファレンスをクリアしなかったためです。 StageVideo.attachNetStream(null);

新しいビデオが再生される前/後にこれをクリアする必要があります。

attachNetStream()をもう一度呼び出す前に、現在接続されているNetStreamオブジェクトのclose()メソッド を呼び出します。 close()を呼び出すと、ビデオを で再生することに関連する、ハードウェアデコーダを含むすべてのリソース が解放されます。次に、別の NetStreamオブジェクトまたはnullを指定してattachNetStream()を呼び出すことができます。

0

あなたはbackgroundAlpha = 0を設定していますか? - > s:Application backgroundAlpha = 0