gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:15:15 28 4
gpt4 key购买 nike

我在数据生成模式下使用 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 );
}
}

这将循环播放动画,但它开始疯狂地消耗内存。我试过使用 NetStream.seek(0) 和 NetStream.appendBytesAction( NetStreamAppendBytesAction.RESET_SEEK ),但我不确定下一步该做什么。如果您在那之后再次尝试调用 appendBytes,它不起作用,大概是因为我附加了具有 FLV header 和内容的完整字节数组?我不是很熟悉这一切是如何运作的。

非常感谢任何帮助。

最佳答案

[编辑]

最初我没有发现您的代码存在内存问题。但是,我使用的示例应用程序(如下)仅监听来自 NetStatusEventNetStream.Buffer.Empty 消息。它不监听 NetStream.Buffer.Flush 消息。我只是试过听这两个,就像你的例子一样,但应用程序出了问题 :)

下面的代码还显示了如何使用 seek(0) 通过 appendBytes() 重新开始播放。要使其正常工作,您需要等待来自 NetStatusEventNetStream.Seek.Notify,然后追加字节。

我也没有使用 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
}
}
}

关于actionscript-3 - 如何在数据生成模式下使用 NetStream 循环播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11891852/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com