Hi There,
I have an annoying problem with a video player I am creating, here is the code:
package bc.utils {
import flash.system.System;
import flash.display.MovieClip;
import flash.net.*;
import flash.events.*;
import flash.geom.Rectangle;
import flash.media.*;
import bc.utils.*;
public class LoadVideo extends MovieClip {
// import global variables
var gvc:GlobalVarContainer = new GlobalVarContainer;
var videoMovie:MovieClip;
var videoPath:String;
var videoX:Number;
var videoY:Number;
var videoWidth:Number;
var videoAutoPlay:Boolean;
var ncConnection:NetConnection;
var nsStream:NetStream;
var videoLength:Number;
// time to buffer for the video in sec.
const BUFFER_TIME:Number = 8;
// start volume when initializing player
const DEFAULT_VOLUME:Number = 0.5;
// update delay in milliseconds.
const DISPLAY_TIMER_UPDATE_DELAY:int = 10;
// smoothing for video. may slow down old computers
const SMOOTHING:Boolean = true;
// flag for knowing if flv has been loaded
var bolLoaded:Boolean = false;
// flag for volume scrubbing
var bolVolumeScrub:Boolean = false;
// flag for progress scrubbing
var bolProgressScrub:Boolean = false;
// holds the last used volume, but never 0
var intLastVolume:Number = DEFAULT_VOLUME;
var sndTransform;
var colourChange:ColourChange = new ColourChange();
var dropShadow:DropShadow = new DropShadow();
public function LoadVideo(vidMovie, vidPath, vidX, vidY, vidWidth, vidAutoPlay):void{
videoMovie = vidMovie;
videoPath = vidPath;
videoX = vidX;
videoY = vidY;
videoWidth = vidWidth;
videoAutoPlay = vidAutoPlay;
videoMovie.x = videoX;
videoMovie.y = videoY;
videoMovie.width = videoWidth;
videoMovie.scaleY = videoMovie.scaleX;
videoMovie.visible = true;
videoMovie.videoBG_mc.visible = false;
dropShadow.dropShadow(videoMovie.videoBG_mc, 0.5, 45, 5, 5, gvc.colour2, 10);
addChild(dropShadow);
initVideoPlayer();
}
// sets up the player
function initVideoPlayer():void {
// hide buttons
videoMovie.mcVideoControls.btnUnmute.visible = false;
videoMovie.mcVideoControls.btnPause.visible = false;
videoMovie.pauseBig_btn.visible = false;
videoMovie.playBig_btn.visible = true;
videoMovie.vidDisplay.visible = false;
videoMovie.mcVideoControls.y = 272;
videoMovie.playBig_btn.alpha = 1;
videoMovie.pauseBig_btn.alpha = 0;
// add global event listener when mouse is released
videoMovie.parent.addEventListener( MouseEvent.MOUSE_UP, mouseReleased);
// add event listeners to all buttons
videoMovie.mcVideoControls.btnPause.addEventListener(MouseEvent.CLICK, pauseClicked);
videoMovie.pauseBig_btn.addEventListener(MouseEvent.CLICK, pauseClicked);
videoMovie.mcVideoControls.btnPlay.addEventListener(MouseEvent.CLICK, playClicked);
videoMovie.playBig_btn.addEventListener(MouseEvent.CLICK, playClicked);
videoMovie.mcVideoControls.btnStop.addEventListener(MouseEvent.CLICK, stopClicked);
videoMovie.mcVideoControls.btnMute.addEventListener(MouseEvent.CLICK, muteClicked);
videoMovie.mcVideoControls.btnUnmute.addEventListener(MouseEvent.CLICK, unmuteClicked);
videoMovie.mcVideoControls.mcVolumeScrubber.btnVolumeScrubber.addEventListener(MouseEvent.MOUSE_DOWN, volumeScrubberClicked);
videoMovie.mcVideoControls.mcPlayPosScrubber.btnVolumeScrubber.addEventListener(MouseEvent.MOUSE_DOWN, progressScrubberClicked);
// create a new net connection, add event listener and connect
// to null because we don't have a media server
ncConnection = new NetConnection();
ncConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
ncConnection.connect(null);
// create a new netstream with the net connection, add event
// listener, set client to this for handling meta data and
// set the buffer time to the value from the constant
nsStream = new NetStream(ncConnection);
nsStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
//nsStream.client = this;
nsStream.bufferTime = BUFFER_TIME;
var netClient:Object = new Object();
netClient.onMetaData = function(meta:Object){
videoLength = meta.duration;
trace(videoLength);
// event listener
videoMovie.videoBG_mc.addEventListener(Event.ENTER_FRAME, updateDisplay);
};
nsStream.client = netClient;
videoMovie.mcVideoControls.playPosBar_mc.width = 0;
videoMovie.mcVideoControls.mcPlayPosScrubber.x = videoMovie.mcVideoControls.playPosTrack_mc.x;
// attach net stream to video object on the stage
videoMovie.vidDisplay.attachNetStream(nsStream);
// set the smoothing value from the constant
videoMovie.vidDisplay.smoothing = SMOOTHING;
// set default volume
videoMovie.mcVideoControls.mcVolumeScrubber.x = (videoMovie.mcVideoControls.volumeTrack_mc.width * DEFAULT_VOLUME) + videoMovie.mcVideoControls.volumeTrack_mc.x;
videoMovie.mcVideoControls.volume_mc.width = videoMovie.mcVideoControls.mcVolumeScrubber.x - videoMovie.mcVideoControls.volumeTrack_mc.x;
setVolume(DEFAULT_VOLUME);
}
function playClicked(e:MouseEvent):void {
// check's, if the flv has already begun
// to download. if so, resume playback, else
// load the file
if(!bolLoaded) {
nsStream.play(videoPath);
bolLoaded = true;
}
else{
nsStream.resume();
}
// show video display
videoMovie.vidDisplay.visible = true;
videoMovie.videoBG_mc.visible = true;
// switch play/pause visibility
videoMovie.mcVideoControls.btnPause.visible = true;
videoMovie.mcVideoControls.btnPlay.visible = false;
videoMovie.pauseBig_btn.visible = true;
videoMovie.playBig_btn.visible = false;
videoMovie.pauseBig_btn.alpha = 1;
}
function pauseClicked(e:MouseEvent):void {
// pause video
nsStream.pause();
// switch play/pause visibility
videoMovie.mcVideoControls.btnPause.visible = false;
videoMovie.mcVideoControls.btnPlay.visible = true;
videoMovie.pauseBig_btn.visible = false;
videoMovie.playBig_btn.visible = true;
}
function stopClicked(e:MouseEvent):void {
// calls stop function
stopVideoPlayer();
}
function muteClicked(e:MouseEvent):void {
// set volume to 0
setVolume(0);
// update scrubber and fill position/width
videoMovie.mcVideoControls.mcVolumeScrubber.x = videoMovie.mcVideoControls.volumeTrack_mc.x;
videoMovie.mcVideoControls.volume_mc.width = 1;
}
function unmuteClicked(e:MouseEvent):void {
// set volume to last used value
setVolume(intLastVolume);
// update scrubber and fill position/width
videoMovie.mcVideoControls.mcVolumeScrubber.x = (videoMovie.mcVideoControls.volumeTrack_mc.width * intLastVolume) + videoMovie.mcVideoControls.volumeTrack_mc.x;
videoMovie.mcVideoControls.volume_mc.width = videoMovie.mcVideoControls.mcVolumeScrubber.x - videoMovie.mcVideoControls.volumeTrack_mc.x;
}
function volumeScrubberClicked(e:MouseEvent):void {
// set volume scrub flag to true
bolVolumeScrub = true;
// start drag
videoMovie.mcVideoControls.mcVolumeScrubber.startDrag(false, new Rectangle(videoMovie.mcVideoControls.volumeTrack_mc.x, videoMovie.mcVideoControls.volumeTrack_mc.y, videoMovie.mcVideoControls.volumeTrack_mc.width, 0));
}
function progressScrubberClicked(e:MouseEvent):void {
// set progress scrub flag to true
bolProgressScrub = true;
// start drag
videoMovie.mcVideoControls.mcPlayPosScrubber.startDrag(false, new Rectangle(videoMovie.mcVideoControls.playPosTrack_mc.x, videoMovie.mcVideoControls.playPosTrack_mc.y, videoMovie.mcVideoControls.playPosTrack_mc.width, 0));
}
function mouseReleased(e:MouseEvent):void {
// set progress/volume scrub to false
bolVolumeScrub = false;
bolProgressScrub = false;
// stop all dragging actions
videoMovie.mcVideoControls.mcPlayPosScrubber.stopDrag();
videoMovie.mcVideoControls.mcVolumeScrubber.stopDrag();
// update progress/volume fill
videoMovie.mcVideoControls.playPosBar_mc.width = videoMovie.mcVideoControls.mcPlayPosScrubber.x - videoMovie.mcVideoControls.playPosTrack_mc.x;
videoMovie.mcVideoControls.volume_mc.width = videoMovie.mcVideoControls.mcVolumeScrubber.x - videoMovie.mcVideoControls.volumeTrack_mc.x;
// save the volume if it's greater than zero
if((videoMovie.mcVideoControls.mcVolumeScrubber.x - videoMovie.mcVideoControls.volumeTrack_mc.x) / videoMovie.mcVideoControls.volumeTrack_mc.width > 0){
intLastVolume = (videoMovie.mcVideoControls.mcVolumeScrubber.x - videoMovie.mcVideoControls.volumeTrack_mc.x) / videoMovie.mcVideoControls.volumeTrack_mc.width;
}
}
function updateDisplay(e:Event):void {
// update volume and the red fill width when user is scrubbing
if(bolVolumeScrub) {
setVolume((videoMovie.mcVideoControls.mcVolumeScrubber.x - videoMovie.mcVideoControls.volumeTrack_mc.x) / videoMovie.mcVideoControls.volumeTrack_mc.width);
videoMovie.mcVideoControls.volume_mc.width = videoMovie.mcVideoControls.mcVolumeScrubber.x - videoMovie.mcVideoControls.volumeTrack_mc.x;
}
if(mouseX > videoX && mouseX < videoX + videoWidth && mouseY > videoY && mouseY < videoY + videoMovie.vidDisplay.height) {
if(nsStream.time > 0){
if(videoMovie.mcVideoControls.y > 250){
videoMovie.mcVideoControls.y -= 2;
}
if(videoMovie.playBig_btn.alpha < 1){
videoMovie.playBig_btn.alpha += gvc.fadeSpeed;
videoMovie.pauseBig_btn.alpha += gvc.fadeSpeed;
}
}
} else {
if(videoMovie.mcVideoControls.y < 272){
videoMovie.mcVideoControls.y += 2;
}
if(nsStream.time > 0){
if(videoMovie.playBig_btn.alpha > 0){
videoMovie.playBig_btn.alpha -= gvc.fadeSpeed;
videoMovie.pauseBig_btn.alpha -= gvc.fadeSpeed;
} else {
videoMovie.playBig_btn.alpha = 0;
videoMovie.pauseBig_btn.alpha = 0;
}
}
}
if(bolProgressScrub) {
videoMovie.mcVideoControls.playPosBar_mc.width = videoMovie.mcVideoControls.mcPlayPosScrubber.x - videoMovie.mcVideoControls.playPosTrack_mc.x;
var newTime = Math.floor(((videoMovie.mcVideoControls.mcPlayPosScrubber.x - videoMovie.mcVideoControls.playPosTrack_mc.x)/videoMovie.mcVideoControls.playPosTrack_mc.width)*videoLength)
if(newTime >=0){
nsStream.seek(newTime);
}
} else {
var newPos = Math.floor(videoMovie.mcVideoControls.playPosTrack_mc.x + ((nsStream.time/videoLength)*videoMovie.mcVideoControls.playPosTrack_mc.width));
videoMovie.mcVideoControls.mcPlayPosScrubber.x = newPos;
videoMovie.mcVideoControls.playPosBar_mc.width = newPos - videoMovie.mcVideoControls.playPosTrack_mc.x;
}
}
function netStatusHandler(event:NetStatusEvent):void {
trace(event.info.code);
// handles net status events
switch (event.info.code) {
// trace a messeage when the stream is not found
case "NetStream.Play.StreamNotFound":
trace("Stream not found: " + videoPath);
break;
case "NetConnection.Connect.Success":
break;
case "NetStream.Play.Start":
break;
// when the video reaches its end, we stop the player
case "NetStream.Play.Stop":
stopVideoPlayer();
break;
}
}
function setVolume(intVolume:Number = 0):void {
// create soundtransform object with the volume from
// the parameter
sndTransform = new SoundTransform(intVolume);
// assign object to netstream sound transform object
nsStream.soundTransform = sndTransform;
// hides/shows mute and unmute button according to the
// volume
if(intVolume > 0) {
videoMovie.mcVideoControls.btnMute.visible = true;
videoMovie.mcVideoControls.btnUnmute.visible = false;
} else {
videoMovie.mcVideoControls.btnMute.visible = false;
videoMovie.mcVideoControls.btnUnmute.visible = true;
}
}
function formatTime(t:int):String {
// returns the minutes and seconds with leading zeros
// for example: 70 returns 01:10
var s:int = Math.round(t);
var m:int = 0;
if (s > 0) {
while (s > 59) {
m++;
s -= 60;
}
return String((m < 10 ? "0" : "") + m + ":" + (s < 10 ? "0" : "") + s);
} else {
return "00:00";
}
}
// STOP VIDEO PLAYER
public function stopVideoPlayer():void {
flash.media.SoundMixer.stopAll();
// pause netstream, set time position to zero
nsStream.pause();
nsStream.close();
videoLength = 0;
videoMovie.videoBG_mc.removeEventListener(Event.ENTER_FRAME, updateDisplay);
videoMovie.mcVideoControls.y = 272;
var videoClass:LoadVideo = new LoadVideo(videoMovie, videoPath, 50, 100, 360, false);
addChild(videoClass);
}
}
}
This works great for one video, but when I call stopVideoPlayer to stop and load a new video, it plays the new video and sound but then it plays the sound from the previous video over the top. I am thinking that I need to delete / destroy the sound from my previous video before loading the new one but cannot figure out how to do it. Anyone got any ideas?
Thanks,
Bob
www.bobcooper.org.uk