【问题标题】:AS3 NetStream not indicating end of videoAS3 NetStream 不指示视频结束
【发布时间】:2014-08-14 17:40:35
【问题描述】:

我正在嵌入一个 FLV 文件,并通过 NetStream.appendBytes() 函数播放它。视频播放正常,但我无法确定视频何时播放完毕。

根据this page,我应该从下面的statusHandler 函数中打印出状态为NetStream.Play.Start、NetStream.Buffer.Empty、NetStream.Buffer.Full、NetStream.Buffer.Flush 和NetStream.Play.Stop 的事件。

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

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

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

Full 出现在我的视频开始播放时,Empty 出现在我的视频播放结束时。

我想解雇 NetStream.Play.Stop 或 NetStream.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);
    }

}
}

【问题讨论】:

  • 为什么是-1?我已经解释了我在做什么,我期望的输出与我得到的输出,并且我提供了一个 SSCCE。我应该如何以不同的方式提出这个问题?

标签: actionscript-3 video


【解决方案1】:

创建一个名为 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对象的client属性...

    ns.client = new Client;

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

【讨论】:

  • 感谢 B 的回复。不幸的是,我没有打印出任何额外的内容。
【解决方案2】:

据我了解,嵌入 FLV 文件并使用 NetStream.appendBytes 与所谓的“HTTP 流式传输”的方式相同。

我是从Monitoring NetStream Activity 页面得到的,上面写着:

  1. 这样,NetStream 不知道播放的许多事件,例如 NetStream.Play.Start 或 NetStream.Play.Complete 。
  2. 播放器应该合成、调度我学习的事件。

我还从其他论坛了解到有人将使用 NetStream.Buffer.Empty 作为完整事件。但我认为这也意味着缓冲的隐式暂停,可能是低带宽。我没有找到好的区分方法。

希望这会有所帮助。如果有更新,我会很高兴。

【讨论】:

  • 我最终只使用了NetStream.Buffer.Empty 事件来识别视频的结尾。对此感觉不太好,但我想不出任何其他选择。
猜你喜欢
  • 2012-12-31
  • 2011-06-28
  • 1970-01-01
  • 2012-08-13
  • 2022-12-02
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多