One By One Design

Looping Progressively Downloaded .flv Files

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″ /]

Posted by