金色的骷髅 发表于 2015-1-15 22:49:27

来谈谈:Flash AS制造LRC歌词同步的具体教程-Flash actionscript

最新的零售版本为AdobeFlashProfessionalCC(2013年发布)。AdobeFlashProfessionalCC为创建数字动画、交互式Web站点、桌面应用程序以及手机应用程序开发提供了功能全面的创作和编辑环境。
相干文章:FlashAS3用于读取LRC同步歌词的类。
1、筹办事情
既然要制造歌词同步程序,起首要筹办一首歌,我们就以“周杰伦-青花瓷”为例。起首要下载这首“青花瓷.mp3”,保留为“C:MyPlayerMusic青花瓷.mp3”。还要下载青花瓷的LRC文件,人人能够到网高低载(地点见附录),将文本内容保留为“C:MyPlayerLRC青花瓷.lrc”。我们的程序(类和FLA)则保留在“C:MyPlayer”文件夹下。
青花瓷.lrc文件:

--------------------------------------------------------------------------------




发送短信18到291199下载该歌曲得手机
青花瓷

素眉勾画秋千话冬风龙转丹 
屏层鸟绘的牡丹一如你打扮
黯然腾喷鼻透过窗苦衷我了然 
宣纸上皱边直尺各一半
油色衬着侍女图由于被掉躲 
而你嫣然的一笑如含苞待放
你的美一缕飘散 
往到我往不了的中央

天正在等烟雨 
而我在等你 
炊烟袅袅升起 
隔江万万里
在高山书刻你房间上的飘影 
就当我为碰见你伏笔
天正在等烟雨 
而我在等你 
月色被打捞起 
掩饰了却局
如传世的青花瓷在单独俊丽 
你眼的笑意
色白花青的景已跃然于碗底 
摹仿宋体题名时却惦念着你
你埋没在药效里一千年的奥密 
急溪里如同羞花沾落地
林外芭蕉 惹咒语 
梦境的铜绿
而我途经那江南小镇的等你
在泼墨山川画里 
你从墨色深处被隐往

--------------------------------------------------------------------------------
人人也能够把这个文本内容复制上去,然后在“C:MyPlayerLRC”下创立一个文本文档,将内容粘贴上往,再将文档保留为“青花瓷.lrc”,注重扩大名是“.lrc”。

2、LRC内容剖析
筹办事情完成了,上面剖析一下这个LRC文件。之以是叫LRC,是由于它是Lyric(歌词)的缩写。这类格局真是一览无余,后面“[]”中的数字暗示厥后歌词的入手下手工夫。比方,“色白花青的景已跃然于碗底”暗示在1分50.25秒时,歌词内容是“色白花青的景已跃然于碗底”。
另有一种情势是“天正在等烟雨”这类情势经常使用于赋格部分(俗称:歌曲的低潮部分),它暗示在03:01.92,02:25.63,00:56.90时的歌词都是“天正在等烟雨”。因为这类情势的存在,使前面的编程稍显庞大,不外不妨,依附列位的伶俐智**


