as3.0正则处理lrc

 

  1. package{  
  2.     import flash.display.*;  
  3.     import flash.events.*;  
  4.     import flash.net.*;  
  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=/\n\[\d+:.+\][^\[\r\n]*/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(LineTimeArray[0])*60*1000+Number(LineTimeArray[1])*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.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package { import flash.display.Sprite; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.net.URLRequest; import flash.net.URLLoader; import flash.events.Event; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import flash.utils.ByteArray; import flash.system.System; import flash.net.*; import flash.ui.*; import flash.system.*; public class Main extends Sprite { private var spectrum:Sprite; private var sound:Sound; private var schannel:SoundChannel; private var lrcLoader:URLLoader; private var info_txt:TextField; private var id3_txt:TextField; private var byteArray:ByteArray; private var lrcArray:Array; public function Main() { init(); } //////////////////////////////////////////////////////////////////// ////// 初始化 ////// ////////////////////////////////////////////////////////////////// private function init():void { System.useCodePage = true; Security.allowDomain("*"); sound = new Sound ; sound.load(new URLRequest("醉酒歌.mp3")); schannel = sound.play(); ////////////////////////////////////////////////// lrcLoader = new URLLoader ; lrcLoader.load(new URLRequest("《醉酒歌》.lrc")); /////////////////////////////////////////////////; info_txt = new TextField ; info_txt.height = 20; info_txt.y = 100; info_txt.selectable = false; info_txt.background = true; info_txt.backgroundColor = 0xFF9900; info_txt.defaultTextFormat = getFormat(); this.addChild(info_txt); id3_txt = new TextField ; id3_txt.width = 300; id3_txt.selectable = false; id3_txt.defaultTextFormat = getFormat(); this.addChild(id3_txt); /////////////////////////////////////////////////; spectrum = new Sprite ; spectrum.x = 10; spectrum.y = 250; this.addChild(spectrum); ////////////////////////////////////////////////; byteArray = new ByteArray ; lrcArray = new Array ; addEvents(); } //////////////////////////////////////////////////////////////////// ////// 设置文本格式 ////// ////////////////////////////////////////////////////////////////// private function getFormat():TextFormat { var textFmt:TextFormat = new TextFormat ; textFmt.align = TextFieldAutoSize.LEFT; textFmt.font = "Arial"; textFmt.color = 0x000000; textFmt.size = 14; return textFmt; } //////////////////////////////////////////////////////////////////// ////// 添加事件 ////// ////////////////////////////////////////////////////////////////// private function addEvents():void { sound.addEventListener(Event.SOUND_COMPLETE,soundCompleteHandler); sound.addEventListener(Event.ID3,id3InfoHandler); lrcLoader.addEventListener(Event.COMPLETE,loadCompleteHandler); stage.addEventListener(Event.ENTER_FRAME,soundPlayingHandler); this.addEventListener(Event.ENTER_FRAME,creatSpectrum); } private function soundCompleteHandler(event:Event):void { stage.removeEventListener(Event.ENTER_FRAME,soundPlayingHandler); this.removeEventListener(Event.ENTER_FRAME,creatSpectrum); } private function id3InfoHandler(event:Event):void { var tar:Sound = event.target as Sound; id3_txt.text = "歌名:" + tar.id3.songName + "\n" + "歌手:" + tar.id3.artist + "\n" + "专辑:" + tar.id3.album; } //////////////////////////////////////////////////////////////////// ////// 读取歌词信息 ////// ////////////////////////////////////////////////////////////////// private function loadCompleteHandler(event:Event):void { var lrclist:String = event.target.data; var lrcArr:Array = lrclist.split("\n"); var reg:RegExp = /\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g; for (var i:int = 0; i < lrcArr.length; i++) { var lrcStr:String = lrcArr[i]; var len:int = lrcStr.match(reg).length; var timeArr:Array = lrcStr.match(reg); var lyrics:String = lrcStr.substr((len * 10)); for (var t:int = 0; t < timeArr.length; t++) { var timeS:String = timeArr[t]; var timeN:Number = (((Number(timeS.substr(1,2)) * 60) + Number(timeS.substr(4,5))) * 1000); var object:Object = new Object ; object.timer = timeN; object.lrc = lyrics; lrcArray.push(object); } } lrcArray.sort(compare); } ////////////////////////////////////////////////////////////////////; ////// 歌词歌曲同步 ////// /////////////////////////////////////////////////////////////////// private function soundPlayingHandler(event:Event):void { for (var i:int = 1; i < lrcArray.length; i++) { if (schannel.position < lrcArray[i].timer) { info_txt.text = "歌词:" + lrcArray[i - 1].lrc; break; } info_txt.text = "end:" + lrcArray[lrcArray.length - 1].lrc; } info_txt.width = info_txt.textWidth + 5; } //////////////////////////////////////////////////////////////////// ////// 创建频谱 ////// /////////////////////////////////////////////////////////////////// private function creatSpectrum(event:Event):void { SoundMixer.computeSpectrum(byteArray,true); spectrum.graphics.clear(); spectrum.graphics.lineStyle(0,0x666666); spectrum.graphics.beginFill(0x666666); spectrum.graphics.moveTo(0,0); for (var i:int = 0; i < 256; i += 5) { var n:Number = byteArray.readFloat() * 100; spectrum.graphics.drawRect(i,0,3, - n); } } ////////////////////////////////////////////////////////////////////; ////// 比较函数 ////// /////////////////////////////////////////////////////////////////// private function compare(pareA:Object,pareB:Object):int { if (pareA.timer > pareB.timer) { return 1; } if (pareA.timer < pareB.timer) { return -1; } return 0; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值