我发现无缝循环视频的唯一方法是将整个剪辑加载到内存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();
}
希望有所帮助。
您可以尝试使用seek而不是play(因为play可能会尝试重新加载文件)'flvControl.seek(0)'尽管可能会在事件分派时发生延迟。通常,当我这样做时,我直接使用网络流 - flvplayback组件将它全部抽象出来。你需要使用FLVPlayback组件吗? – BadFeelingAboutThis
seek(0)does not help,我以前试过。我擅长使用任何可以在浏览器中始终如一地执行操作的技术。 (甚至HTML5)。你如何与Netstream做到这一点?我在互联网上发现了很多代码示例,但当我尝试它们时,它们都有闪烁问题 – Tanuki
我相信HTML5视频节点具有循环属性。无论如何,你不应该在浏览器中使用Flash,除非它是受控制的环境。 – BadFeelingAboutThis