2015-12-03 110 views
0

我将视频导入舞台(将其命名为flvControl),将autoPlay设置为true,然后我尝试执行以下代码,但该代码不起作用。如何在Adobe Flash中无缝地循环播放视频?

function completeHandler(event:fl.video.VideoEvent):void 
{ 
    flvControl.play(); 
} 

flvControl.addEventListener(fl.video.VideoEvent.COMPLETE, completeHandler); 

当您在Flash中进行测试的电影,它有半秒的白色屏幕闪烁在重放之间,但是当你在浏览器中测试(我的是Chrome浏览器)不仅存在之间的闪烁,在随后的playthroughs视频似乎冻结约1-2秒,然后开始播放约1-2秒钟的视频。这基本上使循环完全无法玩。

有谁知道如何使视频无缝循环在Flash? (并且在浏览器中看起来无缝?)

+0

您可以尝试使用seek而不是play(因为play可能会尝试重新加载文件)'flvControl.seek(0)'尽管可能会在事件分派时发生延迟。通常,当我这样做时,我直接使用网络流 - flvplayback组件将它全部抽象出来。你需要使用FLVPlayback组件吗? – BadFeelingAboutThis

+0

seek(0)does not help,我以前试过。我擅长使用任何可以在浏览器中始终如一地执行操作的技术。 (甚至HTML5)。你如何与Netstream做到这一点?我在互联网上发现了很多代码示例,但当我尝试它们时,它们都有闪烁问题 – Tanuki

+0

我相信HTML5视频节点具有循环属性。无论如何,你不应该在浏览器中使用Flash,除非它是受控制的环境。 – BadFeelingAboutThis

回答

1

我发现无缝循环视频的唯一方法是将整个剪辑加载到内存ByteArray中,然后使用连接到Video实例的NetStream的appendBytes函数。

这是一个非常基本的辅助类

package 
{ 
    import flash.events.AsyncErrorEvent; 
    import flash.events.NetStatusEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.events.TimerEvent; 
    import flash.media.Video; 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    import flash.net.NetStreamAppendBytesAction; 
    import flash.utils.ByteArray; 
    import flash.utils.Timer; 
    import flash.utils.setTimeout; 


    /** 
    * @author Michael Archbold (ma@distriqt.com) 
    */ 
    public class AppendByteVideoLoop 
    { 
     public function AppendByteVideoLoop(video:Video, data:ByteArray):void 
     { 
      _video = video; 
      connect(data); 
     } 

     private var _video:Video; 
     private var _connection:NetConnection; 
     private var _stream:NetStream; 
     private var _byteArray:ByteArray; 
     private var _timer:Timer; 

     private var _paused : Boolean = false; 
     public function get paused():Boolean { return _paused; } 


     public function play():void 
     { 
      if (_stream) 
       _stream.resume(); 
     } 


     public function pause():void 
     { 
      if (_stream) 
       _stream.pause(); 
     } 


     public function togglePause():void 
     { 
      if (_stream) 
       _stream.togglePause(); 
     } 


     private function connect(byteArray:ByteArray):void 
     { 
      _byteArray = byteArray; 

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


     private function addToStream():void 
     { 
      _stream.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN); 
      _stream.appendBytes(_byteArray); 
     } 


     public function onMetaData(metaData:Object):void 
     { 
//   _video.width = metaData.width; 
//   _video.height = metaData.height; 
     } 


     public function onXMPData(xmp:Object):void 
     { 
     } 


     public function onPlayStatus(status:Object):void 
     { 
     } 


     private function connectStream():void 
     { 
      _stream = new NetStream(_connection); 
      _stream.client = this; 
      _stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
      _stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      _video.attachNetStream(_stream); 
      _stream.play(null); 
      _stream.appendBytes(_byteArray); 
      _stream.pause(); 
     } 


     private function netStatusHandler(event:NetStatusEvent):void 
     { 
      trace(event.info.code); 
      switch (event.info.code) 
      { 
       case "NetConnection.Connect.Success": 
        connectStream(); 
        break; 

       case "NetStream.Play.StreamNotFound": 
        trace("Unable to locate video "); 
        break; 

       case "NetStream.Pause.Notify": 
        _paused = true; 
        break; 

       case "NetStream.Unpause.Notify": 
        _paused = false; 
        break; 

       case "NetStream.Buffer.Empty": 
        addToStream(); 
        break; 

       case "NetStream.Buffer.Full": 
        break; 

      } 
     } 


     private function securityErrorHandler(event:SecurityErrorEvent):void 
     { 
      trace("securityErrorHandler: " + event.text); 
     } 


     private function asyncErrorHandler(event:AsyncErrorEvent):void 
     { 
      trace("asyncErrorHandler: " + event.error.message); 
     } 

    } 
} 

,然后用它是这样的:

var video:Video = new Video(); 
video.smoothing = false; 
if (stage) 
{ 
    video.width = stage.stageWidth; 
    video.height = stage.stageHeight; 
} 
addChild(video); 

loader = new URLLoader(); 
loader.dataFormat = URLLoaderDataFormat.BINARY; 
loader.addEventListener(Event.COMPLETE, loader_completeHandler, false, 0, true); 
loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioErrorHandler, false, 0, true); 
loader.load(new URLRequest("URL_OF_VIDEO")); 


... 


function loader_completeHandler(event:Event):void 
{ 
    var data:ByteArray = ByteArray(loader.data); 

    var player:AppendByteVideoLoop = new AppendByteVideoLoop(_video, _data); 
    player.play(); 
} 

希望有所帮助。

+0

嗨,非常感谢您的回答,这是迄今为止我在这个主题上看到的最接近的解决方案。这确实重复了广告中没有中断的视频。不幸的是,视频播放速度比原来慢一些。如果连续播放10次视频,整体播放时间可能会明显减慢(我没有测量过,但看起来比原来慢10-20%)。我的系统非常强大,所以我怀疑这与实现本身有关,可以调整,因为所有事情都应该在我的机器上运行。 – Tanuki

+0

我还没有检查过这段代码,对不起,它来自几年前的一个项目,并在一个非常特殊的环境中使用。只需检查一次只创建一次AppendByteVideoLoop,然后只调用一次NetConnection.Connect.Success。 它将受益于一些清理代码来管理内存使用情况。 – Michael