Created in Flash CS3 using Actionscript 3 to emulate a Youtube type player, extra controls not included here. A .mov file was first compressed into a .flv file using the Flash CS3 Video Encoder and placed in an assets folder of the video player project. The StreamingVideoPlayer AS3 class is imported into the Flash project's action frame and a video object is instantiated as a display object. The new video player object is then added to a movie clip on stage using addChild(). The parameters for the class instantiation is a server location, the .flv file location, the video duration, and the video deminsions desired. The video is placed on the stage with player controls from the StreamingVideoPlayer class.
The StreamingVideoPlayer class is contained in a package and extends the Sprite class. The netConnection uses it's onNetStatus to first make sure a connection is made to the server before proceeding to connect to the video stream. The video stream is then added to a Video object and added as a child to the parent. The video is then played, paused, and seeked to half way through where a Play Video button is added with an event handler to call a video play function. When the video is played, a removeChild() is used to remove the button. When the video is stopped, the function to reinitialize back to start with the button again is called, allowing the user to play again.
fla file: videoplayer.swf
import video.StreamingVideoPlayer;
var streamingVideo:StreamingVideoPlayer = new ~
StreamingVideoPlayer(null,"assets/skiing1.flv",15,160,120);
video_mc.addChild(streamingVideo);
as class file: StreamingVideoPlayer.as
package video {
import flash.events.*;
import flash.media.Video;
import flash.display.Sprite;
import flash.net.*;
import flash.text.TextField;
import fl.controls.Button;
public class StreamingVideoPlayer extends Sprite {
private var _videoURL:String;
private var _video:Video;
private var _vidDuration:Number;
private var _vidXmax:Number;
private var _vidYmax:Number;
private var _vidWidth:Number;
private var _vidHeight:Number;
private var _main_nc:NetConnection = new NetConnection();
private var _serverLoc:String;
private var _ns:NetStream;
private var _start_btn:Button;
/* ------------Contructors/Initialization-----------*/
public function StreamingVideoPlayer(serverLoc:String,
flvLocation:String,vidDuration:Number,vidXmax:Number,
vidYmax:Number):void {
//set video params
_videoURL = flvLocation;
_vidDuration = vidDuration;
_vidXmax = vidXmax;
_vidYmax = vidYmax;
//add eventListeners to NetConnection and connect
_main_nc.addEventListener(NetStatusEvent.NET_STATUS,
onNetStatus);
_main_nc.addEventListener(
SecurityErrorEvent.SECURITY_ERROR,
securityErrorHandler);
_main_nc.connect(serverLoc);
}
private function onNetStatus(event:Object):void {
//handles NetConnection and NetStream status events
switch (event.info.code) {
case "NetConnection.Connect.Success":
//play stream if connection successful
connectStream();
break;
case "NetStream.Play.StreamNotFound":
//error if stream file not found in
//location specified
trace("Stream not found: " + _videoURL);
break;
case "NetStream.Play.Stop":
//do if video is stopped
videoPlayComplete();
break;
}
//trace(event.info.code);
}
/* -------------------Connection------------------- */
private function connectStream():void {
//netstream object
_ns = new NetStream(_main_nc);
_ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,
asyncErrorHandler);
_ns.addEventListener(NetStatusEvent.NET_STATUS,
onNetStatus);
//other event handlers assigned
//to the netstream client property
var custom_obj:Object = new Object();
custom_obj.onMetaData = onMetaDataHandler;
custom_obj.onCuePoint = onCuePointHandler;
custom_obj.onPlayStatus = playStatus;
_ns.client = custom_obj;
//attach netstream to the video object
_video = new Video(_vidXmax,_vidYmax);
_video.attachNetStream(_ns);
//video position could be parameterized but hardcoded
//here to account for optional movie frame border
_video.x = 1;
_video.y = 1;
addChild(_video);
setVideoInit();
}
/* -------------NetStream actions and events-------------- */
private function videoPlayComplete():void {
setVideoInit();
}
private function setVideoInit():void {
_ns.play(_videoURL);
_ns.pause();
_ns.seek(_vidDuration/2);
addStartBtn();
}
private function playStatus(event:Object):void {
//handles onPlayStatus complete event if available
switch (event.info.code) {
case "NetStream.Play.Complete":
//do if video play completes
videoPlayComplete();
break;
}
//trace(event.info.code);
}
private function playFlv(event:MouseEvent):void {
_ns.play(_videoURL);
//_ns.seek(192); //used for testing
removeChild(_start_btn);
}
private function pauseFlv(event:MouseEvent):void {
_ns.pause();
}
/* ---------Buttons, labels, and other assets------------- */
//could be placed in it's own VideoControler class
private function addStartBtn():void {
_start_btn = new Button();
_start_btn.width = 80;
_start_btn.x = (_vidXmax-_start_btn.width)/2+_video.x;
_start_btn.y = (_vidYmax-_start_btn.height)/2+_video.y;
_start_btn.label = "Start Video";
_start_btn.addEventListener(MouseEvent.CLICK,playFlv);
addChild(_start_btn);
}
/* -----------------Information handlers---------------- */
private function onMetaDataHandler(metaInfoObj:Object):void {
_video.width = metaInfoObj.width;
_vidWidth = metaInfoObj.width;
_video.height = metaInfoObj.height;
_vidHeight = metaInfoObj.height;
//trace("metadata: duration=" + metaInfoObj.duration +
//"width=" + metaInfoObj.width + " height=" +
//metaInfoObj.height + " framerate=" +
//metaInfoObj.framerate);
}
private function onCuePointHandler(cueInfoObj:Object):void {
//trace("cuepoint: time=" + cueInfoObj.time + " name=" +
//cueInfoObj.name + " type=" + cueInfoObj.type);
}
/* -----------------------Error handlers------------------------ */
private function securityErrorHandler(event:SecurityErrorEvent):
void {
trace("securityErrorHandler: " + event);
}
private function asyncErrorHandler(event:AsyncErrorEvent):void {
trace(event.text);
}
}
}
|