2012-11-10 24 views
2

我有標準的NetStream用於AS3視頻連接:ActionScript 3的調用onMetaData視頻持續時間 - 不能存儲值

的代碼:

public class VideoInit extends MovieClip 
{ 
    import flash.media.Video; 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    import flash.events.NetStatusEvent; 


    public var video:Video; 
    public var nc:NetConnection; 
    public var ns:NetStream; 
    public var meta:Object; 
    public var _duration; // <----- the variable 



    public function VideoInit() 
    { 
     video = new Video(480,270); 
     addChild(video); 
     nc = new NetConnection(); 
     nc.connect(null); 
     ns = new NetStream(nc); 

     meta = new Object(); 

     ns.client = meta; 
     video.attachNetStream(ns); 
     ns.play("video.f4v"); 


     meta = new Object(); 

     meta.onMetaData = function(meta:Object) // <---- the method 
     { 
      _duration = meta.duration 

     } 
     ns.client = meta; 
    } 

現在,everyime該調用onMetaData方法執行,可變_duration存儲該值,但在調試器步驟離開該方法後,_duration值將被重新設置爲unindentified。 我試圖用數組來做一個解決方法,通過推送值,但同樣的事情發生,數組重置。有什麼可能是錯的?

編輯:

,一旦調用onMetaData完成存儲時間值自動銷燬的對象。我實施它並不重要。

+0

嘗試使用二傳手的,只有改變它,如果它是一個有效的數字的持續時間。問題我認爲onMetaData被調用,但元對象是無效的。 – danjp

回答

3

您發佈的代碼無法編譯,即使它發生了,也可能導致其他問題。

建議:溝meta對象,而不是設置ns.client = this;

這工作:

package 
{ 
    import flash.events.Event; 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 
    import flash.media.Video; 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    import flash.events.NetStatusEvent; 

    public class VideoInit extends Sprite 
    { 
     private var video:Video; 
     private var nc:NetConnection; 
     private var ns:NetStream; 
     private var _duration:Number; // <----- the variable 

     public function VideoInit() 
     { 
      addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     } 

     private function onAddedToStage(e:Event):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
      video = new Video(480,270); 
      addChild(video); 
      nc = new NetConnection(); 
      nc.connect(null); 

      ns = new NetStream(nc); 
      ns.client = this;// meta; 

      video.attachNetStream(ns); 
      ns.play("video.f4v"); 
      stage.addEventListener(MouseEvent.MOUSE_DOWN, testTheValueOfDuration); 
     } 

     public function onMetaData(e:Object):void 
     { 
      _duration = e.duration 
      trace('_duration:', _duration); 

      testTheValueOfDuration(); 
     } 

     private function testTheValueOfDuration(e:MouseEvent = null):void 
     { 
      trace('Seriously, what is the value of _duration?', _duration); 
     } 
    } 
} 
+0

這有效,但如果您想從除了onMetaData函數以外的任何地方訪問testTheValueOfDuration(),則不會。 _duration變量也是如此。 –

+0

我只投擲了testTheValueOfDuration()來顯示代碼解決了您所描述的問題:_duration的值不再等於onMetaData()方法外部的'undefined'。相反,在onMetaData()中設置的_duration的值將會持續存在,並且可以被類中的其他方法訪問,直到VideoInit的實例被銷燬,或者由於某種原因,您將爲其分配不同的值。如果你想讓_duration在班級之外訪問,你只需要創建一個公共getter。 –

+0

嗯,是的。理論上它應該是這樣的。但事實並非如此。 onMetaData對setter進行兩次調用,但一旦函數完成,var _duration就會再次爲空。 –