ActionScript 3 onMetaData 视频持续时间 - 无法存储值

Posted

技术标签:

【中文标题】ActionScript 3 onMetaData 视频持续时间 - 无法存储值【英文标题】:ActionScript 3 onMetaData video duration - can't store value 【发布时间】:2012-10-30 19:42:00 【问题描述】:

我在 AS3 中有用于视频连接的标准 NetStream:

代码:

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;
     

现在,每次执行 onMetaData 方法时,变量 _duration 都会存储该值,但在调试器步骤离开该方法之后,_duration 值会重新设置为未识别。 我试图通过推送值来解决 Array 的问题,但同样的事情发生了,Array 重置。有什么问题吗?

编辑:

任何存储持续时间值的对象都会在 onMetaData 完成后立即销毁。我如何实现它并不重要。

【问题讨论】:

尝试在持续时间内使用 Setter,只有当它是有效数字时才会更改它。我认为的问题是 onMetaData 被调用但元对象无效。 【参考方案1】:

您发布的代码无法编译,即使编译,也可能导致其他问题。

建议:放弃 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);
         
    

【讨论】:

有效,但如果您想从除 onMetaData 函数之外的任何地方访问 testTheValueOfDuration() 则无效。 _duration 变量也是如此。 我只投入了 testTheValueOfDuration() 以表明代码解决了您描述的问题:_duration 的值在 onMetaData() 方法之外不再等于“未定义”。相反,在 onMetaData() 中设置的 _duration 值将持续存在,并且可以被类中的其他方法访问,直到 VideoInit 的实例被销毁,或者由于某种原因,您要为其分配不同的值。如果你想让 _duration 在类之外访问,你只需要创建一个公共 getter。 嗯,是的。理论上应该是这样的。但事实并非如此。 onMetaData 对 setter 进行了两次调用,但一旦函数完成,var _duration 就会再次为空。 我对两天前发布的代码进行了三处小改动:_duration 现在输入为 Number。不应该是必要的,但没有理由不这样做。其次,我添加了一个调用 testTheValueOfDuation() 的舞台鼠标按下事件监听器。第三,我修改了 testThatValueOfDuration 的方法签名以包含一个可选的 MouseEvent。每次单击舞台时,我都会看到一条跟踪消息,显示视频的正确持续时间。试试看,如果你看到同样的东西,请告诉我。 是的,在这种情况下,我确实得到了正确的值。但我不能依赖点击来获取价值。

以上是关于ActionScript 3 onMetaData 视频持续时间 - 无法存储值的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 使用ActionScript 3暂停框架

ActionScript 3 ActionScript 3延迟功能

ActionScript 3 ActionScript 3 SliceBitmap类

ActionScript 3 ActionScript 3中的XML循环

ActionScript 3 clickTag使用ActionScript 3

ActionScript 3 ActionScript 3中的反射