4、LRC的读取与存储转换(利用文档类计划)
1.读取LRC文件,这一步十分复杂与读取一般的文本文件是一样的;
CODE:
publicfunctionLRCPlayer(){
varloader:URLLoader=newURLLoader();
loader.load(newURLRequest("LRC/青花瓷.lrc"));
loader.addEventListener(Event.COMPLETE,LoadFinish);
}
privatefunctionLoadFinish(evt:Event):void{
trace(evt.target.data);
}--------------------------------------------------------------------------------
2.将读取的LRC数据按行支解("
"为换行符),数组的每个元素代表LRC的一行内容;
CODE:
functionLoadFinish(evt:Event):void{
varlist:String=evt.target.data;
varlistarray:Array=list.split("
");
trace(listarray);
}--------------------------------------------------------------------------------
3.在数组中提取每行的工夫及歌词,办理单工夫序列的成绩;(注重!此段代码只作解说,不以使用)
LRC内容以下:
QUOTE:
而你嫣然的一笑如含苞待放
你的美一缕飘散 
往到我往不了的中央
天正在等烟雨 
而我在等你 
炊烟袅袅升起 
隔江万万里代码以下:
CODE:
functionLoadFinish(evt:Event):void{
varlist:String=evt.target.data;
varlistarray:Array=list.split("
");
for(vari=0;i<listarray.length;i++){
varinfo:String=listarray;
//提取每行内容,用变量info保留
varlyric:String=info.substr(10);
//将歌词内容提取到lyric变量中
varctime:String=info.substr(0,10);
//提取工夫序列字串
varntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));
//将工夫字串转换为盘算机可读取的工夫
varobj:Object=newObject();
obj.timer=ntime*1000;
obj.lyric=lyric;
LRCarray.push(obj);
//将工夫与歌词保留到一个Object中,并压进LRCarray数组
trace(obj.timer,obj.lyric);
}
}输入了局:
QUOTE:
43830而你嫣然的一笑如含苞待放
48300你的美一缕飘散
50770往到我往不了的中央
181920天正在等烟雨
183570而我在等你
185920炊烟袅袅升起
187760隔江万万里--------------------------------------------------------------------------------
4.在LRC文件,另有多工夫序列的存在,以是单工夫序列算法不克不及满意实践必要,上面就来办理多工夫序列成绩;
LRC内容以下:
QUOTE:
而你嫣然的一笑如含苞待放
你的美一缕飘散 
往到我往不了的中央
天正在等烟雨 
而我在等你 
炊烟袅袅升起 
隔江万万里代码以下:
CODE:
functionLoadFinish(evt:Event):void{
varlist:String=evt.target.data;
varlistarray:Array=list.split("
");
varreg:RegExp=/[:.]/g;
//创建正则表达式,局限:~
for(vari=0;i<listarray.length;i++){
varinfo:String=listarray;
//提取每行内容,用变量info保留
varlen:int=info.match(reg).length;
//该行具有工夫序列的个数
vartimeAry:Array=info.match(reg);
//将婚配的工夫序列保留到timeAry数组中
varlyric:String=info.substr(len*10);
//依据每一个工夫序列占10个字符,找出歌词内容的出发点
//将歌词提取到lyric变量中
for(vark:int=0;k<timeAry.length;k++){
varobj:Object=newObject();
varctime:String=timeAry;
varntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));
obj.timer=ntime*1000;
obj.lyric=lyric;
LRCarray.push(obj);
trace(obj.timer,obj.lyric);
}
//将工夫序列转换为毫秒并与歌词一同保留为一个数组元素
}
}输入了局:
QUOTE:
43830而你嫣然的一笑如含苞待放
48300你的美一缕飘散 
50770往到我往不了的中央
181920天正在等烟雨 
145630天正在等烟雨 
56900天正在等烟雨 
183570而我在等你 
147910而我在等你 
58990而我在等你 
185920炊烟袅袅升起 
150440炊烟袅袅升起 
60930炊烟袅袅升起 
187760隔江万万里
152250隔江万万里
63490隔江万万里--------------------------------------------------------------------------------
5.将取得的LRCarray数组按肇端工夫排序,这关于顺次读取歌词有主要意义;
CODE:
LRCarray.sort(compare);
privatefunctioncompare(paraA:Object,paraB:Object):int{
if(paraA.timer>paraB.timer){
return1;
}
if(paraA.timer<paraB.timer){
return-1;
}
return0;
}了局以下:
QUOTE:
43830而你嫣然的一笑如含苞待放
48300你的美一缕飘散
50770往到我往不了的中央
56900天正在等烟雨
58990而我在等你
60930炊烟袅袅升起
63490隔江万万里
145630天正在等烟雨
147910而我在等你
150440炊烟袅袅升起
152250隔江万万里
181920天正在等烟雨
183570而我在等你
185920炊烟袅袅升起
187760隔江万万里--------------------------------------------------------------------------------
6.最初,跟着音乐的播放,读取播放工夫段内的歌词。用以后播放工夫与LRCarray中的工夫比拟较,假如以后工夫小于LRCarray.timer的工夫,那末就显现LRCarray.lyric的歌词。为何要显现的歌词呢?好比说以后播放到第500秒,读取的LRCarray.timer工夫是400秒,那末i++。下一次读取的LRCarray.timer工夫是700秒,这时候以后播放工夫小于读取的这个工夫,就申明以后的第500秒仍处于LRCarray.timer的工夫局限内。
CODE:
varlrc_txt:TextField=newTextField();
varLRCarray:Array=newArray();
varsc:SoundChannel;
publicfunctionLRCPlayer(){
lrc_txt.width=500;
lrc_txt.selectable=false;
addChild(lrc_txt);
//歌词在文本lrc_txt中显现
varloader:URLLoader=newURLLoader();
loader.load(newURLRequest("LRC/青花瓷.lrc"));
loader.addEventListener(Event.COMPLETE,LoadFinish);
varsound:Sound=newSound();
sound.load(newURLRequest("Music/青花瓷.mp3"));
sc=sound.play();
//播放声响,并天生sc变量,SoundChannel类的实例
stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);
//及时革新歌词
}
functionSoundPlaying(evt:Event):void{
for(vari=1;i<LRCarray.length;i++){
if(sc.position<LRCarray.timer){
lrc_txt.text=LRCarray.lyric;
break;
//找到歌词,跳出轮回体
}
lrc_txt.text=LRCarray.lyric;
//找不到歌词,申明已超越了最初一句的工夫,因而显现最初一句歌词
}
}5、全体代码(文档类LRCPlayer.as):
CODE:
package{
importflash.display.Sprite;
importflash.net.URLRequest;
importflash.net.URLLoader;
importflash.media.Sound;
importflash.media.SoundChannel;
importflash.events.Event;
importflash.text.TextField;
importflash.system.System;
publicclassLRCPlayerextendsSprite{
varlrc_txt:TextField=newTextField();
varLRCarray:Array=newArray();
varsc:SoundChannel;
publicfunctionLRCPlayer(){
System.useCodePage=true;
lrc_txt.width=500;
lrc_txt.selectable=false;
addChild(lrc_txt);
varloader:URLLoader=newURLLoader();
loader.load(newURLRequest("LRC/青花瓷.lrc"));
loader.addEventListener(Event.COMPLETE,LoadFinish);
varsound:Sound=newSound();
sound.load(newURLRequest("Music/青花瓷.mp3"));
sc=sound.play();
stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);
}
functionSoundPlaying(evt:Event):void{
for(vari=1;i<LRCarray.length;i++){
if(sc.position<LRCarray.timer){
lrc_txt.text=LRCarray.lyric;
break;
}
lrc_txt.text=LRCarray.lyric;
}
}
functionLoadFinish(evt:Event):void{
varlist:String=evt.target.data;
varlistarray:Array=list.split("
");
varreg:RegExp=/[:.]/g;
for(vari=0;i<listarray.length;i++){
varinfo:String=listarray;
varlen:int=info.match(reg).length;
vartimeAry:Array=info.match(reg);
varlyric:String=info.substr(len*10);
for(vark:int=0;k<timeAry.length;k++){
varobj:Object=newObject();
varctime:String=timeAry;
varntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));
obj.timer=ntime*1000;
obj.lyric=lyric;
LRCarray.push(obj);
}
}
LRCarray.sort(compare);
}
privatefunctioncompare(paraA:Object,paraB:Object):int{
if(paraA.timer>paraB.timer){
return1;
}
if(paraA.timer<paraB.timer){
return-1;
}
return0;
}
}
}


