如何在数据生成模式下使用NetStream循环播放视频

Wes*_*son 2 apache-flex flash actionscript-3 netstream

我在数据生成模式下使用NetStream来使用appendBytes播放嵌入式FLV.当流完成播放时,我想循环FLV文件.我不知道如何实现这一目标.这是我到目前为止(这不是一个完整的例子):

        public function createBorderAnimation():void
        {
            // Load the skin image
            borderAnimation = Assets.BorderAnimation;

            // Convert the animation to a byte array
            borderAnimationBytes = new borderAnimation();

            // Initialize the net connection
            border_nc = new NetConnection();
            border_nc.connect( null );

            // Initialize the net stream
            border_ns = new NetStream( border_nc );
            border_ns.client = { onMetaData:function( obj:Object ):void{ trace(obj); } }
            border_ns.addEventListener( NetStatusEvent.NET_STATUS, border_netStatusHandler );
            border_ns.play( null );
            border_ns.appendBytes( borderAnimationBytes );

            // Initialize the animation
            border_vd = new Video( 1024, 768 );
            border_vd.attachNetStream( border_ns );

            // Add the animation to the stage
            ui = new UIComponent();
            ui.addChild( DisplayObject( border_vd ) );
            grpBackground.addElement( ui );             
        }

        protected function border_netStatusHandler( event:NetStatusEvent ):void
        {
            if( event.info.code == "NetStream.Buffer.Flush" || event.info.code == "NetStream.Buffer.Empty" )
            {
                border_ns.appendBytesAction( NetStreamAppendBytesAction.RESET_BEGIN );
                border_ns.appendBytes( borderAnimationBytes );
                border_ns.appendBytesAction( NetStreamAppendBytesAction.END_SEQUENCE );
            }
        }
Run Code Online (Sandbox Code Playgroud)

这将循环动画,但它开始像疯了一样咀嚼内存.我尝试过使用NetStream.seek(0)和NetStream.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK),但后来我不确定下一步该做什么.如果你之后再尝试再次调用appendBytes,它就不起作用,大概是因为我附加了具有FLV头和东西的完整字节数组?我不太熟悉这一切是如何运作的.

任何帮助是极大的赞赏.

Sun*_* D. 5

[编辑]

最初我没有看到您的代码存在内存问题.但是,我使用的示例应用程序(下面)仅侦听NetStream.Buffer.Empty来自的消息NetStatusEvent.它不会收听NetStream.Buffer.Flush消息.我只是试着听两个,就像在你的例子中,应用程序变得混乱:)

下面的代码还显示了如何使用seek(0)重启播放appendBytes().为了使这项工作,你需要等待NetStream.Seek.NotifyNetStatusEvent,然后附加的字节数.

我也没有使用seek(0)(注释掉的行)重新启动播放,内存使用情况很好.

我正在使用Mac OS X并使用top命令和活动监视器测量内存.Activity Monitor的虚拟内存统计数据大幅波动,但没有像内存泄漏那样.

package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.NetStatusEvent;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.NetStreamAppendBytesAction;
    import flash.utils.ByteArray;

    public class LoopEmbedFLV extends Sprite
    {

        [Embed(source="woot.flv",mimeType="application/octet-stream")]
        private var flv:Class;

        private var bytes:ByteArray;
        private var nc:NetConnection;
        private var ns:NetStream;
        private var video:Video;

        public function LoopEmbedFLV()
        {
            super();
            stage.scaleMode=StageScaleMode.NO_SCALE;
            stage.align=StageAlign.TOP_LEFT;
            bytes = new flv();
            nc=new NetConnection();
            nc.connect(null);
            ns=new NetStream(nc);
            video=new Video();
            addChild(video);
            video.attachNetStream(ns);
            ns.client = { onMetaData: function():void { } };
            ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
            ns.play(null);
            ns.appendBytes(bytes);
        }

        private function onNetStatus(event:NetStatusEvent):void
        {
            var code:String=event.info.code;
            trace(code);
            switch(code)
            {
                case "NetStream.Buffer.Empty":
                    ns.seek(0);
//                  seekToBeginning();
                    break;
                case "NetStream.Seek.Notify":
                    var seekPoint:Number = event.info.seekPoint;
                    trace("seeking to: ", seekPoint);
                    seekPoint == 0 ? seekToBeginning() : seekToOffset(seekPoint);
                    break;
            }
        }

        private function seekToBeginning():void
        {
            ns.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);
            ns.appendBytes(bytes);
            ns.appendBytesAction(NetStreamAppendBytesAction.END_SEQUENCE);
        }
        private function seekToOffset(seekPoint:Number):void
        {
            ns.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK);
            // todo
        }
    }
}
Run Code Online (Sandbox Code Playgroud)