空间广告
在线情况
楼主
  • 头像
  • 级别
  • 门派
  • 职务总版主
  • 财富1
  • 积分634
  • 经验17284
  • 文章441
  • 注册2008-05-18
flash读取lrc播放器的制作
本程序使用语言as2.0
准备好一个lrc文件,一首mp3,
(我准备了"稻香-周杰伦.lrc" 和 "稻香-周杰伦.mp3")

第一步:读取外部lrc文件
var myLrc:XML = new XML();

myLrc.load("稻香-周杰伦.lrc");

myLrc.ignoreWhite = true;

myLrc.onLoad = function(success:Boolean) {

if (success) {

trace(myLrc);

}

};
发现是乱码:
[00:01.14]µ¾�-�½��
[00:04.44]�»¢��
[00:09.64]�»¢»���
[00:13.76]µ¾�£¬�һ�»��[00:19.45]
[00:31.11]¶���½�¹�̫¶�±§Թ
[00:34.32]µ�¾Ͳ»¸Ҽ���
...
所以我们要在最开始加上一句支持中文代码:
System.useCodepage = true;
 
 
 
第二步:整理xml类中的字符
用toSring()方法转成字符串,赋值给myLrcString这个变量
myLrcString = myLrc.toString();

可以用(trace(myLrcString.length))查看字符长度
测试时发现不但存在有chr(13)还存在有chr(10)
chr(10)笔者也不是很了解,chr(13)是回车符
所以我们要清除它们
//去除chr(10)开始
var st:String = "";
for (i=0; i<myLrcString.length; i++) {
   if (myLrcString.slice(i, i+1) != chr(10)) {
    st = st+myLrcString.slice(i, i+1);
   }
}
myLrcString = st;
//去除chr(10)结束
上面是清除的方法,slice是字符串的一个方法,使用方法请查看帮助
 
 
经过上一章我们得到了一串歌词
里面现在只含有chr(13),也就是回车,还有一些可以看得见的字符(也就是歌词和时间)
现在我们来把字符串以回车划分,也就是一句一句歌词划分出来
然后分别放到数组中去
var lrcArray:Array = new Array();
lrcArray = myLrcString.split(chr(13));
//split()把字符串以某个字符为标准划分段,然后放到数组,可以查看flash帮助了解

