- 精华
- 5
- 金钱
- 39133
- 经验
- 13785
- 在线时间
- 57 小时
- 注册时间
- 2021-10-23
- 最后登录
- 2025-10-23
TA的每日心情 | 开心 2025-9-29 08:51 |
|---|
签到天数: 90 天 [LV.6]常住居民II
金牌会员
     
|
请马上登录,朋友们都在花潮里等着你哦:)
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 山人 于 2023-2-19 23:38 编辑
以下两个函数,使用时各自写在一行里,这里按标准来写,便于大家研究改进。它们的作用是将原生lrc歌词解析为花潮格式播放器所使用的 lrcAr 数组变量:- let lrcTime = (ar) => {
- let tmpAr = [];
- for (j = 0; j < ar.length - 1; j++) {
- if (j !== ar.length - 1) tmpAr[j] = parseFloat((ar[j + 1][0] - ar[j][0]).toFixed(1));
- }
- let aver = parseInt(tmpAr.reduce((a, b) => a + b) / (tmpAr.length - 1)) + averAdd;
- tmpAr.push(aver);
- tmpAr.forEach((item, key) => {
- ar[key][2] = item > aver ? aver : item;
- });
- return ar;
- };
- let getLrcAr = (text) => {
- let lrcAr = [];
- let calcRule = [60, 1, 0.001];
- for (x of text.split('\n')) {
- let ar = [];
- let re = /\d+[\.:]\d+([\.:]\d+)?/g;
- let geci = x.replace(re, '');
- if (geci) {
- geci = geci.replace(/[\[\]\'"\t,]s?/g, '');
- let time = x.match(re);
- if (time != null) {
- for (y of time) {
- let tmp = y.match(/\d+/g);
- let sec = 0;
- for (z in tmp) sec += tmp[z] * calcRule[z];
- ar[0] = [parseFloat(sec.toFixed(2)) + offset, geci];
- lrcAr.push(ar[0]);
- }
- }
- }
- }
- lrcAr.sort((a, b) => a[0] - b[0]);
- return (lrcTime(lrcAr));
- }
复制代码 以上核心函数需要接入两个变量,变量应放在核心函数之前:
let averAdd = 0, offset = 0;
变量 ① averAdd : 歌词用时平均值补偿。
变量 ② offset : lrc时间偏差值。
两个变量支持正负数、支持浮点数,取值依据自己体会。
下面给出帖子使用核心函数的代码范例(实际使用时请将注释去掉),红色部分是原生lrc歌词转为 lrcAr 数组变量的关键:
<style>
#papa {
margin: auto;
width: 1024px;
height: 640px;
background: gray url('图片地址') no-repeat center/cover;
box-shadow: 8px 4px 20px hsla(0,0%,0%,.65);
user-select: none;
position: relative;
z-index: 1;
}
</style>
<div id="papa">
<!-- 帖子其他HTML代码 -->
</div>
<audio id="aud" src="音乐地址" loop autoplay></audio>
<script >
(function() {
/* 这行是播放器插件代码 */
/* 这行是全屏插件代码代码 */
/* 以下两个变量必须 ① averAdd : 歌词用时平均值补偿 ② offset : lrc时间偏差值 */
let averAdd = 0, offset = 0;
/* 原生lrc歌词变量 */
let geci = `
[00:03:20]歌词一
[00:09.72]歌词二
[00:015.02]歌词三
/* ... */
[02:56.00]歌词N
`;
/* 两个核心函数各自写成一行 */
let lrcTime = (ar) => {let tmpAr = [];for(j = 0; j <ar.length - 1; j ++) {if(j !== ar.length - 1) tmpAr[j] = parseFloat((ar[j+1][0] - ar[j][0]).toFixed(1));}let aver = parseInt(tmpAr.reduce((a,b) => a + b) / (tmpAr.length - 1)) + averAdd;tmpAr.push(aver);tmpAr.forEach((item,key) => {ar[key][2] = item > aver ? aver : item;});return ar;};
let getLrcAr = (text) => {let lrcAr = [];let calcRule = [60,1,0.001];for(x of text.split('\n')) {let ar = [];let re = /\d+[\.:]\d+([\.:]\d+)?/g;let geci = x.replace(re,'');if(geci) {geci = geci.replace(/[\[\]\'\"\t,]s?/g,'');let time = x.match(re);if(time != null) {for(y of time) {let tmp = y.match(/\d+/g);let sec = 0;for(z in tmp) sec += tmp[z] * calcRule[z];ar[0] = [parseFloat(sec.toFixed(2)) + offset, geci];lrcAr.push(ar[0]); }}}}lrcAr.sort((a,b)=> a[0] - b[0]);return(lrcTime(lrcAr));}
/* 下面是插件接口相关配置代码 */
HCPlayer({
lrcAr: getLrcAr(geci),
lrc_css: '--bg: linear-gradient(hsla(200,80%,50%,.35),hsla(200,70%,45%,.6)); left: 30px; bottom: 20px;',
player_css: '--color: snow; bottom: 100px; left: 20px;',
});
/* 下面是全屏插件代码 */
FS({
pa: papa,
set: 'backgroun: transparent; color: snow; border: 2px dotted snow; left: 20px; top: 20px;',
});
})();
</script>
|
评分
-
| 参与人数 3 | 威望 +110 |
金钱 +220 |
经验 +110 |
收起
理由
|
梦缘
| + 30 |
+ 60 |
+ 30 |
很给力! |
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
醉美水芙蓉
| + 30 |
+ 60 |
+ 30 |
赞一个! |
查看全部评分
|