Flash/Flex学习笔记(37):不用系统组件(纯AS3)的视频播放器--只有8.82K

简介: 以前为了赶项目,利用系统组件制作过一款视频播放器(见Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器),但是系统组件实在是太大了,最终生成的swf居然有103K,随着AS3的深入学习,昨天又弄了一个只用AS3的播放器,最终只有8.82K,呵呵,这肥减得那是相当厉害。

以前为了赶项目,利用系统组件制作过一款视频播放器(见Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器),但是系统组件实在是太大了,最终生成的swf居然有103K,随着AS3的深入学习,昨天又弄了一个只用AS3的播放器,最终只有8.82K,呵呵,这肥减得那是相当厉害。

用到了上一篇(Flash/Flex学习笔记(35):自己动手实现一个滑块控件(JimmySilder))里自己写的的滑块控件,主要代码如下(关键是NetConnection与NetStream对象的使用):

import Jimmy.Event.ValueChangeEvent;

var _autoPlay:Boolean=true;//是否自动播放
var _netConn:NetConnection;
var _netStream:NetStream;
var _duration:Number=0.0;
var _client:Object;
var _soundTransform:SoundTransform;
var _volumn=0.6;//初始音量
var _flvUrl = "flv的地址";

function init():void {
	txtInfo.text = "";
	txtInfo.visible = false;
	txtCurrent.text = "00:00";
	txtTotal.text = "00:00";
	silderVideo.Value = 0.0;
	videoMask.visible = false;
	txtPercent.text = "";
	txtPercent.visible = false;
	
	_netConn = new NetConnection();//创建连接
	_client = new Object();
	_soundTransform = new SoundTransform();

	//初始化[暂停]/[播放]按钮可见性
	if (_autoPlay) {
		btnPause.visible=true;
		btnPlay.visible=false;
	} else {
		btnPause.visible=false;
		btnPlay.visible=true;
	}	

	//初始化滑块按钮宽度
	silderSound.ButtonWidth=35;
	silderVideo.ButtonWidth=9.5;	
	silderSound.Value = _volumn;
	silderSound.ShowBarTri = true;
	silderSound.ShowBar = false;

	//开始连接并播放
	_netConn.connect(null);
	_netStream=new NetStream(_netConn);
	_netStream.bufferTime = 5;
	wVideo.attachNetStream(_netStream);
	_netStream.play(_flvUrl);	
	_soundTransform.volume=_volumn;
	_netStream.soundTransform=_soundTransform;
	_client.onMetaData = MetaDataHandler;
	_netStream.client=_client;

	//注册监听事件
	_netStream.addEventListener(NetStatusEvent.NET_STATUS,NetStatusHandler);
	btnSound.addEventListener(MouseEvent.MOUSE_OVER,function(){ Mouse.cursor = MouseCursor.BUTTON});
	btnSound.addEventListener(MouseEvent.MOUSE_OUT,function(){ Mouse.cursor = MouseCursor.AUTO});
	btnSound.addEventListener(MouseEvent.MOUSE_DOWN,btnSoundMouseDown);
	btnPlay.addEventListener(MouseEvent.CLICK,btnPlayMouseClick);
	btnPause.addEventListener(MouseEvent.CLICK,btnPauseMouseClick);
	btnStop.addEventListener(MouseEvent.CLICK,btnStopMouseClick);
	silderSound.addEventListener(ValueChangeEvent.VALUE_CHANGE,VolumnChangedHandler);
	addEventListener(Event.ENTER_FRAME,EnterFrameHandler);	
	silderVideo.addEventListener(MouseEvent.MOUSE_DOWN,silderVideoMouseDown);
	silderVideo.addEventListener(ValueChangeEvent.VALUE_CHANGE,VideoValueChangedHandler);
}

function NetStatusHandler(e:NetStatusEvent):void{
	txtInfo.text = "";
	videoMask.visible = txtPercent.visible = txtInfo.visible = false;
	trace(e.info.code);
	switch(e.info.code){
		case "NetStream.Play.StreamNotFound":
			txtInfo.text = "错误:视频文件地址无法访问"
			break;
		case "NetStream.Play.Failed":
			txtInfo.text = "错误:视频播放失败"
			break;
		case "NetStream.Buffer.Empty":
			txtInfo.text = "影片缓冲中...";
			break;
		case "NetStream.Play.Stop":
			//txtInfo.text = "播放已停止";
			break;
		case "NetStream.Seek.InvalidTime":
			//txtInfo.text = "错误:无法跳到指定的时间点播放";
			//trace(e.info.Error);
			//_netStream.pause();
			//btnPlay.visible = true;
			//btnPause.visible = false;			
			break;	
		default:
		break;
	}
	
	if (txtInfo.text.length>0){		
		videoMask.visible = txtPercent.visible = txtInfo.visible = true;		
	}
}

function btnSoundMouseDown(e:MouseEvent) {
	var i:uint=btnSound.currentFrame;
	if (i==1) {
		btnSound.gotoAndStop(2);//切换到静音
		SetVolumn(0);
	} else {
		btnSound.gotoAndStop(1);//切换到有声音
		SetVolumn(silderSound.Value);
	}
}