有时lrc会出现空行,也就是连续好几个回车,所以我们要清除为空的数组
//清除为空的数组开始
for (i=0; i<lrcArray.length; i++) {
   if (lrcArray[i] == "") {
    lrcArray.splice(i,1);
    i--;//当删除一个数组时,系统会跳过下一个,这时应当返回一个
   }
}
//清除为空的数组结束
现在我们得到了一个数组lrcArray
数组里的每一个值,都是一句歌词,
如:lrcArray[0] = [00:01.14]稻香-周杰伦
 
 
用trace(lrcArray)
[00:01.14]稻香-周杰伦,[00:04.44]刘虎制作,[00:09.64]刘虎回忆童年,[00:13.76]稻香,是一种回忆,[00:19.45],[00:31.11]对这个世界如果你有太多的抱怨,[00:34.32]跌倒了就不敢继续往前走,[00:37.22]为什么人要这么的脆弱堕落,[00:41.66]请你打开电视看看,[00:44.93]多少人为生命在努力勇敢的走下去,[00:47.02]我们是不是该知足,[00:49.48]珍惜一切就算没有拥有,[00:54.13]还记得你说家是唯一的城堡,[00:57.80]随著稻香河流继续奔跑,[01:00.73]微微笑小时候的梦我知道,[01:06.02]不要哭让萤火虫带著你逃跑,[01:09.55]乡间的歌谣永远的依靠,[01:12.43]回家吧回到最初的美好,[01:41.26]不要这黱容易就想放弃,[01:43.37]就像我说的,[01:44.84]追不到的梦想换个梦不就得了,[01:47.80]为自己的人生鲜艳上色,[01:50.10]先把爱涂上喜欢的颜色,[01:53.16]笑一个吧功成名就不是目的,[01:55.89]让自己快乐快乐这才叫做意义,[01:58.65]童年的纸飞机,[02:00.19]现在终於飞回我手里,[02:04.44]所谓的那快乐,[02:05.89]赤脚在田里追蜻蜓追到累了,[02:08.86]偷摘水果被蜜蜂给叮到怕了,[02:11.79]谁在偷笑呢,[02:13.54]我靠著稻草人吹著风唱著歌睡著了,[02:16.64]哦哦午后吉它在虫鸣中更清脆,[02:19.66]哦哦阳光洒在路上就不怕心碎,[02:22.86]珍惜一切就算没有拥有,[02:26.96]☆词 曲周杰伦编曲 林迈可,[02:28.12]还记得你说家是唯一的城堡,[02:31.47]随著稻香河流继续奔跑,[02:34.33]微微笑小时候的梦我知道,[02:39.78]不要哭让萤火虫带著你逃跑,[02:43.10]乡间的歌谣永远的依靠,[02:46.29]回家吧回到最初的美好☆.,[02:51.56]还记得你说家是唯一的城堡,[02:54.79]随著稻香河流继续奔跑,[02:57.68]微微笑小时候的梦我知道,[03:02.78]不要哭让萤火虫带著你逃跑,[03:06.52]乡间的歌谣永远的依靠,[03:09.45]回家吧回到最初的美好,[03:14.50]刘虎回忆童年
每一个数组值:都是时间加上歌词
现在来提起每一句歌词前面的时间,也就是每一句歌词显示的时间
[03:06.52]表示:3分钟06秒52毫秒
把提起的时间放入数组tim:
//开始计算时间
var tim:Array = new Array();
for (i=0; i<lrcArray.length; i++) {
   st = lrcArray[i];
   var st1:Number = Number(st.slice(1, 3));
   var st2:Number = Number(st.slice(4, 6));
   var st3:Number = Number(st.slice(7, 9));
   tim[i] = st1*60000+st2*1000+st3*10;
}
//计算时间结束
trace(tim);
输出为:
1140,4440,9640,13760,19450,31110,34320,37220,41660,44930,47020,49480,54130,57800,60730,66020,69550,72430,101260,103370,104840,107800,110100,113160,115890,118650,120190,124440,125890,128860,131790,133540,136640,139660,142860,146960,148120,151470,154330,159780,163100,166290,171560,174790,177680,182780,186520,189450,194500
 
 
 
后面是怎么把数组的歌词和时间有规律的显示出来
var mySound:Sound = new Sound();
mySound.loadSound("sound.mp3",true);
mySound.start();
mySound.onSoundComplete = function() {
   mySound.start();
};
total = mySound.getBytesTotal();
loaded = mySound.getBytesLoaded();
//以下是歌词显示的代码,花了我很长时间
//一直处在逻辑混乱的状态,那天晚上0.38分才搞定
i = 0;
_root.onEnterFrame = function() {
   //第一次显示,提前一秒,也就为什么加1000的原因,当i=0很重要,要不然...
   if ((mySound.position+1000)>tim[0] && i == 0) {
    soundTxt1.text = lrcArray[i].slice(10);
    soundText1.textColor = 0xFF9900;
    soundTxt2.text = lrcArray[i+1].slice(10);
    i++;
   }
   //如果开始唱第二句,那么开始换第一句的歌词
   if (mySound.position>tim[i] && i%2 == 1) {
    i++;
    soundTxt1.text = lrcArray[i].slice(10);
    //soundText1.textColor = 0xFFFFFF;
    //soundText2.textColor = 0xFF9900;
   }
   //如果开始唱第一句,也就是上面那句,那么开始换下面歌词
   if (mySound.position>tim[i] && i%2 == 0) {
    i++;
    soundTxt2.text = lrcArray[i].slice(10);
    //soundText1.textColor = 0xFF9900;
    //soundText2.textColor = 0xFFFFFF;
   }


里面还加了一些效果,偷懒了,我把原文件放上来
因为mp3比较大,想测试的网友,自己下载一首"稻香周杰伦.mp3"
mp3名字一定要是:稻香周杰伦.mp3
 
 
 
风之帝国校务管理系统
loading...
loading...
loading...
loading...
loading...
loading...
loading...
回复帖子 注意: *为必填项
*验证信息 用户名 密码 注册新用户
*帖子名称
内容(最大50K)




其它选项 Alt+S快速提交
 


Powered by LeadBBS 9.1 licence.
Page created in 0.0781 seconds with 2 queries.