AS3 NetStream未指示视频结束

时间:2014-08-14 17:40:36

标签: actionscript-3 video

我正在嵌入一个FLV文件,并通过NetStream.appendBytes()函数播放它。视频播放效果很好,但我无法弄清楚视频播放完毕的时间。

根据this page,我应该收到包含NetStream.Play.StartNetStream.Buffer.EmptyNetStream.Buffer.FullNetStream.Buffer.Flush和&等状态的活动。 NetStream.Play.Stop打印出我statusHandler以下的功能。

根据我对this page的理解,我应该从NetStream.Play.Complete附带的匿名函数中打印ns.client.onPlayStatus

我的输出完全由以下内容组成:

[trace] NetStatus: NetStream.Buffer.Full
[trace] NetStatus: NetStream.Buffer.Empty

我的视频开始播放时出现Full,完成时出现Empty

我希望NetStream.Play.StopNetStream.Play.Complete被解雇。这是我的代码,我做错了什么?

package {

import flash.display.Sprite;
import flash.events.NetStatusEvent;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.utils.ByteArray;

public class Movie extends Sprite {

    [Embed(source="video.flv", mimeType="application/octet-stream")]
    private static const testFLV:Class;

    public function Movie():void {
        var video:Video = new Video(400, 300);
        addChildAt(video, 0);

        var nc:NetConnection = new NetConnection();
        nc.connect(null);

        var ns:NetStream = new NetStream(nc);

        var myClient:Object = new Object();
        ns.client = myClient;

        ns.client.onPlayStatus = function(info:Object):void {
            trace("onPlayStatus: " + info.code);
        };

        ns.client.onStatus = function(info:Object):void {
            trace("onStatus: " + info.code);
        };

        video.attachNetStream(ns);

        var vidBytes:ByteArray = new testFLV();
        ns.play(null);
        ns.appendBytes(vidBytes);

        ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);

    }

    private function statusHandler(event:NetStatusEvent):void {
        trace("NetStatus: " + event.info.code);
    }

}
}

2 个答案:

答案 0 :(得分:0)

创建一个名为Client的内部类..像这样...

 internal class Client
{
   public function onPlayStatus(info:Object):void
   {
    trace(info.code) // you should be able to catch the ( NetStream.Play.Complete)
   }

   public function onMetaData(info:Object):void
   {

   }
}

然后像这样分配netstream对象的客户端属性......

    ns.client = new Client;

希望有效。原则上它应该。 NetStream类是一个密封的类,因此无法在运行时向其添加属性或方法...如果需要,则将其子类化并在该类中定义实例级方法/属性。

答案 1 :(得分:0)

根据我的理解,嵌入FLV文件并使用NetStream.appendBytes与所谓的" HTTP流式传输"。

相同。

我从页面Monitoring NetStream Activity获得了这一点,其中说:

  1. 通过这种方式,NetStream不了解播放的许多事件,例如NetStream.Play.Start或NetStream.Play.Complete。
  2. 玩家应该合成,发送我学习的事件。
  3. 我还在其他论坛上学习,有人会使用NetStream.Buffer.Empty作为完整的事件。但我认为这也意味着缓冲的隐含暂停,可能是低带宽。我没有找到一个很好的区分方法。

    希望这会有所帮助。如果有任何更新,那将很高兴。