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头和东西的完整字节数组?我不太熟悉这一切是如何运作的.
任何帮助是极大的赞赏.
[编辑]
最初我没有看到您的代码存在内存问题.但是,我使用的示例应用程序(下面)仅侦听NetStream.Buffer.Empty来自的消息NetStatusEvent.它不会收听NetStream.Buffer.Flush消息.我只是试着听两个,就像在你的例子中,应用程序变得混乱:)
下面的代码还显示了如何使用seek(0)重启播放appendBytes().为了使这项工作,你需要等待NetStream.Seek.Notify从NetStatusEvent,然后附加的字节数.
我也没有使用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)
| 归档时间: |
|
| 查看次数: |
8879 次 |
| 最近记录: |