功能:
1、通过浏览来加载外部的mp3歌曲,可以加载一首,也可以加载多首歌曲。
2、同时加载相同文件名的 .lrc 格式歌词。这是标准格式的歌词文本,网上到处可下,不用转格式,直接读取。
3、用组件显示mp3歌曲列表。
4、播放控制,可在列表中进行,也可用常规按钮。有“播放” ”暂停” “停止” “上一首” “下一首” “循环模式” 。
5、有声道控制,立体声,混和声(L+R),L+L,R+R等模式,可模拟卡拉OK功能。
6、播放时间进度显示。歌曲时间和播放时间显示。
7、歌词同步显示,并有演唱进度色条(这个同步不理想,若要理想,需要调整歌词文本文件)。
主要使用了:
声音类、上载文件类、组件List。注意要Flash8才能正常播放。
先发效果swf文件上来,下载到本机。准备好mp3和相应歌词文件,注意:歌词要与mp3文件同名,不同的扩展名。歌词是.lrc,歌曲是.mp3,并放在相同的文件夹里。swf与歌曲可以不在相同文件夹。
打开swf后先用浏览按钮找到歌曲,打开就可以播放。
![]() |
http://www.csser.com/upimg/soft/lrcmp3.fla |
System.useCodepage = true;//使用操作系统编码
//通过浏览来加载外部的mp3歌曲
//import flash.net.FileReference;
import flash.net.FileReferenceList;
import mx.styles.CSSStyleDeclaration;
var SouMc:MovieClip=this.createEmptyMovieClip("SouMc",100);//装载声音的MC
var Sou:Sound=new Sound(SouMc);
var LoadTxt:LoadVars = new LoadVars();
var TxtArray:Array = [];//存放歌词的数组
var mylist:Array = [];//存放歌曲列表的数组
var TxtArr:Array;
var SouT:Number=0;//播放头位置标记
var LoadLrcSouOk:Boolean=false;//加载成功标志
歌词.进度._width=0;
歌词.ii=0;//歌词指针
//列表组件样式
List_mp3.vScrollPolicy="auto";
_global.styles.ScrollSelectList.setStyle("color",0xFFFF66);//文本颜色
_global.styles.ScrollSelectList.setStyle("backgroundColor",0x990000);//背景颜色
_global.styles.ScrollSelectList.setStyle("borderColor",0xFFFF00);//边框色
_global.styles.ScrollSelectList.setStyle("rollOverColor",0xFFFFCC);//鼠标滑过高亮色
_global.styles.ScrollSelectList.setStyle("textRollOverColor",0xCC0000);//鼠标滑过文本色
var listener:Object = new Object();//共用侦听对象
listener.change = function(evt){
SouStop();
listNum=evt.target.selectedIndex;
SouLoad(listNum);
}
List_mp3.addEventListener("change", listener);
prev_btn.enabled=false;
next_btn.enabled=false;
var listNum:Number;//歌曲指针
var listMaxNum:Number;//歌曲数
var allTypes:Array = [];
var 浏览类型:Object = new Object();
浏览类型.description = "选择歌曲(*.mp3)";
浏览类型.extension = "*.mp3";
allTypes.push(浏览类型);
var fileRef:FileReferenceList = new FileReferenceList();
listener.onSelect = function(file:FileReferenceList) {
mylist = file.fileList;//获取选中文件数组
listNum = 0;
listMaxNum = mylist.length;
List_mp3.removeAll();//清空列表
for(i=0;i<listMaxNum;i++){
List_mp3.addItem((i+1)+"."+mylist[i].name,i);//显示播放列表
}
SouLoad(0); //立即加载第一曲
};
fileRef.addListener(listener);
//歌曲浏览按钮
op_mp3.onRelease = function() {
SouStop();
fileRef.browse(allTypes);//触发浏览
};
//下一首曲
next_btn.onRelease = function() {
listNum++;
SouStop();
SouLoad(listNum);
};
//上一首曲
prev_btn.onRelease = function() {
listNum--;
SouStop();
SouLoad(listNum);
};
//歌词加载处理
LoadTxt.onData = function(data) {
if(data!=undefined){
TxtArr = data.split("\r\n"); //以回车换行符为界分开存入数组
//读出lrc文件各种信息
for(var i=0;i<TxtArr.length;i++){
if(TxtArr[i].indexOf("[ti:")==0){
TxtArray.ti = TxtArr[i].slice(4,TxtArr[i].indexOf("]"));//歌曲名
}else if(TxtArr[i].indexOf("[ar:")==0){
TxtArray.ar = TxtArr[i].slice(4,TxtArr[i].indexOf("]"));//演唱者
}else if(TxtArr[i].indexOf("[al:")==0){
TxtArray.al = TxtArr[i].slice(4,TxtArr[i].indexOf("]"));//专集名(唱片名)
}else if(TxtArr[i].indexOf("[by:")==0){
TxtArray.by = TxtArr[i].slice(4,TxtArr[i].indexOf("]"));//出品人
}else if(TxtArr[i].indexOf("[offset:")==0){
TxtArray.offset = TxtArr[i].slice(8,TxtArr[i].indexOf("]"));//歌词偏移量
}else if(TxtArr[i].indexOf("[")==0 && TxtArr[i].indexOf("]")==9){
TxtArr[i]=TxtArr[i].split("]");//把时间和歌词分开。
for(j=0;j<TxtArr[i].length-1;j++){
TxtArray.push([Number(TxtArr[i][j].slice(1,3))*60000+Number(TxtArr[i][j].slice(4,6))*1000+Number(TxtArr[i][j].slice(7))*10,TxtArr[i][TxtArr[i].length-1]]);
}
}
}
TxtArray.sortOn("0",16);//按时间顺序排序歌词数组
歌词.txt.text=TxtArray.ti;
dir_lrc.text="歌曲名:"+TxtArray.ti+"\r\n演唱者:"+TxtArray.ar+"\r\n唱片名:"+TxtArray.al+"\r\n出品人:"+TxtArray.by
lrc_Sou();//歌词与歌曲匹配吗?
}else{
歌词.txt.text="歌词加载失败!";
}
}
//加载外部MP3后处理
Sou.onLoad = function(success:Boolean) {
if (success) {
//trace(Math.floor(Sou.duration/60000)+":"+Math.floor(Sou.duration%60000/1000)+"."+Sou.duration%60000%1000);//总时间
更新();
LoadLrcSouOk=false;
lrc_Sou();//歌词与歌曲匹配吗?
}else{
_root.dir_lrc.text="MP3加载失败!";
}
};
//开始播放
SouPlay.onPress=function(){
更新();
}
//暂停
SouPause.onPress=function(){
//trace(Math.floor(Sou.position/60000)+":"+Math.floor(Sou.position%60000/1000)+"."+Sou.position%60000%1000;//输出播放头位置,写歌词时间用。
if(SouT!=0){
SouPlay.enabled=true;
Sou.stop();
delete SouMc.onEnterFrame;
}
}
//停止
SouStopBtn.onPress=function(){
SouStop();
}
//循环模式
z_btn.onPress=function(){
this.play();
}
//Sou_LR声道转换
var 左声道:Object={ll:100,lr:0,rr:0,rl:100};
var 右声道:Object={ll:0,lr:100,rr:100,rl:0};
var 混合声:Object={ll:50,lr:50,rr:50,rl:50};
var 立体声:Object={ll:100,lr:0,rr:100,rl:0};
Sou_LR.onPress=function(){
if(this._currentframe==1){
Sou.setTransform(左声道);
this.gotoAndStop(2);
}else if(this._currentframe==2){
Sou.setTransform(右声道);
this.gotoAndStop(3);
}else if(this._currentframe==3){
Sou.setTransform(混合声);
this.gotoAndStop(4);
}else if(this._currentframe==4){
Sou.setTransform(立体声);
this.gotoAndStop(1);
}
}
//播放完毕
Sou.onSoundComplete = function() {
SouStop();
if(z_btn._currentframe==1){
(listNum>=listMaxNum-1)?listNum=0:listNum++;
SouLoad(listNum);
}else if(z_btn._currentframe==2){
if(listNum<listMaxNum-1){
listNum++;
SouLoad(listNum);
}
}
}
SouDir(Sou.position);
//停止播放函数,进行一些复位工作
function SouStop(){
delete SouMc.onEnterFrame;
SouT=0;
Sou.stop();
SouPlay.enabled=true;
SouDir(SouT);
_root.歌词.txt.text=TxtArray[0][1];
_root.歌词.进度._width=0;
歌词.ii = 0;
}
//加载新歌曲
function SouLoad(Num:Number){
LoadLrcSouOk=false;
TxtArray=[];
prev_btn.enabled=(listNum<=0)?false:true;
next_btn.enabled=(listNum>=listMaxNum-1)?false:true;
List_mp3.selectedIndex=Num;
LoadTxt.load("/"+mylist[Num].name.slice(0,-4)+".lrc");//加载歌词文本
Sou.loadSound("/"+mylist[Num].name, false);//加载外部MP3
dir_lrc.text=mylist[Num].name;
}
//有关声音信息显示的函数,传入参数:当前声音位置
function SouDir(t):Void{
if(Sou.duration!=undefined){
时间.text=Math.floor(t/60000)+":"+Math.floor(t%60000/1000)+"/"+Math.floor(Sou.duration/60000)+":"+Math.floor(Sou.duration%60000/1000);//显示播放时间:当前位置/总时间
}else{
时间.text="";
}
mcb._width=t/Sou.duration*_root.mca._width;//进度条
}
//更新
function 更新():Void{
SouPlay.enabled=false;
Sou.start(SouT/1000);//从指定位置开始播放
SouMc.onEnterFrame = function() {
SouT=Sou.position;//更新播放头位置标记
SouDir(SouT);
//更新歌词显示
for(var i=0;i<TxtArray.length;i++){
if(Number(TxtArray[i][0])<=SouT && Number(TxtArray[i+1][0])>SouT && 歌词.ii!=i){
歌词.ii = i;
_root.歌词.txt.text=TxtArray[i][1];
}
}
_root.歌词.进度._width=(SouT-Number(TxtArray[歌词.ii][0]))/(Number(TxtArray[歌词.ii+1][0])-Number(TxtArray[歌词.ii][0]))*歌词.txt.textWidth;
}
}
//歌词与歌曲匹配检查
function lrc_Sou(){
if(LoadLrcSouOk){
if(Sou.duration<=TxtArray[TxtArray.length-1][0]||Sou.duration-60000>TxtArray[TxtArray.length-1][0]){
_root.歌词.txt.text="歌词与歌曲不匹配!";
_root.dir_lrc.text="歌词与歌曲不匹配!";
TxtArray=[];
}else{
TxtArray.push([Sou.duration,"结束"]);
}
}else{
LoadLrcSouOk=true;
}
}
stop();
★LV类基础讲解 这里我主要围绕我的教程进行讲解,区别有些全盘灌输的教程,我将有真对性的着重讲此类的两个方法和一个事
★这两天利用晚自习做了一个非常简易的涂鸦板,就是能画线条能保存重放的那种,其实这是我专门为火山之家开发的签名板。由
Flash360度全景演示: http://www.csser.com/upimg/media/panorama.swf Flash360度全景源代码: http://www.csser.com/upi
因为前段时间Photoshop CS3 Beta的发布,业界掀起了关于Adobe CS3的狂热讨论,国外的博客、论坛里挤满了来自各国的设计师
官方地址: http://blog.deconcept.com/swfobject/ 目前最新版本:SWFObject 1.3 下载地址: http://blog.deconcept.com/s
Flash9的升级主要体现在 编程功能上。 Flash9 将与 photoshop cs3 的结合更加紧密,在导入psd文件的时候将方便很多 。 工
要求:绝对定位,而且要将flash透明底. /*把图片从文档流中拖出,然后可以用top,left,right,bottom来对图片的绝对定位*/ pos
■■■对象数组 比如要构建一个有很多属性的数组,简单的可以这样做: 2004 代码: var a:Array = new Array(); for (var