Node.Js同步实现歌词显示

首先需要知道lrc歌词的一版格式,然后才能继续下去。

lrc歌词格式
[00:00.88]习惯一个人
[00:07.95]作词;刘崇健
[00:14.39]作曲;刘崇健
[00:21.56]演唱;刘崇健
[00:32.43]亲爱的 谢谢你还记得好久不见
[00:39.39]分开了以后 不是说好了 请勿挂念
[00:46.62]我已经习惯 冷眼看人生的 感慨万千
[00:53.87]我不再贪心 也不再想念 那过去的疲倦
[01:00.93]爱已经走远 我又回到了 一个人的空间

由上可知道由时间和正文两部分构成,所以接下来就好办了;

思路
因为lrc是gbk格式,而node不支持这个格式,所以需要第三方插件iconv-lite。
源码:

const iconv = require('iconv-lite');
const fs = require('fs');
fs.readFile('./xiguan.lrc', (err, data) => {
    if (err) {
        console.error(err);
    } else {
        let lrc = iconv.decode(data, 'UTF8').split('\n');
        let regx = /\[(\d{2}):(\d{2})\.(\d{2})](.*)/;
        let newregx = /\[\w{2}:(.*)]/;
        //因为lrc分为两部分,所以我们需要正则表达式提取这两部分,特别是对时间的提取。
        //转换成数组,然后通过foreach遍历
        let start = new Date().getTime();
        lrc.forEach((value) => {
            let str = regx.exec(value);
            if (str) {
          //  regx中的{2}是因为时,分,秒都会存在两位数,不会只有一位数。下面的newregx                        // 是		对歌词开头的一些其他部分的处理。可以忽略!
                         //下面是时间的处理,需要将时分秒转换为ms。所以有以下代码的存在
                let minute = parseFloat(str[1]);
                let second = parseFloat(str[2]);
                let millisecond = parseFloat(str[3]);
                let content = str[4];
                let end = new Date().getTime();
                let time = minute * 60 * 1000 + second * 1000 + millisecond - (end - start);
                setTimeout(() => {
                    console.log("[" + minute + ":" + second + ":" + millisecond + "]",content);
                }, time);
            } else {
                let deputy = newregx.exec(value);
                if (deputy) {
                    console.log(deputy[1]);
                }
            }
        });
    }
});

注意lrc文件和js文件在同一目录下。

运行图:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值