⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 videoplayer.as

📁 这是一款FLV视频在线播放器
💻 AS
字号:
package com.ruochi.video {
	import com.ruochi.shape.Rect;
	import com.ruochi.video.ScaleUtils;
	import com.ruochi.video.VideoEvent;
	import flash.events.Event;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import flash.events.NetStatusEvent;
	import flash.net.URLRequest;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.display.Sprite;
	import com.ruochi.component.SimpleAlert;
	import flash.media.SoundTransform;
	import com.ruochi.utils.deleteAll;
	public class VideoPlayer extends Sprite {
		private var _video:Video = new Video();
		private var _netStream:NetStream;
		private var _netConnetction:NetConnection = new NetConnection();
		private var _url:String;
		private var _state:String;
		private var _timer:Timer = new Timer(100, 0);
		private var _duration:Number;
		private var _bg:Rect = new Rect(100, 100, 0);
		private var _playerWidth:Number;
		private var _playerHeight:Number;
		private var _isVideoInit:Boolean = false;
		private var _metadata:Object;
		private var _soundTransform:SoundTransform = new SoundTransform();
		private var _isBuffering:Boolean = false;
		private var _client:Object = new Object;
		private var _dataXml:XML;
		private var _isAutoPlay:Boolean;
		private var _scaleMode:String;
		private var _isLoadBegin:Boolean = true;
		private static var _instance:VideoPlayer = new VideoPlayer();
		public function VideoPlayer(w:int = 320, h:int = 240) {
			if (!_instance) {
				_playerWidth = w;
				_playerHeight = h;
				init();
			}else {
				throw new Error("singleton");
			}
		}
		private function init():void {
			_video.smoothing = true;
			_video.visible = false;
            _netConnetction.connect(null);			
			_netStream = new NetStream(_netConnetction);
            _netStream.client = _client;
			_netStream.bufferTime = 4;
			_video.attachNetStream(_netStream);
			configListener();
			addChild(_bg);
			addChild(_video);
			_client.onMetaData = onMetaData;
			_client.onCuePoint = onCuePoint;
		}
		private function resetParam():void {
			_isVideoInit = false;
			_timer.stop();	
		}
		private function onMetaData(info:Object):void {			
			_duration = info.duration;
			dispatchEvent(new VideoEvent(VideoEvent.RECEIVE_METADATA, false, false, _state, playheadTime));
		}
		private function onCuePoint(info:Object):void {
			dispatchEvent(new VideoEvent(VideoEvent.CUE_POINT, false, false, _state, playheadTime));
		}
		private function configListener():void {
			_timer.addEventListener(TimerEvent.TIMER, onTimer, false, 0, true);
			_netStream.addEventListener(NetStatusEvent.NET_STATUS, onNetStreamStatus, false, 0, true);
		}
		private function onNetStreamStatus(e:NetStatusEvent):void {
			switch (e.info.code) { 
			case "NetConnection.Connect.Success":
				break;
			case "NetStream.Play.StreamNotFound":
				SimpleAlert.text = _url + "Moive not found"
				break;
			case "NetStream.Buffer.Flush":
				
			case "NetStream.Play.Start":
				break;			
			
			case "NetStream.Play.Stop":
				resetParam();
				_isAutoPlay = false;
                load();				
				dispatchEvent(new VideoEvent(VideoEvent.COMPLETE, false, false, _state, playheadTime));
				break;
			}
		}
		private function onTimer(e:TimerEvent):void {
			if(_timer.currentCount%10==0){
				if (!_isVideoInit && _video.videoWidth) {
					videoInit();
				}
				dispatchEvent(new VideoEvent(VideoEvent.PROGRESS, false, false, _state, playheadTime));
				dispatchEvent(new VideoEvent(VideoEvent.PLAYHEAD_UPDATE, false, false, _state, playheadTime));
				checkBuffer();
			}
			dispatchEvent(new VideoEvent(VideoEvent.MINI_PLAYHEAD_UPDATE, false, false, _state, playheadTime));
		}
		private function checkBuffer():void {
			if (_netStream.bufferLength < .5 && _isBuffering == false) {
				_isBuffering = true;
				dispatchEvent(new VideoEvent(VideoEvent.START_BUFFERING, false, false, _state, playheadTime));
			}else if(_netStream.bufferLength>_netStream.bufferTime-.5 && _isBuffering == true){
				_isBuffering = false;
				dispatchEvent(new VideoEvent(VideoEvent.STOP_BUFFERING, false, false, _state, playheadTime));
			}
		}
		private function videoInit():void {
			_video.visible = true;
			setSize(_playerWidth, _playerHeight);
			if (_isAutoPlay) {
				play()
			}else {
				pause();
			}			
			_isVideoInit = true;
		}
		private function setState(str:String):void {
			if (str != _state) {
				_state = str;
				dispatchEvent(new VideoEvent(VideoEvent.STATE_CHANGE, false, false, _state, playheadTime));				
			}
		}
		public function get state():String {
			return _state;
		}
		public function setSize(w:int, h:int):void {
			_playerWidth = w;
			_playerHeight = h;
			_bg.width = w;
			_bg.height = h;
			if (_scaleMode == ScaleUtils.NO_BORDER) {
				ScaleUtils.fillNoBorder(_video, _bg);
			}else if (_scaleMode == ScaleUtils.NO_SCALE) {
				ScaleUtils.fillNoScale(_video, _bg);
			}else if (_scaleMode == ScaleUtils.EXACT_FIT) {
				ScaleUtils.fillExactFit(_video, _bg);
			}else {				
				ScaleUtils.fillShowAll(_video, _bg); 
			}
		}
		public function play():void {
			if (_timer.running) {
				_netStream.resume();
				setState(VideoEvent.PLAYING);
			}else {
				load();
			}
		}
		public function load():void {
			_netStream.play(_url)
			_timer.start();
			dispatchEvent(new VideoEvent(VideoEvent.LOADING, false, false, _state, playheadTime));	
			//setState(VideoEvent.LOADING);
		}
		public function pause():void {
			_netStream.pause();
			setState(VideoEvent.PAUSED);
		}
		public function stop():void {
			pause();
			seek(0);
			setState(VideoEvent.STOP);
		}
		public function close():void {
			_netStream.close();
		}
		public function playPause():void {
			if (_state != VideoEvent.PLAYING) {
				play();
			}else {
				pause();
			}
		}
		public function ff():void {
			seek(playheadTime + totalTime / 10);
		}
		public function rew():void {
			seek(playheadTime - totalTime / 10);
		}
		public function seekPersent(persent:Number):void {
			seek(totalTime * persent);
		}
		public function gotoBegin():void {
			pause();
			seek(0);
		}
		public function seek(offset:Number):void {
			_netStream.seek(offset);
		}
		public function get playheadTime():Number {
			return _netStream.time;
		}
		public function get totalTime():Number {
			return duration;
		}
		public function get bytesLoaded():Number {
			return _netStream.bytesLoaded;
		}
		public function get bytesTotal():Number {
			return _netStream.bytesTotal;
		}		
		public function set volume(value:Number):void {
			_soundTransform.volume = value;
			_netStream.soundTransform = _soundTransform;
		}
		public function get volume():Number {
			return _soundTransform.volume;
		}
		public function set duration(num:Number):void {
			_duration = num;
		}
		public function get duration():Number {
			if (_duration) {
				return _duration;
			}else {
				return bytesTotal/_video.videoWidth/_video.videoHeight * 1.8
			}
		}
		public function get playerWidth():int {
			return _playerWidth;
		}	
		public function get playerHeight():int {
			return _playerHeight;
		}
		public function set url(u:String):void {
			_url = u;
			if (_isLoadBegin) {
				load();
			}
		}
		public function set dataXml(xml:XML):void {
			_dataXml = xml;
			url = _dataXml.source[0];
			if (_dataXml.duration[0] != undefined) {
				_duration = _dataXml.duration[0]
			}
		}
		public function get dataXml():XML {
			return _dataXml;
		}
		public function set isAutoPlay(b:Boolean):void {
			_isAutoPlay = b;
		}
		public function set defaultVoluem(v:Number):void {
			_soundTransform.volume = v;
		}
		public function set bufferTime(v:Number):void {
			_netStream.bufferTime = v;
		}
		public function set scaleMode(s:String):void {
			_scaleMode = s;
		}
		public function set isLoadBegin(b:Boolean):void {
			_isLoadBegin = b;
		}
		static public function get instance():VideoPlayer {
			return _instance;
		}
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -