AS3 歌词同步
這里實例素材:
我們不一樣.lrc
我們不一樣.mp3
?
歌詞同步其實就是靠lrc文本文件,打開它,可以看到時間點和對應的歌詞。
打開lrc內容如下:
[ti:我們不一樣]
[ar:大壯]
[al:]
[by:錯愛QQ]
[t_time:(04:30)]
[00:00.00]歌詞千尋 www.lrcgc.com
[00:01.11]我們不一樣
[00:05.07]演唱:大壯
[00:08.26]詞曲:高進
[00:11.29]編曲:張亮
[00:14.85]縮混:侯春陽
[00:20.04]
[00:34.81]這么多年的兄弟
[00:37.27]有誰比我更了解你
[00:41.52]太多太多不容易
[00:43.90]磨平了歲月和脾氣
[00:48.35]時間轉眼就過去
[00:50.90]這身后不散的筵席
[00:54.52]只因為我們還在
[00:57.39]心留在原地
[00:59.39]
[01:01.41]張開手需要多大的勇氣
[01:08.37]這片天你我一起撐起
[01:15.10]更努力只為了我們想要的明天
[01:21.85]好好的這份情好好珍惜
[01:26.81]
[01:28.85]我們不一樣
[01:31.77]每一個人都有不同的境遇
[01:35.83]我們在這里在這里等你
[01:42.27]我們不一樣
[01:45.26]雖然會經歷不同的事情
[01:49.48]我們都希望來生還能相遇
[01:55.28]
[01:57.29]這么多年的兄弟
[01:59.85]有誰比我更了解你
[02:04.12]太多太多不容易
[02:06.51]磨平了歲月和脾氣
[02:10.73]時間轉眼就過去
[02:13.30]這身后不散的筵席
[02:16.94]只因為我們還在
[02:19.64]心留在原地
[02:23.76]張開手需要多大的勇氣
[02:30.51]這片天你我一起撐起
[02:36.66]更努力只為了我們想要的明天
[02:44.16]好好的這份情好好珍惜
[02:49.19]
[02:51.26]我們不一樣
[02:53.81]每一個人都有不同的境遇
[02:58.14]我們在這里在這里等你
[03:04.87]我們不一樣
[03:07.49]雖然會經歷不同的事情
[03:11.80]我們都希望來生還能相遇
[03:17.44]
[03:34.16]我們不一樣
[03:36.91]每一個人都有不同的境遇
[03:40.73]我們在這里在這里等你
[03:47.83]我們不一樣
[03:50.50]雖然會經歷不同的事情
[03:54.63]我們都希望來生還能相遇
[04:01.18]我們不一樣
[04:04.21]雖然會經歷不同的事情
[04:08.36]我們都希望來生還能相遇
[04:15.23]我們都希望來生還能相遇
[04:21.20]歌詞編輯:錯愛QQ 1320395669
[04:25.86]
找歌詞,上歌詞千尋 www.lrcgc.com。支持歌詞找歌名,LRC歌詞免費下載。
?
歌詞同步原理很簡單,就是將時間點轉換為以毫秒為單位的時間,然后根據歌曲播放的position也就是播放到的時間,顯示對應的歌詞。
簡單源碼如下:
//裝載歌詞時間與內容 var lrcArr:Array = new Array(); //加載聲音的類 var sd:Sound = new Sound(); //開始加載外部歌曲 sd.load(new URLRequest("我們不一樣.mp3")); //開始播放,并將其賦值給SoundChannel類對象,這樣才可以獲取播放的進度 var sdCtrl:SoundChannel = sd.play(); //加載lrc文本的類對象 var urlLdr:URLLoader = new URLLoader(); //開始加載歌詞文本 urlLdr.load(new URLRequest("我們不一樣.lrc")); //偵聽歌詞文本是否加載完畢 urlLdr.addEventListener(Event.COMPLETE,onLoad_Fun);//歌詞文本加載完畢 function onLoad_Fun(e:Event):void{//將歌詞文本全部內容存入str變量var str:String = urlLdr.data;//根據換行符轉化成數組var childArr:Array = str.split("\n");//正則表達式,大致內容就是獲取時間var reg:RegExp = /\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g;//循環整個數組for (var i:int=0; i<childArr.length; i++){//將數組某個內容賦值到變量newStrvar newStr:String = childArr[i] as String;//根據表達式獲取時間存入數組timeArrvar timeArr:Array = newStr.match(reg);//循環整個時間for (var j:int = 0; j<timeArr.length; j++){var theLastStr:String = timeArr[j] as String; var obj:Object = new Object();//將時間轉換為毫秒obj.time = (Number(theLastStr.substr(1,2))*60 + Number(theLastStr.substr(4,5)))*1000;//將歌詞存入obj.lrc 因為時間是[00:05.07]共10個字符串,則從第10個字符串開始截取,則為歌詞內容obj.lrc = newStr.substr(timeArr.length * 10) as String; lrcArr.push(obj);}}//添加幀偵聽this.addEventListener(Event.ENTER_FRAME,onEnter_Fun); }function onEnter_Fun(e:Event):void{//當文本的時間小于播放的時間,則顯示對應的歌詞for (var i:int=0; i<lrcArr.length; i++){var newObj:Object = lrcArr[i];if (newObj.time < sdCtrl.position){lrc_txt.text = newObj.lrc;}} }
轉載于:https://www.cnblogs.com/dt1991/p/9162684.html
總結
- 上一篇: Windows下迁移谷歌浏览器个人资料路
- 下一篇: CentOS服务器的加固方案