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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js解析lrc 实现lrc歌词同步滚动效果

發(fā)布時間:2023/12/29 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js解析lrc 实现lrc歌词同步滚动效果 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這兩天想著做一個h5的網頁播放器,實現(xiàn)歌詞同步滾動

但是上網找了很多資料,竟發(fā)現(xiàn)沒有比較完善的代碼供參考,但是無意間看到了百度的千千音樂有這樣的效果,就想著一定能通過js實現(xiàn)

經過兩三天的努力,終于做出了這樣的效果


實現(xiàn)功能

  • 歌詞同步滾動
  • 同步歌詞高亮效果

代碼實現(xiàn)

首先,在body中加audio 和 放歌詞的ul標簽

<div><ul id="lrclist" style="transform: translateY(250px);"><!-- 保證歌詞在正中間 --></ul> </div> <audio id="audio" src="audio/1.mp3" controls="controls" autoplay="true"></audio>

然后就是讀取lrc文件,在進行解析,解析出歌詞及對應的時間
一般的思路是這樣的:通過Ajax或其他方式讀取lrc文件
但我的專業(yè)是后端開發(fā),js,啥的,都是自學的,于是遇到了不少坑,,在我千方百計想獲取lrc文件時,總是報錯,,只能通過http,data 協(xié)議獲取文件,加上我用的是notepad開發(fā)的,調試了億遍都失敗

?

?

最后只好放棄了,我把lrc數(shù)據(jù)直接定義在js中,最后實現(xiàn)了同樣的效果,

var lrcJSON = {"[00:16.810]":"誰にも言えない孤獨を抱えたまま1人で泣いてた","[00:28.040]":"誰にも上手に笑えない僕ら 2人出會って笑った","[00:39.710]":"","[00:40.410]":"真夜中過ぎに 想像の奧に","[00:46.150]":"どうしようもない気持ちをただ押しやって","[00:50.780]":"","[00:51.480]":"サヨナラ 僕らはきっと生まれ変われるから","[00:57.030]":"悲しみに手を振るんでしょう","[01:01.190]":"そしていつか 空っぽのままの心に燈りをともすように","[01:08.630]":"とぎれとぎれの 言葉を探して繋ぎ止めた","[01:14.390]":"それでもたった二人の世界は続いて行くんだ","[01:20.190]":"空に祈るように どうか永遠に","[01:29.380]":"","[01:43.670]":"白?黒?壱?零 僕らは選ぶ事を迫られてばかり","[01:54.940]":"そうして殘った大事な物を壊れるほど抱きしめていた","[02:06.670]":"","[02:07.670]":"明け方過ぎの光の先に","[02:13.530]":"ほんの少しだけ未來が見えた気がして","[02:18.110]":"","[02:18.810]":"バカげた夢だってきっと願い続けるから","[02:24.330]":"奇跡に近づくんでしょう","[02:28.590]":"それは君の弱さの隣に見つけた強さの欠片だって","[02:36.160]":"とぎれとぎれの 言葉を探して繋ぎ止めた","[02:41.700]":"瞼の奧に滲んだ世界を守ってゆくんだ","[02:47.470]":"空に祈るように 君と誓う明日","[02:58.720]":"","[03:08.900]":"不自由な思いが重なり合ったら","[03:14.390]":"そうさ誰より自由になれた","[03:20.390]":"足りないものを埋め合うように","[03:25.700]":"疑いもせず 支えあいながら","[03:31.610]":"","[03:34.060]":"サヨナラ 僕らはきっと生まれ変われるから","[03:39.490]":"悲しみに手を振るんでしょう","[03:44.450]":"そしていつか 空っぽのままの心に燈りをともすように","[03:51.620]":"とぎれとぎれの 言葉を探して繋ぎ止めた","[03:57.190]":"それでもたった二人の世界は続いて行くんだ","[04:03.000]":"空に祈るように どうか永遠に…"};

(有需要的可以仿照網上的Ajax獲取lrc文件,再進行解析)

(不過lrc歌詞文件可沒有那么簡單,開頭可能還有歌名,歌手等信息,后邊可能還有歌詞對應的翻譯。這里我是簡化了數(shù)據(jù)。)

然后獲取lrc數(shù)據(jù),在ul中填充歌詞,同時獲取歌詞對應的時間數(shù)據(jù)

var lrcTime = [];//歌詞對應的時間數(shù)組 var ul = $("#lrclist")[0];//獲取ulvar i = 0; $.each(lrcJSON, function(key, value) {//遍歷lrclrcTime[i++] = parseFloat(key.substr(1,3)) * 60 + parseFloat(key.substring(4,10));//00:00.000轉化為00.000格式ul.innerHTML += "<li><p>"+lrcJSON[key]+"</p></li>";//ul里填充歌詞 });