6、*无处不在的优化
至此,该程序已能够顺遂实行了,此处只会商一下优化成绩,看不懂能够跳过。
以这段代码为例:
CODE:
functionSoundPlaying(evt:Event):void{
for(vari=1;i<LRCarray.length;i++){
if(sc.position<LRCarray.timer){
lrc_txt.text=LRCarray.lyric;
break;
}
lrc_txt.text=LRCarray.lyric;
}
}假如要举行优化,那末这个for轮回,应当写成:
CODE:
for(vari=1,j=LRCarray.length;i<j;i++){……}如许在实行判别时,不用每次都举行LRCarray.length操纵,该操用于读取数组长度,实行Array类的length办法,属于初级操纵,消费的工夫要比初级操纵多。实在,只需读取一次长度,然后将了局保留在变量j中,每次判别时读取j的值便可。取值与赋值都属于初级其余操纵,速率较快。一样的事理,在
CODE:
if(sc.position<LRCarray.timer){……}中的sc.position在每次判别时都要读取一遍,这时候就应将它在轮回之前保留到一个变量里,这段代码优化后应是如许:
CODE:
functionSoundPlaying(evt:Event):void{
varnow:Number=sc.position;
for(vari=1,j=LRCarray.length;i<j;i++){
if(now<LRCarray.timer){
lrc_txt.text=LRCarray.lyric;
break;
}
lrc_txt.text=LRCarray.lyric;
}
}在我们的文档类中另有几个中央用到了for轮回,请人人依照上述办法自行优化。
实在,代码优化无处不在,个中的学问不乏其人,有乐趣的伴侣能够到我的博客中看一下关于代码优化的总结贴,见附录。

