【问题标题】:how to detect clip end of progressive Flash video FLV?如何检测渐进式 Flash 视频 FLV 的剪辑结束?
【发布时间】:2011-04-10 14:53:48
【问题描述】:

我有一些 FLV 视频文件要由 Flash 视频播放器按顺序复制。假设 v1.flv 和 v2.flv。我希望播放器在 v1.flv 结束后开始播放 v2.flv。根据this forumonPlayStatus 在渐进式 FLV 中不会触发。可以做什么?我在下面尝试的一个 sn-p:

public class MyClass extends Sprite {
    private var nc : NetConnection;
    private var ns : NetStream;
    private var vid : Video;
    private var vidURL : String = "v1.flv";

    public function MyClass() {
        var nsClient:Object = {};
        nsClient.onPlayStatus = client_onPlayStatus;

        nc = new NetConnection();
        nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
        nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        nc.connect(null);

        ns = new NetStream(nc);
        ns.play(vidURL);
        ns.client = nsClient;

        vid = new Video();
        vid.attachNetStream(ns);

        addChild(vid);
    }

    private function netStatusHandler(event : NetStatusEvent) : void {
        trace(event.info.code);
        switch(event.info.code) {
            case "NetConnection.Connect.Success":
                trace("Loaded stream: " + vidURL);
                break;
            case "NetStream.Play.StreamNotFound":
                trace("Stream not found: " + vidURL);
                break;
            default:
        }
    }

    private function client_onPlayStatus(event:Object) : void {
        trace("status=" + event.info.code);
    }
}

跟踪输出中显示的唯一文本是:

NetConnection.Connect.Success
Loaded stream: /path/to/v1.flv

任何帮助将不胜感激!

【问题讨论】:

    标签: flash actionscript-3 video streaming flv


    【解决方案1】:

    您仍然可以通过一个额外的 netStatus 伪事件来做到这一点:当视频停止时,检查时间。

    switch(event.info.code) {
        (...)
        case "NetStream.Play.Stop":
            if (ns.time >= nsClient.nsInfo.duration - 0.1) trace ("video has finished");
            break;
    }
    

    注意事项:

    1. 您必须等待元数据信息(在示例中为“nsInfo”)才能获得持续时间:

      // On nsClient
      public function onMetaData(info:Object):void {
          nsInfo = info;
      }
      
    2. 它不是很精确,因此使用“-0.1”使时间比较更安全

    【讨论】:

    • 问题是NetStream.Play.Stop 事件也没有被触发...正如我在问题中提到的,唯一显示的输出是NetConnection.Connect.Success...我在那里显示的输出持续时间为v1.flv
    • 那个论坛帖子很旧 - 它可能已经改变。我这么说是因为我一直使用这个事件来检测我的渐进式加载的 FLV 的结束并且它工作得很好,唯一的问题是有时 .time 会稍微偏离一点。
    【解决方案2】:

    您还可以尝试 osmf 框架,这是 adobe 提供的简化 Flash 媒体交付的产品。 osmf 实现了开箱即用的顺序播放。 http://www.osmf.org/developers.html

    查看此博客以获取信息和示例代码 http://www.rblank.com/

    【讨论】:

      【解决方案3】:

      我结束了使用 charlie-boy 的 suggestion 的一部分来适应 MediaStream.as 以每 100 毫秒检查一次 NetStreamtime 属性是否相同(它最终卡住了......或者可能只是卡住了,但是我的具体情况不太可能)。

      我给MediaStream添加了三个属性:

      private var last_time:Number = -1;
      private var last_check:int  = 0;
      private const check_delay:int = 100;
      

      并像这样更改compareTime 函数:

          private function compareTime():void
          {
              if (isNaN(duration))
              {
                  // when there is no metadata duration
                  if (getTimer() - last_check > check_delay)
                  {
                      // enough time has passed since last check
                      if (last_time==this.time)
                      {
                          timer.stop();
                          timer.removeEventListener(TimerEvent.TIMER, onTimer);
                          dispatchEvent(new StreamEvent(StreamEvent.COMPLETE, null));
                      }
                      else
                      {
                          last_check = getTimer();
                          last_time = this.time;
                      }
                  }
              }
              else if(!isNaN(duration) && this.time >= duration)
              {
                  timer.removeEventListener(TimerEvent.TIMER, onTimer);
                  dispatchEvent(new StreamEvent(StreamEvent.COMPLETE, null));
              }
          }
      

      最坏的情况是加载下一个剪辑之前的 100 毫秒“卡住帧”。对我的特定需求来说还不错。

      感谢大家的意见。

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 2011-02-14
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多