//设置音量
function SetVolumn(vol:Number):void {
	var _snd:SoundTransform = _netStream.soundTransform;
	_snd.volume = vol;
	_netStream.soundTransform = _snd;
}

//Play按钮点击事件
function btnPlayMouseClick(e:MouseEvent) {
	//切换按钮可用性
	btnPause.visible=true;
	btnPlay.visible=false;
	//开始播放...
	_netStream.resume();
}

//Pause按钮点击事件
function btnPauseMouseClick(e:MouseEvent) {
	//切换按钮可用性
	btnPause.visible=false;
	btnPlay.visible=true;
	//暂停...
	_netStream.pause();
}

//Stop按钮点击事件
function btnStopMouseClick(e:MouseEvent) {
	_netStream.pause();
	_netStream.seek(0);

	//切换播放/暂停按钮状态
	btnPause.visible=false;
	btnPlay.visible=true;
}


//获取视频总持续时间
function MetaDataHandler(data:Object) {
	_duration = data.duration;	
}

function VolumnChangedHandler(e:ValueChangeEvent):void{
	//如果没被禁音,则允许调节音量
	if (btnSound.currentFrame==1){
		SetVolumn(e.NewValue);
	}
}

function VideoValueChangedHandler(e:ValueChangeEvent):void{
	_netStream.pause();
	_netStream.seek(e.NewValue * _duration);
	//_netStream.resume();
}

//进入每帧的处理函数
function EnterFrameHandler(e:Event):void{
	if (_duration>0){
		txtCurrent.text = Math.floor(_netStream.time/60) + ":" + Math.round(_netStream.time%60);
		txtTotal.text = Math.floor(_duration/60) + ":" + Math.round(_duration%60);	
		silderVideo.Value = _netStream.time/_duration;
	}
	if (_netStream.bytesLoaded>0){
		silderVideo.LoadingValue =  _netStream.bytesLoaded / _netStream.bytesTotal;
	}	
	
	//trace(_netStream.bytesLoaded + "/" + _netStream.bytesTotal);
}


function RemoveEnterFrameHandler(){
	if (silderVideo.IsDragging){
		removeEventListener(Event.ENTER_FRAME,EnterFrameHandler);
	}
	else{
		addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
	}
}


function silderVideoMouseDown(e:MouseEvent):void{
	//trace("进度滑块被点击了!");
	removeEventListener(Event.ENTER_FRAME,EnterFrameHandler);
	stage.addEventListener(MouseEvent.MOUSE_UP,stageMouseUpHandler);
}

function stageMouseUpHandler(e:MouseEvent):void{
	addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
	//trace("鼠标MouseUp事件");
	
	if (btnPause.visible){
		_netStream.resume();
	}
	stage.removeEventListener(MouseEvent.MOUSE_UP,stageMouseUpHandler);	
}

init();


目录
相关文章
|
XML 前端开发 数据格式
30个flash交互视频播放器
1 – Customisable YouTube / Vimeo / FLV / MP3 / Image Gallery The best quality of this flash video player is that you do not have to learn the tech...
975 0
|
内存技术 分布式计算 Spark
flash/flex 之 自定义MXML组件
1. 新建 mxml组件 代码如下                         [Bindable]            private var textstr:String = "字符串按钮";            public function set BTNtext(par_...
977 0
|
内存技术
Flash/Flex学习笔记(57):实用技巧
布朗运动: varnumDots:uint=50; varfriction:Number=0.9; vardots:Array; varlife:uint=0; functioninit(){ graphics.
752 0
|
Java 索引 内存技术
Flash/Flex学习笔记(49):3D基础
之前我们所做的动画都是基于x,y二维坐标轴的,在三维动画中我们还需要增加一个垂直于屏幕“向里”或“向外”的Z轴,那么z轴到底是应该向外,还是向里呢?这个其实无所谓,不过为了统一,习惯上通常把z轴约定为向里,即所谓的“右手坐标系” 右手坐标系的得名:伸出右手,让食指、中指、大拇指相互垂直;然后 食指指向x轴正向,中指指向y轴正向,则大拇指所指方向即为z轴正向。
830 0
|
内存技术
Flash/Flex学习笔记(31):对象拖拽与投掷
对象拖拽: 这其实就是以前所学知识:Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) + Flash/Flex学习笔记(23):运动学原理 的综合运用,要提一下的是下面代码中对于EnterFrame的添加与移除操作 package { import flash.
825 0
|
IDE 开发工具 内存技术
Flash/Flex学习笔记(33):如何用As3协同Flash CS IDE控制MovieClip实例
AS3历经若干年的成长,已经完全进化为一门面向对象的(动态)语言,但很多介绍AS3的书籍上往往只注意了AS3语言本身,而淡化了如何跟Flash IDE协同开发。 1.如何在Flash时间轴代码上创建一个外部as文件中定义的MovieClip实例? 假设外部有一个MyClip.
856 0
|
Java 内存技术 Spring
Flash/Flex学习笔记(44):万有引力与粒子系统
万有引用公式: 其中G为万有引力常数   var numParticles:uint=50;//粒子总数 var G:Number=0.03;//万有引力常数 var particles:Array=new Array(numParticles); var bounce:Number=-0.
797 0

热门文章

最新文章