如何无缝循环FLV

时间:2012-04-17 15:12:44

标签: actionscript-3 flash video loops flv

我正在以“标准方式”播放循环FLV:

    netstream.addEventListener(NetStatusEvent.NET_STATUS, onStatus);

...

    public function onStatus(item:Object):void {
        if (item.info.code == "NetStream.Play.Stop") {
            if (loop) netstream.seek(0);
        }

通过Flash CS 5.5创作工具(测试影片或调试影片)播放时,视频无缝循环播放。 但是!在浏览器或独立调试Flash播放器(均为v.11.2.202.233)播放时,视频“倒带”之前会有大约1秒的异常暂停。

这是最新Flash播放器的错误吗?

5 个答案:

答案 0 :(得分:10)

对于遇到相同问题的人,请尝试将上述代码更改为:

public function onStatus(item:Object):void {
    if (item.info.code == "NetStream.Buffer.Empty") {
        if (loop) netstream.seek(0);
    }

它将摆脱闪烁。如果您收听“NetStream.Play.Stop”,则会导致闪烁。

您不需要嵌入任何东西。这在IOS,Android和PC上运行得很好。

答案 1 :(得分:3)

这是Flash Player 11+和AIR 3+的已知错误。错误报告在这里,你应该upvote& :https://bugbase.adobe.com/index.cfm?event=bug&id=3349340

将创建无缝循环的已知变通方法:

1)将视频嵌入SWF中。不理想,在某些情况下不可能。

2)创建双NetSteam对象并在它们之间切换。当ns1(两个NetStreams对象中的第一个)到达它结束时触发事件的示例:

if (e.info.code == "NetStream.Play.Stop"){
 vid.attachNetStream(ns2);
 ns2.resume();
 activeNs = ns2;
 ns1.seek(0);
 ns1.pause();
}

在另一个事件侦听器上将ns1替换为ns2。无用的对象和处理程序重复,但你去了。

3)使用AIR 2.x / Flash Player 10.x(根本不是解决方案,Linux用户除外)

答案 2 :(得分:1)

我们在从Flash 10到Flash 11的过渡中注意到这一点.Flash 10无缝循环,但是当从NetStream.Play.Stop调用seek(0)时,Flash 11有一个〜1秒的停顿。

将媒体嵌入SWF不是我们的选择。

以下代码提供了一个更加无缝的循环 - 仍然不完美,但更好。

var mStream:NetStream;
var mDuration:Number;

...

addEventListener(Event.ENTER_FRAME, onEnterFrame);

...

function onEnterFrame(e:Event):void
{
    if( mStream.time > (mDuration-0.05) )
    { 
        if( mLooping )
        {
            mStream.seek(0);
        }
    }
}

function onMetaData(info:Object)
{
    mDuration = info.duration;
}

希望它有所帮助。

答案 3 :(得分:1)

我似乎已经使用FLVPlayback组件以及一些提示实现了这一点。

更重要的是,它可以在台式机,iPhone 4S和3GS上无缝运行! (通过AIR应用程序)

_videoFLV = new FLVPlayback();
_videoFLV.fullScreenTakeOver = false;
_videoFLV.autoPlay = false;
_videoFLV.autoRewind = true;
_videoFLV.isLive = false;
_videoFLV.skin = null;
_videoFLV.y = 150;
_videoFLV.bufferTime = .1;
_videoFLV.width = 320;
_videoFLV.height = 320;
_videoFLV.addEventListener(MetadataEvent.CUE_POINT, video_cp_listener, false, 0, true);
_videoFLV.source = "includes/10sec.flv"; 
addChild(_videoFLV);

使用侦听器功能......

function video_cp_listener(eventObject:MetadataEvent):void {
    if (eventObject.info.name == "endpoint") {
    _videoFLV.seek(0);
    _videoFLV.play();
    }
}

重要的是,我认为您必须设置宽度和高度以匹配您的flv文件。即无任何扩展。

flv在文件结尾之前添加了一个名为“endpoint”的提示点(假设你的开始和结束帧是相同的。)我使用Adobe Media Encoder添加了这个。

答案 4 :(得分:0)

无缝循环flv的唯一方法是嵌入swf内部。它会转换为MovieClip,然后您可以使用play(),stop(),nextFrame(),prevFrame()等处理它。

嵌入Flash创作工具(在舞台上拖动flv文件)时,请确保选择:

  • “在SWF中嵌入FLV ......”
  • 符号类型:“电影剪辑”
  • 全部选中:“将实例放置在舞台上”,“展开时间轴...”,“包含音频”