123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 |
- /*
- ╠═ f4.Player ══════════════════════════════════════════════════════════════
- Software: f4.Player - flash video player
- Version: alpha 2.1
- Support: http://f4player.org
- Author: goker cebeci
- Contact: goker [at] cebeci .name
- -------------------------------------------------------------------------
- License: Distributed under the Lesser General Public License (LGPL)
- http://www.gnu.org/copyleft/lesser.html
- This program is distributed in the hope that it will be useful - WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE.
- ═══════════════════════════════════════════════════════════════════════════ */
- package f4 {
- import flash.display.StageScaleMode;
- import flash.display.StageAlign;
- import flash.display.StageDisplayState;
- import flash.display.MovieClip;
- import flash.display.Loader;
- import flash.display.SimpleButton;
- import flash.display.Bitmap;
- import flash.net.URLLoader;
- import flash.net.URLRequest;
- import flash.net.NetConnection;
- import flash.net.NetStream;
- import flash.media.Video;
- import flash.media.SoundTransform
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.events.TimerEvent;
- import flash.events.NetStatusEvent;
- import flash.utils.Timer;
- import flash.geom.Rectangle;
-
- public class Player extends MovieClip {
- public var player:MovieClip;
- public var videourl:String;
- public var thumbnailurl:String;
- public var autoplay:Boolean;
- public var fullScreen:Boolean;
- public var X:int;
- public var Y:int;
- public var W:int;
- public var H:int;
- private static var padding:int = 13; // Navigation Bar padding
- private var barPadding:int;
- private var seekBarWidth:int; // seek-bar width
- private var barWidth:int;
- //-------------------------------------- ### ------------------------------------------
- private var ns:NetStream;
- private var netStatusCache:String;
- private var video:Video;
- private var thumbnail:Bitmap;
- private var meta:Object;
- private var progress:int;
- private var ready:Boolean = false;
- private var bufferFlush:Boolean = false;
- private var invalidTime:Boolean = false;
- private var seeking:Boolean = false;
- private var progressBarTimer:Timer = new Timer(250);
- private var playingBarTimer:Timer = new Timer(250);
- public function Player(videourl:String,thumbnailurl:String,W:int,H:int,skin:String,autoplay:Boolean=false,fullScreen:Boolean=true,Y:int=0,X:int=0) {
- this.videourl = videourl;
- this.thumbnailurl = thumbnailurl;
- this.autoplay = autoplay;
- this.fullScreen = fullScreen;
- this.X = X;
- this.Y = Y;
- this.W = W?(W<150?150:W):480;
- this.H = H?(H<150?150:H):270;
- skin = skin ? skin : 'skins/default.swf'
- var skinLoader:Loader = new Loader();
- skinLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, skinCompleteEvent);
- //skinLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, skinProgressEvent);
- skinLoader.load(new URLRequest(skin));
- }
- // EVENT ╠═════════════ # SKIN COMPLETE EVENT # ═════════════
- private function skinCompleteEvent(event:Event):void {
- player = event.currentTarget.content;
- this.addChild(player);
- //set skin [
- player.overBtn.visible = false;
- player.playBtn.visible = false;
- player.navigator.visible = false;
- var nav:MovieClip = player.navigator;
- seekBarWidth = nav.seekBar.width;
- nav.playBtn.x = padding;
- nav.pauseBtn.visible = false;
- nav.pauseBtn.y = nav.playBtn.y;
- nav.bar.x = nav.playBtn.width + padding * 2;
- nav.container.x = nav.bar.x + padding;
- barPadding = (nav.container.height - nav.playingBar.height)*.5;
- nav.progressBar.x = nav.playingBar.x = nav.seekBar.x = nav.container.x + barPadding;
- nav.progressBar.y = nav.playingBar.y = nav.seekBar.y = nav.container.y + barPadding;
- nav.seeker.x = nav.container.x+barPadding;
- nav.seeker.y = nav.container.y-barPadding;
- nav.playingBar.width = 0;
- setPosition();
- // ] set skin
- //-------------------------------------- ### ------------------------------------------
- //thumbnailurl [
- if(thumbnailurl){
- var tn = new Loader();
- var tnEvent:Function = function(event:Event):void {
- thumbnail = tn.content;
- var dim = 1;
- var vert:Boolean = (W/H) > 1;
- if(thumbnail.width > thumbnail.height && vert){
- dim = H / thumbnail.height;
- } else {
- dim = W / thumbnail.width;
- }
- thumbnail.width = thumbnail.width * dim;
- thumbnail.height = thumbnail.height * dim;
- thumbnail.x = (W - thumbnail.width) / 2 >> 0;
- thumbnail.y = (H - thumbnail.height) / 2 >> 0;
- player.screen.addChildAt(thumbnail,0);
- // screen size fix [
- //player.screen.width = image.width;
- //player.screen.height = image.height;
- // ]
- //image.x = player.screen.x;
- //image.y = player.screen.y;
- }
- tn.contentLoaderInfo.addEventListener(Event.COMPLETE, tnEvent);
- tn.load(new URLRequest(thumbnailurl));
- }
- // ] thumbnailurl
- //-------------------------------------- ### ------------------------------------------
- var client:Object = new Object();
- client.onMetaData = metaDataObject;
- var c:NetConnection = new NetConnection();
- c.connect(null);
- ns = new NetStream(c);
- ns.bufferTime = 5; // buffer time 5 sec.
- ns.client = client;
- ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusEvent);
- //-------------------------------------- ### ------------------------------------------
- // PLAYER
- video = new Video();
- video.smoothing = true;
- //video.x = player.screen.x;
- //video.y = player.screen.y;
- //video.width = player.screen.width;
- //video.height = player.screen.height;
- video.attachNetStream(ns);
- player.addChildAt(video,1);
- player.playBtn.addEventListener(MouseEvent.CLICK, playEvent);
- // AUTOPLAY
- if(this.autoplay) {
- var clicker:Function = playEvent;
- clicker(new MouseEvent(MouseEvent.CLICK));
- } else player.playBtn.visible = true;
- //-------------------------------------- ### ------------------------------------------
- }
- // FUNC ╠═════════════ # SET POSITION # ═════════════
- private function setPosition():void{
- player.background.x = X;
- player.background.y = Y;
- player.background.width = W;
- player.background.height = H;
- var Width:int = W;
- var Height:int = H;
- var dim = 1;
- var vert:Boolean = (W/H) > 1;
- /*// VIDEO RATIO
- if(Width > int(Height * 1.3333)){ // 1.3333 => 4/3 || 1.7777 => 16/9 format
- player.screen.width = int(Height * 1.7777);
- player.screen.height = Height;
- } else {
- player.screen.width = Width;
- player.screen.height = int(Width * .75); // .75 => 4/3 || .5625 => 16/9 format
- }
- */
- //player.screen.width = Width;
- //player.screen.height = Height;
-
- player.overBtn.width = Width;
- player.overBtn.height = Height;
- var nav:MovieClip = player.navigator;
- player.overBtn.x = player.screen.x = nav.x = X;
- player.overBtn.y = player.screen.y = Y;
- player.bufferMovie.x = player.screen.x + (Width-player.bufferMovie.width)*.5;
- player.bufferMovie.y = player.screen.y + (Height-player.bufferMovie.height)*.5;
- player.playBtn.x = player.screen.x + (Width-player.playBtn.width)*.5;
- player.playBtn.y = player.screen.y + (Height-player.playBtn.height)*.5;
- //NAVIGATOR POSITION
- nav.y = player.screen.y + Height - nav.height - padding *.5;
- nav.bar.width = W - nav.bar.x - padding;
- var endPoint:int = nav.bar.x + nav.bar.width;
- if(fullScreen)
- endPoint = nav.fullScreen.x = endPoint - nav.fullScreen.width - padding;
- else nav.fullScreen.visible = false;
- endPoint = nav.volumeBar.x = endPoint - nav.volumeBar.width - padding;
- nav.container.width = endPoint - nav.container.x - padding;
- nav.progressBar.width = nav.playingBar.width = nav.seekBar.width = barWidth = nav.container.width - barPadding * 2;
- if(progress){ // progress bar size
- var newWidth:Number =((progress * barWidth *.01) >> 0);
- nav.progressBar.x = nav.seekBar.x + newWidth;
- nav.progressBar.width = barWidth - newWidth;
- }
- // VIDEO
- if(video){
- dim = 1;
- if(video.width > video.height && vert){
- dim = H / video.height;
- } else {
- dim = W / video.width;
- }
- video.width = video.width * dim;
- video.height = video.height * dim;
- video.x = (W - video.width) / 2 >> 0;
- video.y = (H - video.height) / 2 >> 0;
- }
- if(thumbnail){
- dim = 1;
- if(thumbnail.width > thumbnail.height && vert){
- dim = H / thumbnail.height;
- } else {
- dim = W / thumbnail.width;
- }
- thumbnail.width = thumbnail.width * dim;
- thumbnail.height = thumbnail.height * dim;
- thumbnail.x = (W - thumbnail.width) / 2 >> 0;
- thumbnail.y = (H - thumbnail.height) / 2 >> 0;
- }
- }
- // EVENT ╠═════════════ # RESIZE EVENT # ═════════════
- public function resizeEvent(event:Event):void {
- W = stage.stageWidth;
- H = stage.stageHeight;
- setPosition();
- }
- // EVENT ╠═════════════ # NET STATUS EVENT # ═════════════
- private function netStatusEvent(event:NetStatusEvent):void {
- if(netStatusCache != event.info.code){
- switch (event.info.code) {
- case "NetStream.Play.Start" :
- playingBarTimer.start();
- break;
- case "NetStream.Buffer.Empty" :
- break;
- case "NetStream.Buffer.Full" :
- break;
- case "NetStream.Buffer.Flush" :
- bufferFlush = true;
- break;
- case "NetStream.Seek.Notify" :
- invalidTime = false;
- break;
- case "NetStream.Seek.InvalidTime" :
- bufferFlush = false;
- invalidTime = true;
- break;
- case "NetStream.Play.Stop" :
- if(bufferFlush) STOP();
- break;
- }
- netStatusCache = event.info.code;
- }
- }
- // OBJECT ╠═════════════ # META DATA OBJECT # ═════════════
- private function metaDataObject(data:Object):void {
- meta = data;
- player.bufferMovie.visible = false;
- //video.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
- playingBarTimer.addEventListener(TimerEvent.TIMER, playingBarTimerEvent);
- var nav:MovieClip = player.navigator;
- nav.playBtn.addEventListener(MouseEvent.CLICK, playPauseEvent);
- nav.pauseBtn.addEventListener(MouseEvent.CLICK, playPauseEvent);
- player.overBtn.visible = true;
- player.overBtn.buttonMode = true;
- player.overBtn.addEventListener(MouseEvent.CLICK, playPauseEvent);
- player.overBtn.addEventListener(MouseEvent.MOUSE_OVER, controlDisplayEvent);
- player.overBtn.addEventListener(MouseEvent.MOUSE_OUT, controlDisplayEvent);
- nav.addEventListener(MouseEvent.MOUSE_OVER, controlDisplayEvent);
- nav.addEventListener(MouseEvent.MOUSE_OUT, controlDisplayEvent);
- /// seeker [
- nav.seeker.buttonMode = true;
- nav.seeker.addEventListener(MouseEvent.MOUSE_DOWN, seekerEvent);
- this.stage.addEventListener(MouseEvent.MOUSE_UP, stageMouseUpEvent);
- nav.playingBar.buttonMode = true;
- nav.playingBar.addEventListener(MouseEvent.MOUSE_DOWN, playingBarEvent);
- nav.seekBar.buttonMode = true;
- nav.seekBar.addEventListener(MouseEvent.MOUSE_DOWN, seekBarEvent);
- // ] seeker
- // volume [
- volumeTransform = new SoundTransform();
- nav.volumeBar.mute.addEventListener(MouseEvent.CLICK, volumeEvent);
- nav.volumeBar.mute.addEventListener(MouseEvent.ROLL_OVER, volumeEvent);
- nav.volumeBar.volumeOne.addEventListener(MouseEvent.CLICK, volumeEvent);
- nav.volumeBar.volumeOne.addEventListener(MouseEvent.ROLL_OVER, volumeEvent);
- nav.volumeBar.volumeTwo.addEventListener(MouseEvent.CLICK, volumeEvent);
- nav.volumeBar.volumeTwo.addEventListener(MouseEvent.ROLL_OVER, volumeEvent);
- nav.volumeBar.volumeThree.addEventListener(MouseEvent.CLICK, volumeEvent);
- nav.volumeBar.volumeThree.addEventListener(MouseEvent.ROLL_OVER, volumeEvent);
- nav.volumeBar.volumeFour.addEventListener(MouseEvent.CLICK, volumeEvent);
- nav.volumeBar.volumeFour.addEventListener(MouseEvent.ROLL_OVER, volumeEvent);
- nav.volumeBar.volumeFive.addEventListener(MouseEvent.CLICK, volumeEvent);
- nav.volumeBar.volumeFive.addEventListener(MouseEvent.ROLL_OVER, volumeEvent);
- // ] volume
- // fullScreen [
- nav.fullScreen.buttonMode = true;
- nav.fullScreen.addEventListener(MouseEvent.CLICK, fullScreenHandler);
- // ] fullScreen
- }
- // EVENT ╠═════════════ # PROGRESSBAR TIMER EVENT # ═════════════
- private function progressBarTimerEvent(event:TimerEvent):void {
- progress = (( ns.bytesLoaded / ns.bytesTotal * 100 ) >> 0);
- var w:Number =((progress * barWidth *.01) >> 0);
- player.navigator.progressBar.x = player.navigator.seekBar.x + w;
- player.navigator.progressBar.width = barWidth - w;
- if(progress >= 100){
- progressBarTimer.stop();
- }
- }
- // EVENT ╠═════════════ # PLAYINGBAR TIMER EVENT # ═════════════
- private function playingBarTimerEvent(event:TimerEvent):void {
- player.navigator.seeker.currentTime.text = formatTime(ns.time);
- var percent:Number = (ns.time / meta.duration * barWidth).toFixed(2);
- player.navigator.playingBar.width = percent;
- player.navigator.seeker.x = player.navigator.playingBar.x + percent;
- }
- // FUNC ╠═════════════ # FORMAT TIME # ═════════════
- private function formatTime(time:Number):String {
- if(time > 0){
- var integer:String = String((time*.0166)>>0);
- var decimal:String = String((time%60)>>0);
- return ((integer.length<2)?"0"+integer:integer)+":"+((decimal.length<2)?"0"+decimal:decimal);
- } else return String("00:00");
- }
- // EVENT ╠═════════════ # PLAY EVENT # ═════════════
- private function playEvent(event:MouseEvent):void {
- ready = true;
- var dim = 1;
- var vert:Boolean = (W/H) > 1;
- if(video.width > video.height && vert){
- dim = H / video.height;
- } else {
- dim = W / video.width;
- }
- video.width = video.width * dim;
- video.height = video.height * dim;
- video.x = (W - video.width) / 2 >> 0;
- video.y = (H - video.height) / 2 >> 0;
-
-
- player.navigator.playBtn.visible = (player.navigator.playBtn.visible?false:true);
- player.navigator.pauseBtn.visible = (player.navigator.pauseBtn.visible?false:true);
- player.playBtn.visible = false;
- player.screen.visible = false;
- ns.play(videourl); // *** play video file
- // PROGRESS
- progressBarTimer.addEventListener(TimerEvent.TIMER, progressBarTimerEvent);
- progressBarTimer.start();
- }
- // EVENT ╠═════════════ # PLAY&PAUSE EVENT # ═════════════
- private function playPauseEvent(event:MouseEvent):void {
- TOGGLEPAUSE();
- }
- // EVENT ╠═════════════ # CONTROL DISPLAY EVENT # ═════════════
- private function controlDisplayEvent(event:MouseEvent):void {
- if(event.type == 'mouseOver'){
- player.navigator.visible = true;
- } else player.navigator.visible = false;
- }
- // EVENT ╠═════════════ # SEEKER EVENT # ═════════════
- private function seekerEvent(event:MouseEvent):void {
- seeking = true;
- var rectangle:Rectangle = new Rectangle(player.navigator.playingBar.x, player.navigator.seeker.y, barWidth, 0);
- player.navigator.seeker.startDrag(false, rectangle);
- TOGGLEPAUSE();
- this.stage.addEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveEvent);
- }
- // EVENT ╠═════════════ # STAGE MOUSE MOVE EVENT # ═════════════
- private function stageMouseMoveEvent(event:MouseEvent):void { // for seeker position
- if(meta.duration > 0) {
- if(seeking) {
- var point:int = (((player.navigator.seeker.x - player.navigator.playingBar.x) / barWidth) * meta.duration) >> 0;
- if(point <= 0 || point >= (meta.duration >> 0)) player.navigator.seeker.stopDrag();
- player.navigator.seeker.currentTime.text = formatTime(point);
- ns.seek(point);
- }
- }
- }
- // EVENT ╠═════════════ # STAGE MOUSE UP EVENT # ═════════════
- private function stageMouseUpEvent(event:MouseEvent):void { // for stop seeking
- if(seeking){
- seeking = false;
- player.navigator.seeker.stopDrag();
- TOGGLEPAUSE();
- }
- }
- // EVENT ╠═════════════ # PLAYINGBAR EVENT # ═════════════
- private function playingBarEvent(event:MouseEvent):void { //click to seek
- var point:Number = (meta.duration * (event.localX*player.navigator.playingBar.width/seekBarWidth) / barWidth);
- ns.seek(point);
- }
- // EVENT ╠═════════════ # SEEKBAR EVENT # ═════════════
- private function seekBarEvent(event:MouseEvent):void { //click to seek
- var point:Number = (event.localX * meta.duration / seekBarWidth);
- ns.seek(point);
- }
- // EVENT ╠═════════════ # VOLUME EVENT # ═════════════
- private function volumeEvent(event:MouseEvent):void {
- var thisMC:MovieClip = event.currentTarget as MovieClip;
- if(event.buttonDown || event.type == 'click')
- switch (event.currentTarget) {
- case player.navigator.volumeBar.mute :
- if(volumeTransform.volume > 0) {
- volumeCache = .1;
- setVolume(0);
- } else setVolume(volumeCache);
- break;
- case player.navigator.volumeBar.volumeOne : setVolume(.2); break;
- case player.navigator.volumeBar.volumeTwo : setVolume(.4); break;
- case player.navigator.volumeBar.volumeThree : setVolume(.6); break;
- case player.navigator.volumeBar.volumeFour : setVolume(.8); break;
- case player.navigator.volumeBar.volumeFive : setVolume(1); break;
- }
- }
- // FUNC ╠═════════════ # SET VOLUME # ═════════════
- public function setVolume(newVolume):void{
- volumeTransform.volume = newVolume;
- ns.soundTransform = volumeTransform;
- player.navigator.volumeBar.mute.gotoAndStop((newVolume > 0)?1:2);
- player.navigator.volumeBar.volumeOne.gotoAndStop((newVolume >= 0.2)?1:2);
- player.navigator.volumeBar.volumeTwo.gotoAndStop((newVolume >= 0.4)?1:2);
- player.navigator.volumeBar.volumeThree.gotoAndStop((newVolume >= 0.6)?1:2);
- player.navigator.volumeBar.volumeFour.gotoAndStop((newVolume >= 0.8)?1:2);
- player.navigator.volumeBar.volumeFive.gotoAndStop((newVolume == 1)?1:2);
- }
- // EVENT ╠═════════════ # FULLSCREEN EVENT # ═════════════
- private function fullScreenHandler(event:MouseEvent):void {
- if(this.stage.displayState == StageDisplayState.FULL_SCREEN){
- this.stage.displayState = StageDisplayState.NORMAL;
- } else {
- this.stage.displayState = StageDisplayState.FULL_SCREEN;
- }
- }
- // FUNC ╠═════════════ # TOGGLE PAUSE # ═════════════
- public function TOGGLEPAUSE():void {
- if(invalidTime){ ns.seek(0); invalidTime = false; }
- player.navigator.playBtn.visible = (player.navigator.playBtn.visible?false:true);
- player.navigator.pauseBtn.visible = (player.navigator.pauseBtn.visible?false:true);
- player.playBtn.visible = false;
- player.screen.visible = false;
- ns.togglePause();
- }
- // FUNC ╠═════════════ # STOP # ═════════════
- public function STOP():void {
- player.navigator.playBtn.visible = true;
- player.navigator.pauseBtn.visible = false;
- player.screen.visible = true;
- player.playBtn.visible = true;
- ns.seek(0);
- ns.pause();
- }
- }
- }
|