接下來是播放時的自動滾動,用到了audio的timeupdate事件

audio.ontimeupdate = function() {//audio時間改變事件currentTime = audio.currentTime;for (j=currentLine, len=lrcTime.length; j<len; j++){if (currentTime<lrcTime[j+1] && currentTime>lrcTime[j]){currentLine = j;ppxx = 250-(currentLine*32);ul.style.transform = "translateY("+ppxx+"px)";$li.get(currentLine-1).className="";console.log("on"+currentLine);$li.get(currentLine).className="on";break;}} };

最后是調整播放位置時觸發(fā)的audio的seeked事件

audio.onseeked = function() {//audio進度更改后事件currentTime = audio.currentTime;console.log(" off"+currentLine);$li.get(currentLine).className="";for (k=0, len=lrcTime.length; k<len; k++){if (currentTime<lrcTime[k+1] && currentTime<lrcTime[k]){currentLine = k;break;}} };

實現(xiàn)效果

最后附上完整代碼

<!DOCTYPE html> <html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><title>LRC</title><script src="js/jquery.js"></script><style>div{width:340px;height:500px;margin:0 auto;overflow:hidden;}ul{transition-duration: 600ms;}ul, li{list-style:none;padding: 0;margin: 0;}li.on{color: red;}p{overflow: hidden;text-overflow: ellipsis;height: 16px;line-height: 16px;-webkit-line-clamp: 1;-webkit-box-orient: vertical;display: -webkit-box;text-align: center;margin-top: 0;margin-bottom: 16px;}audio{margin-top: 10px;}</style></head><body><div><ul id="lrclist" style="transform: translateY(250px);"><!-- 保證歌詞在正中間 --></ul></div><audio id="audio" src="audio/1.mp3" controls="controls" autoplay="true"></audio><script>var lrcJSON = {"[00:16.810]":"誰にも言えない孤獨を抱えたまま1人で泣いてた","[00:28.040]":"誰にも上手に笑えない僕ら 2人出會って笑った","[00:39.710]":"","[00:40.410]":"真夜中過ぎに 想像の奧に","[00:46.150]":"どうしようもない気持ちをただ押しやって","[00:50.780]":"","[00:51.480]":"サヨナラ 僕らはきっと生まれ変われるから","[00:57.030]":"悲しみに手を振るんでしょう","[01:01.190]":"そしていつか 空っぽのままの心に燈りをともすように","[01:08.630]":"とぎれとぎれの 言葉を探して繋ぎ止めた","[01:14.390]":"それでもたった二人の世界は続いて行くんだ","[01:20.190]":"空に祈るように どうか永遠に","[01:29.380]":"","[01:43.670]":"白?黒?壱?零 僕らは選ぶ事を迫られてばかり","[01:54.940]":"そうして殘った大事な物を壊れるほど抱きしめていた","[02:06.670]":"","[02:07.670]":"明け方過ぎの光の先に","[02:13.530]":"ほんの少しだけ未來が見えた気がして","[02:18.110]":"","[02:18.810]":"バカげた夢だってきっと願い続けるから","[02:24.330]":"奇跡に近づくんでしょう","[02:28.590]":"それは君の弱さの隣に見つけた強さの欠片だって","[02:36.160]":"とぎれとぎれの 言葉を探して繋ぎ止めた","[02:41.700]":"瞼の奧に滲んだ世界を守ってゆくんだ","[02:47.470]":"空に祈るように 君と誓う明日","[02:58.720]":"","[03:08.900]":"不自由な思いが重なり合ったら","[03:14.390]":"そうさ誰より自由になれた","[03:20.390]":"足りないものを埋め合うように","[03:25.700]":"疑いもせず 支えあいながら","[03:31.610]":"","[03:34.060]":"サヨナラ 僕らはきっと生まれ変われるから","[03:39.490]":"悲しみに手を振るんでしょう","[03:44.450]":"そしていつか 空っぽのままの心に燈りをともすように","[03:51.620]":"とぎれとぎれの 言葉を探して繋ぎ止めた","[03:57.190]":"それでもたった二人の世界は続いて行くんだ","[04:03.000]":"空に祈るように どうか永遠に…"};var lrcTime = [];//歌詞對應的時間數(shù)組var ul = $("#lrclist")[0];//獲取ulvar i = 0;$.each(lrcJSON, function(key, value) {//遍歷lrclrcTime[i++] = parseFloat(key.substr(1,3)) * 60 + parseFloat(key.substring(4,10));//00:00.000轉化為00.000格式ul.innerHTML += "<li><p>"+lrcJSON[key]+"</p></li>";//ul里填充歌詞});lrcTime[lrcTime.length] = lrcTime[lrcTime.length-1] + 3;//如不另加一個結束時間,到最后歌詞滾動不到最后一句var $li = $("#lrclist>li");//獲取所有l(wèi)ivar currentLine = 0;//當前播放到哪一句了var currentTime;//當前播放的時間var audio = document.getElementById("audio");var ppxx;//保存ul的translateY值audio.ontimeupdate = function() {//audio時間改變事件currentTime = audio.currentTime;for (j=currentLine, len=lrcTime.length; j<len; j++){if (currentTime<lrcTime[j+1] && currentTime>lrcTime[j]){currentLine = j;ppxx = 250-(currentLine*32);ul.style.transform = "translateY("+ppxx+"px)";$li.get(currentLine-1).className="";console.log("on"+currentLine);$li.get(currentLine).className="on";break;}}};audio.onseeked = function() {//audio進度更改后事件currentTime = audio.currentTime;console.log(" off"+currentLine);$li.get(currentLine).className="";for (k=0, len=lrcTime.length; k<len; k++){if (currentTime<lrcTime[k+1] && currentTime<lrcTime[k]){currentLine = k;break;}}};</script></body> </html> 可能會有點不足之處,還望大佬們指正

?

?

總結

以上是生活随笔為你收集整理的js解析lrc 实现lrc歌词同步滚动效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人自拍网 | 综合一区在线 | 中国一级特黄录像播放 | 污视频网址 | av大片在线看 | av爱爱| 国产高清日韩 | 日韩av伦理 | 久久国产一区二区三区 | 午夜蜜桃视频 | 亚洲小说专区 | 开心春色激情网 | 四虎网站 | 污污小视频 | 久久日韩精品 | 亚洲国产成人在线观看 | 激情三级在线 | 成人夜晚视频 | 亚洲29p| 日本夫妻性生活视频 | 欧美欧美欧美欧美 | 久久调教视频 | 欧美乱妇视频 | 亚洲天堂视频一区 | 日本免费精品 | 中文日韩字幕 | 激情综合五月网 | www.国产在线 | 进去里视频在线观看 | brazzers精品成人一区 | 精品久久久久久久久久岛国gif | 国产精品九九九九九 | 草莓视频在线观看入口w | 日韩福利电影在线 | 亚洲韩国精品 | 成人网在线看 | 黄色视屏在线免费观看 | 免费人成在线观看网站 | 中文日韩av | 99视频+国产日韩欧美 | 制服丝袜成人动漫 | 久久av一区| 色网av| 欧美综合自拍亚洲综合图片区 | 一级美女黄色片 | 91本色 | 亚洲综合视频在线观看 | 国产豆花视频 | 伊人超碰在线 | 国产一区二区三区黄片 | 亚洲欧美大片 | 成人免费在线网站 | 午夜视频在线免费播放 | 麻豆入口| 国产毛片精品国产一区二区三区 | 三上悠亚一区二区 | 99re久久| 欧美情趣视频 | 久久国产香蕉 | 狠狠爱成人 | 亚洲爱视频 | 小仙女av | 亚洲黄色三级视频 | 亚洲精品乱码久久久久久蜜桃欧美 | 成人午夜激情 | 福利所第一导航 | 日本视频二区 | 日韩精品aaa | 特色黄色片 | 神马九九| 日韩精品一区二区三区在线视频 | 亚洲视频三区 | 日韩av少妇 | 狠狠网站 | 偷偷操不一样的99 | 97精品国产97久久久久久春色 | 少妇流白浆 | 亚洲另类xxxx| 天堂网在线观看视频 | 国产免费一区二区三区最新不卡 | 一区二区国产精品视频 | 日韩精品极品视频在线观看免费 | 亚洲精品成a人在线观看 | 91精品国产乱码久久久久久久久 | 无套内谢的新婚少妇国语播放 | 亚洲干综合 | 人妻无码一区二区三区久久99 | 欧美嫩草影院 | 精品视频在线观看免费 | av在线a| 韩国中文字幕 | 亚洲成人激情在线 | 亚洲第一黄色网 | ass极品国模人体欣赏 | 青草视频在线看 | 久久免费视频2 | 婷婷精品 | 国产在线视频不卡 | 久久久久久久久精 |