I’ve seen this asked several times in as many different forums, so thought I’d try to help with a little class I made a few months ago.
/**
* Creates an automatically looping video.
* @author Devon O.
* @version 0.1
*/
package com.onebyonedesign.extras {
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.events.AsyncErrorEvent;
public class VideoLoop extends Video {
private var URL:String;
private var connection:NetConnection
private var stream:NetStream;
private var playedOnce:Boolean = false;
/**
*
* @param relative or absolute path to .flv file
*/
public function VideoLoop(videoPath:String):void {
URL = videoPath;
connection = new NetConnection();
connection.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
connection.connect(null);
}
public function play():void {
stream.resume();
}
public function pause():void {
stream.pause();
}
private function onStatus(nse:NetStatusEvent):void {
if (nse.info.code == "NetConnection.Connect.Success" && !playedOnce){
playedOnce = true;
initVideo();
}
if (nse.info.code == "NetStream.Play.Stop" && playedOnce) {
stream.seek(0);
}
}
private function asyncErrorHandler(event:AsyncErrorEvent):void {
dispatchEvent(event);
}
private function initVideo():void {
stream = new NetStream(connection);
stream.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
attachNetStream(stream);
stream.play(URL);
}
}
}
Basic usage is easy as pie. Just create a new instance of the VideoLoop class passing the path to your video as a parameter then add that instance to your display list.
Here’s a quick example:
package {
import com.onebyonedesign.extras.VideoLoop;
import flash.display.Sprite;
import flash.events.AsyncErrorEvent;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.AntiAliasType;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
public class Main extends Sprite {
private var isPlaying:Boolean = true;
private var videoLoop:VideoLoop;
public function Main():void {
videoLoop = new VideoLoop("water.flv");
videoLoop.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);
addChild(videoLoop);
stage.addEventListener(MouseEvent.CLICK, adjustVideo);
var info:TextField = new TextField();
info.selectable = false;
info.autoSize = TextFieldAutoSize.LEFT;
info.antiAliasType = AntiAliasType.ADVANCED;
var fmt:TextFormat = new TextFormat("_sans", 12, 0x939393);
fmt.align = TextFormatAlign.CENTER;
info.defaultTextFormat = fmt;
info.text = "Two second video looped.\nClick to pause/resume.";
info.x = 95;
info.y = 190;
addChild(info);
}
private function onAsyncError(aee:AsyncErrorEvent):void {
// handle annoying async errors (such as the missing metadata property) here.
}
private function adjustVideo(me:MouseEvent):void {
if (isPlaying) {
videoLoop.pause();
} else {
videoLoop.play();
}
isPlaying = !isPlaying;
}
}
}
Which produces the following:
[kml_flashembed movie=”../wp-content/uploads/2008/02/loop_vid.swf” height=”240″ width=”320″ fversion=”9″ /]