解析lrc及srt.docx_第1页
解析lrc及srt.docx_第2页
解析lrc及srt.docx_第3页
解析lrc及srt.docx_第4页
解析lrc及srt.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AS3对LRC歌词的解析2010-01-10 上午- AS相关- as3 - lrc MP3播放器的Demo完成已经一些日子,早想写下一点自己的心的,但是因为工作比较忙,所以耽误了,现在补上:首先在读取LRC歌词文件的时候,很多人用AS3第一选择会是loader,但是会出现中文字符编码的问题,而为了避免这个问题的出现,选择URLStream是个不错的选择:PLAIN TEXTACTIONSCRIPT: 1. public function loadLRC(url:String):void2. 3. this._stream = new URLStream();4. this._stream.addEventListener(Event.COMPLETE,onLoadComplete);5. var req:URLRequest = new URLRequest(url);6. this._stream.load(req);7. 随后我们对数据读取结果进行处理PLAIN TEXTACTIONSCRIPT: 1. private function onLoadComplete(evt:Event):void2. 3. var temp:String = 4. this._stream.readMultiByte(this._stream.bytesAvailable,”gb2132);5. this.lrcCheck(temp);6. 上面的onLoadComplete中首先对数据进行gb2132的编码转换,这样可以避免中文字符乱码的问题,lrcCheck这个方法则是处理数据的核心PLAIN TEXTACTIONSCRIPT: 1. private function lrcCheck(lrcStr:String):void2. 3. _model.MUSIC_LRC.removeAll();4. var tempArr:Array = lrcStr.split(rn);5. for(var i:int;i 6. var tempStr:String = tempArr.replace(“,);7. var tempA:Array = tempStr.split(“);8. for(var j:uint=0;j 9. var tempB:Array = tempAj.split(“:”);10. switch(tempB0)11. 12. case “ti”:13. this.title = tempB1;14. break;15. case “ar”:16. this.author = tempB1;17. break;18. case “al”:19. this.list = tempB1;20. break;21. case “by”:22. this.user = tempB1;23. break;24. case “offset”:25. break26. default:27. var tempTime:int = 0;28. var obj:Object = new Object();29. tempB0 = tempB0.replace(“,);30. tempTime += parseInt(tempB0)*60000;31. tempTime += tempB1*1000;32. obj.head = tempTime;33. obj.content = tempAtempA.length-1;34. _model.MUSIC_LRC.addItem(obj);35. break;36. 37. 38. 39. var _sort:Sort = new Sort();40. _sort.fields = new SortField(head);41. _model.MUSIC_LRC.sort=_sort;42. _model.MUSIC_LRC.refresh();43. 因为自己之前的设想是歌词存储到数组里面,由于程序采取单模式,即临时数据保存在model里面;首先按照“rn”进行分割,然后去除数据中的,因为我觉得这个符号对于自己的处理没有什么用处,后面的分割用来进行;而这样分割的原因还有一个因素,那就是歌词的格式可能是这样的:01:05.0103:01.80好多年没有再一次翻开它这就是LRC的复试歌词,以来分割可以将 01:05.01这样的时间独立存储到数组里面,而在所有数据都存储完毕后,用PLAIN TEXTACTIONSCRIPT: 1. var _sort:Sort = new Sort();2. _sort.fields = new SortField(head);3. _model.MUSIC_LRC.sort=_sort;4. _model.MUSIC_LRC.refresh(); 这段程序,对数组进行重新排序,规则则按照head,也就是时间排序,这样, 01:05.0103:01.80好多年没有再一次翻开它的数据就变成了: 01:05.01好多年没有再一次翻开它和 03:01.80好多年没有再一次翻开它两条不同数据,而对于sort的具体用法,请大家查看Flash的帮助手册。好了今天写到这里,后面会对歌词数据的同步进行简单的总结。今天心情不错,用FLASH写了一个用于读取LRC同步歌词的类,只要25行代码,完全用是用FLASH的字符串操作来分析标签的。下面就是这个类: 复制内容到剪贴板 代码:package LRC public class readlrc public function readlrcastime(mp3playtime:Number,gc:String):String var qsd:int;/起始点var fhz:String; for (var j:int=0; j gc.length; j+) if (gc.charCodeAt(j) = 58) if (int(gc.slice(j - 2,j) * 60 + int(gc.slice(j + 1,j + 3) = mp3playtime) var i:int=0;do i+; if (gc.charCodeAt(j + i) = 93) qsd=j + i; if (gc.charCodeAt(j + i) = 13) fhz=gc.slice(qsd + 1,j + i); while (gc.charCodeAt(j + i) != 13&j+i return fhz; 将此文件保存为readlrc.as。注意:一定要把此AS文件放入一个名为LRC的文件夹中,才可以使用。下面就用一个小示例来说明如何用这个类,新建一个AS文件,写入以下代码: 复制内容到剪贴板 代码:package import flash.display.MovieClip;import flash.events.Event;import .URLLoader;import .URLRequest;import flash.media.Sound; import flash.media.SoundChannel; import flash.system.System; import flash.text.TextField;import LRC.readlrc; public class mp3 extends MovieClip private var lrcreq:URLRequest=new URLRequest(日不落.lrc);private var mp3url:URLRequest=new URLRequest(日不落.mp3); private var mymp3:Sound=new Sound(); private var channel:SoundChannel=new SoundChannel();private var lrcurl:URLLoader=new URLLoader(); private var tbgc:String;private var mylrc:readlrc=new readlrc(); System.useCodePage=true; public function mp3() mymp3.load(mp3url);channel=mymp3.play();lrcurl.load(lrcreq);lrcurl.addEventListener(Event.COMPLETE,loaded); private function enterframe(event:Event) try gc_txt.text=mylrc.readlrcastime(int(channel.position/1000),tbgc); catch (error:Error) / private function loaded(event:Event) tbgc=String(event.target.data);addEventListener(Event.ENTER_FRAME,enterframe);保存此文件为mp3.as。写完后,我们还需要一个FLA文件来编译这些代码,新建一个FLA文件,名字随意,在场景中拖出一个动态文本域,实例名称填写gc_txt,在FLA文件的文档类中填写mp3,将此FLA文件与mp3.as文件,日不落.mp3文件,日不落.lrc文件和名为LRC的文件夹放入同一个目录下,测试影片,就可以看到效果了。as3.0正则处理lrc1. package 2. import flash.display.*; 3. import flash.events.*; 4. import .*; 5. import flash.utils.*; 6. 7. import SingleLineLyrics; 8. 9. public class LyricsFormat /*extends EventDispatcher*/*/ 10. 11. private var path:String; 12. private var AllLineLyrics:Array; 13. 14. /歌曲信息; 15. public var title:String; 16. public var autor:String; 17. public var album:String; 18. public var by:String; 19. 20. /事件类,我就不写了, 21. public var onComplete:Function; 22. 23. 24. /* *接收一个路径上的lrc; */ 25. public function LyricsFormat(path:String) 26. if(path=null) 27. throw new Error(必须要有至少一个参数); 28. 29. AllLineLyrics=new Array(); 30. 31. var loader:URLLoader=new URLLoader(); 32. loader.dataFormat=URLLoaderDataFormat.TEXT; 33. loader.addEventListener(Event.COMPLETE,completeHander); 34. 35. var request:URLRequest=new URLRequest(); 36. request.url=path; 37. loader.load(request); 38. 39. 40. /* *加载完成; */ 41. function completeHander(event:Event):void 42. 43. var loader:URLLoader=URLLoader(event.target); 44. bulid(loader.data) 45. loader.removeEventListener(Event.COMPLETE,completeHander); 46. 47. 48. 49. /* *开始进行比对.存储; */ 50. function bulid(data:String) 51. 52. title=this.selectSingle(/ti:(.+)/i,data,标题:); 53. autor=this.selectSingle(/ar:(.+)/i,data,歌手:); 54. album=this.selectSingle(/al:(.+)/i,data,专辑:); 55. by=this.selectSingle(/by:(.+)/i,data,制作:); 56. 57. trace(title,autor,album,by); 58. 59. 60. var RE:RegExp=/nd+:.+rn*/img; 61. var Lyrics:Array=data.match(RE); 62. 63. for each(var i:String in Lyrics) 64. var singleLineTime:String=this.selectSingle(/(.+).*/,i); 65. var singleLineTimeArray:Array=singleLineTime.split(); 66. var singleLineText:String=this.selectSingle(/.+(.*)/,i); 67. 68. for each(singleLineTime in singleLineTimeArray) 69. 70. var LineTimeArray:Array=singleLineTime.split(:); 71. 72. var lineTime:Number=Number(LineTimeArray0)*60*1000+Number(LineTimeArray1)*1000; 73. 74. AllLineLyrics.push(new SingleLineLyrics(lineTime,singleLineText); 75. 76. 77. 78. 79. AllLineLyrics.sort(this.Equals); 80. 81. /触发; 82. this.onComplete(); 83. 84. 85. /* *进行排序比较; */ 86. public function Equals(a,b) 87. return SingleLineLyrics(a).Equals(b); 88. 89. 90. /* *返回所需数组; */ 91. public function toArray():Array 92. 93. return this.AllLineLyrics; 94. 95. 96. /* *用正则选择单个所需内容; */ 97. function selectSingle(RE:RegExp,data:String,typeS:String=):String 98. if(RE.test(data) 99. return typeS+RE.exec(data)1; 100. 101. /没有记录此项; 102. return ; 103. 104. 105. 106. 这几天CSDN的通栏广告放着正则表达式培训的广告。正则表达式这玩意很有意思,在AS3中,也新增了正则表达式。正则表达式描述用于查找和处理字符串中的匹配文本的模式。正则表达式类似于字符串,但是可以包含特殊代码以描述模式和重复。切记,不同的编程环境实现正则表达式的方式也不同,所以,从别的地方看过来的正则表达式在AS3中未必合用。具体的正则表达式语法规则请查看帮助文档。在网络上没看到过AS3正则表达式写的LRC歌词分析程序,下面,就给出一段使用正则表达式来分析LRC格式歌词的程序。function lrc(str:String):void. var results:Array; results = str.match(/ar:(.+)/i); var ar:String = results ? results1 : ; results = str.match(/ti:(.+)/i); var ti:String = results ? results1 : ; results = str.match(/al:(.+)/i); var al:String = results ? results1 : ; results = str.match(/by:(.+)/i); var by:String = results ? results1 : ; results = str.match(/offset:(.+)/i); var offset:int = results ? int(results1) : 0; results = str.match(/d+:.+ */ig); if (!results) . results = str.match(/d+:.+ */ig); if (!results) . return; var gc:Array = new Array(); for (var i:int = 0; i results.length; i+) . var ln:String = resultsi; var tm:String = ln.match(/(.+).*/)1; var wd:String = ln.match(/.+(.*)/)1; var ts:Array = tm.split(); for each (var t:String in ts) . var c:Array = t.split(:); gc.push(.time:int(c0*60+c1)*1000), word:wd); gc.sortOn(time, Array.NUMERIC); for each (var g:Object in gc) . trace(时间:,g.time, 毫秒,歌词:, g.word); 使用LRC歌词和SoundMixer配合,我们就能够开发出很好的音乐播放器了。 本文来自CSDN博客,转载请标明出处:/l_yong/archive/2008/01/07/2028842.aspx1. /加载歌词varlrcUrl:String=xml.itemcurrIndex.lrc;if(lrcUrl!=null&lrcUrl!=)varlrc:URLLoader=newURLLoader();/lrc.dataFormat=URLLoaderDataFormat.VARIABLES;lrc.load(newURLRequest(lrcUrl);lrc.addEventListener(Event.COMPLETE,LRC_Complete);lrc.addEventListener(IOErrorEvent.IO_ERROR,LRC_IOError);lrcArr=null;outPutLRCString=;startIndexOf=0;txtLrc.text=; 2. 然后在加载完成的事件里,我们能得到lrc文本字符串,这时候我们需要对字符串进行处理,把它转换成一个Array数组,函数方法如下: 3. 4. publicfunctiongetLRCArray(lrc:String):ArrayvarlrcArr:Array=newArray;lrc+=r;for(vari:int=0;ilrc.length;i+)vartime:Number=0;if(lrc.charAt(i)=:)time=Number(lrc.slice(i-2,i)*60+Number(lrc.slice(i+1,i+3);if(String(time)!=NaN)varj:uint=0;varstartIndex:uint=0;varendIndex:uint=0;doj+;if(lrc.charAt(i+j)=)startIndex=i+j+1;while(i+j0)varsec:Number=int(channel.position/1000);for(varj:int=0;jlrcArr.length;j+)if(lrcArrj0=sec)varcurrentLrc:String=lrcArrj1;if(currentLrc!=this.currLrc.text)currLrc.text=currentLrc;/高亮显示,先清空之前高亮部分vartr:TextRange=newTextRange(txtLrc);tr.color=this.getStyle(color);varbeginIndex:int=this.outPutLRCString.indexOf(currentLrc,startIndexOf);startIndexOf+=currentLrc.length;varendIndex:int=beginIndex+currentLrc.length;tr.beginIndex=beginIndex;tr.endIndex=endIndex;if(tr.text!=)tr.color=yellow;/设置滚动条位置this.txtLrc.verticalScrollPosit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论