日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Java播放歌词同步源码,Android 实现歌词同步

發(fā)布時間:2023/12/29 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java播放歌词同步源码,Android 实现歌词同步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歌詞同步的原理其實很簡單:

歌詞顯示是一個線程, 音樂播放時一個線程,通過播放時間將歌詞顯示進(jìn)度與播放進(jìn)度同步起來。

網(wǎng)絡(luò)標(biāo)準(zhǔn)的歌詞格式是LRC。 我們看下一個LRC文檔,其格式就一目了然了。

[ti:愛]

[ar:小虎隊]

[al:華納國語情濃13首]

[by:愛上你了音樂網(wǎng)]

[02:08.00][00:38.00]把你的心、我的心串一串

[02:11.00][00:41.00]串一株幸運草、串一?同心圓

[02:16.00][00:46.00]讓所有期待未?的呼喚

[02:19.00][00:49.00]趁青春做?伴

[03:16.00][02:24.00][00:53.00]?讓年輕越長大越孤單

[03:19.00][02:27.00][00:56.00]把我的幸運草種在你的夢田

[03:23.00][02:31.00][01:01.00]讓地球隨我?的同心圓

LRC 格式為 [歌詞顯示起始時間][歌詞顯示結(jié)束時間]歌詞內(nèi)容。

了解歌詞同步原理,我們可以想到要做如下工作:

1. LRC 解析

2. LRC 歌詞顯示

3. 歌詞與播放音樂同步

4. 歌詞的獲取

一 LRC解析

這邊我推薦YOYOPlayer 音樂播放開源項目。 源代碼已經(jīng)非常好的支持了LRC解析。 我拿過來就用了。

過程大概如此: 把LRC文件讀到內(nèi)存里面,用 sentence數(shù)據(jù)結(jié)構(gòu)存放。 Sentence里面有 Fromtime, Totime, content三個成員變量。顯示的時候需要這些數(shù)據(jù)。

二。 LRC歌詞顯示

歌詞的繪制通過重寫 OnDraw方法。

繪制的代碼貼出來:

java代碼:

01

long?t = tempTime;

02

int?index = getNowSentenceIndex(t);

03

if?(index == -1) {

04

return;

05

}

06

Sentence now = list。get(index);

07

float?f = (t - now。getFromTime()) *1.0f/ (now.getToTime() - now.getFromTime());

08

if?(f >0.98f) {

09

f =0.98f;

10

}

11

Shader shader =new?LinearGradient(0,0,now。getContentWidth(mTxtPaint),0,new?int[] { Color.RED,Color.BLUE },new?float[] { f, f +0.01f },TileMode.CLAMP);

12

mTxtPaint.setShader(shader);

13

canvas.drawText(now.getContent(),0,20, mTxtPaint);

上面的代碼很簡單,關(guān)鍵一個函數(shù)是getNowSentenceIndex(t). 通過播放時間來獲得歌詞的索引. 我們看下getNowSentenceIndex()如何實現(xiàn).   java代碼:

1

private?int?getNowSentenceIndex(long?t) {

2

for?(int?i =0; i < list.size(); i++) {

3

if?(list.get(i).isInTime(t)) {

4

return?i;

5

}

6

}

7

// throw new RuntimeException("竟然出現(xiàn)了找不到的情況!");

8

return?-1;

9

}

還有一個歌詞漸變的效果,其關(guān)鍵代碼在與對畫筆的設(shè)置,如下.   java代碼:

1

Shader shader =new?LinearGradient(0,0,

2

now.getContentWidth(mTxtPaint),0,new?int[] { Color.RED,Color.BLUE },new?float[] { f, f +0.01f },TileMode.CLAMP);

3

mTxtPaint.setShader(shader);

三. 歌詞與播放音樂同步   音樂播放的時候,同時啟動歌詞顯示線程. 將音樂播放的時間設(shè)置到歌詞View的成員變量中, 以達(dá)到同步的目的.   java代碼:

1

private?class?MyHandlerextends?Handler {

2

@Override

3

public?void?handleMessage(Message msg) {

4

// Log.v("#################hahah", "" + mp.getCurrentPosition());

5

// 重畫

6

lrcView.mLyric.setTime(mp.getCurrentPosition());

7

lrcView.invalidate();

8

}

9

}

四. 歌詞的獲取   歌詞的獲取是通過百度搜索出來的. 具體代碼如下,很好看懂,關(guān)鍵代碼如下:   java代碼:

1

GetMethod get =new?GetMethod("http://www.baidu.com/s?wd="?+ URLEncoder.encode("filetype:lrc "?+ key,"GBK"));

2

get.addRequestHeader("Host","www.baidu.com");

3

get.addRequestHeader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11");

4

get.addRequestHeader("Accept","text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");

5

get.addRequestHeader("Accept-Language","zh-cn,zh;q=0.5");

6

get.addRequestHeader("Keep-Alive","300");

7

get.addRequestHeader("Referer","http://www.baidu.com/");

8

get.addRequestHeader("Connection","keep-alive");

9

int?i = http.executeMethod(get);

總結(jié)

以上是生活随笔為你收集整理的Java播放歌词同步源码,Android 实现歌词同步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。