7、附录
1.LRC文件下载地点:
http://lrc.bzmtv.com/
http://www.5ilrc.com/

2.至于MP3的下载,我想人人比我外行,用百度或酷狗都能够。

3.代码优化总结贴地点:
http://www.webjx.com/flash/actionscript-5898.html

4.全部文件包含(歌曲、歌词、LRCPlayer.as、FLA文件)打包下载:
http://www.fs2you.com/zh-cn/files/cf760b0f-01a0-11dd-9174-0014221f3995/

8、停止语
祝贺您保持到了如今,的确内容对照长,同时也触及了一些常识点。实在做法一定不但这一种,以是但愿人人多多发扬客观能动性,分离上述内容持续将这个播放程序做年夜做强。好了,就到这里,再次感激。

可以把它存成AS档做为外部连结档案(如定义ActionScript类则必须在写在as文件里,再通过import加入类),以方便共同工作和更进阶的程序修改。

冷月葬花魂 发表于 2015-1-17 06:01:33

Flash也支持alpha通道,这会使设计者高兴。没有太多的技术性,alpha通道是附加在图像上的信息-允许图像以不同的方式渲染。

若天明 发表于 2015-1-20 14:59:01

缺点也必然会会有的,但是不同的产品有不同的缺点吧,比如说flash建站它的速度会比较慢。

灵魂腐蚀 发表于 2015-1-29 11:47:22

Flash使交互性容易,并且消除了学习某种语言的需要。折中办法是不学语言,同时失去一些功能。但是你仍然可以处理基于用户动作(如鼠标移动或点击)的触发事件,这通常是你需要的所有交互性。

仓酷云 发表于 2015-2-6 00:36:24

时间期限本身就是一个优点,因为它可以让你确定一个祯率。电视每秒刷新屏幕30次,电影每秒刷新屏幕24次。Flash的祯率是可变的。

老尸 发表于 2015-2-14 17:26:35

flash的优缺点可以如何运用呢?

金色的骷髅 发表于 2015-3-4 09:19:09

没有安装FLASH插件的前提下,无法正常显示广告效果。根据调查显示,有3%的互联网用户没有安装shockwave Flash。虽然比例不大,但不能因为这样一个简单的原因而拒绝这些用户。

飘灵儿 发表于 2015-3-11 18:08:24

它包含了下列常见的形式之一或者几种的组合:流媒体、声音、Flash、以及Java、Javascript、DHTML等程序设计语言。  

柔情似水 发表于 2015-3-19 06:29:24

流技术让用户在下载的同时看到动画(与全部下载后再观看相反)。但是这也不是什么新技术 - Web一出现就有这种技术了。

小女巫 发表于 2015-3-27 11:10:00

FLASH的优点~你用眼睛所看到的东西~都能用它来实现~一点不夸张~高楼大厦-花草树木-高山流水-天空白云-阿猫阿狗-一切活的东西都可以容入到FLASH里面
页: [1]
查看完整版本: 来谈谈:Flash AS制造LRC歌词同步的具体教程-Flash actionscript