溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flex播放器怎么同步顯示歌詞

發(fā)布時間:2021-12-14 14:09:05 來源:億速云 閱讀:132 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Flex播放器怎么同步顯示歌詞”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Flex播放器怎么同步顯示歌詞”這篇文章吧。

Flex播放器同步顯示歌詞

在聽完S.H.E的你最近還嗎不下一百遍,終于搞好了Flex播放器同步顯示歌詞這一功能。這是繼上一篇Flex播放器(實現播放、緩沖進度條和音頻曲線顯示)后的一擴展功能,本例是實現對lrc文本格式的歌詞進行解析顯示,并把當前播放歌詞一行文本進行高亮顯示。

播放歌曲時要同步顯示歌詞,首先必須要能解析出lrc格式的歌詞文本,之前我還準備直接在網上匹配下載對應歌詞,打開我機器的千千靜音在線匹配歌詞,然后用HTTPAnalyzerStdV監(jiān)視所有的http請求,發(fā)現它是請求這個ttlrcct.qianqian.com網站下載歌詞,本來還是直接套用千千靜音服務器下載歌詞,但是它的url參數全部加密了。后來又看了下酷狗音樂,它里面下載歌詞我都監(jiān)視不請求,考慮到就算我能在線找到下載歌詞的url地址,flash里發(fā)送遠程請求也會有安全殺箱問題,所以最終放棄直接在網絡上下載歌詞的辦法,還是全部上傳到我網站上去。

lrc歌詞其實就是一個文本格式的文件,在Flex里面我們可以使用URLLoader去加載,代碼如下:

/加載歌詞varlrcUrl:String=xml.item[currIndex].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="";

然后在加載完成的事件里,我們能得到lrc文本字符串,這時候我們需要對字符串進行處理,把它轉換成一個Array數組,函數方法如下:

publicfunctiongetLRCArray(lrc:String):Array{varlrcArr:Array=newArray;  lrc+="\r";for(vari:int=0;i<lrc.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;do{j++;  if(lrc.charAt(i+j)=="]"){startIndex=i+j+1;}}while(i+j<lrc.indexOf("\r",i))endIndex=lrc.indexOf("\r",i);  if(startIndex!=0&&endIndex!=0){lrcArr.push([time,lrc.slice(startIndex,endIndex)]);}}}}returnlrcArr;}

解析歌詞返回的Array數組為多圍數組,數組里的每一項是為一個二圍數組,item[0]為當前秒數,item[1]為該秒顯示的歌詞(句),比如item[0]=歌曲名:你最近還好嗎、item[5]=演唱:S.H.E,就是代表第0秒顯示歌曲名:你最近還好嗎,而從第5秒起則顯示演唱:S.H.E,這樣通過getLRCArray方法就能得到歌曲所有的時間段顯示的歌詞拉。本例中把所有歌詞放在一個editable="false"不可修改的mx:TextArea文本域內。

Flex播放器歌詞同步顯示的問題

歌詞能全部加載顯示了,問題是怎么隨著歌曲的播放而高亮顯示當前行歌詞呢?不過還好Flex提供一個TextRange能對TextArea內文本進行選擇性的處理,你只需要設置beginIndex和endIndex就能自動匹配到TextArea中間區(qū)域的文本,我這里只是簡單的改變了一下顏色,不過我們從TextArea中找某一個句歌詞索引的時候需要注意歌詞有很多是重復的,所以我們需要用一個變量保存當前歌詞播放位置索引startIndexOf,以確保我們高亮選擇到的歌詞是正確的。同時將TextArea滾動條設置到對應的高度,主要的代碼如下:

//同步顯示歌詞if(lrcArr!=null&&lrcArr.length>0){varsec:Number=int(channel.position/1000);  for(varj:int=0;j<lrcArr.length;j++){if(lrcArr[j][0]==sec){varcurrentLrc:String=lrcArr[j][1];  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.verticalScrollPosition=j*this.txtLrc.maxVerticalScrollPosition/lrcArr.length;if(lrcArr.length-j<=5)   thisthis.txtLrc.verticalScrollPosition=this.txtLrc.maxVerticalScrollPosition;}break;}}}

上面sec是當前歌曲播放的時間秒數,然后循環(huán)換數組判斷rcArr[j][0]跟當前sec比較,秒數一致才顯示對應歌詞,一段歌詞可能在好幾秒內都不會變的,同時根據當前歌詞的數組索引位置設置TextArea滾動條位置,讓當前正在播放的歌詞在中間顯示。

以上是“Flex播放器怎么同步顯示歌詞”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI