用javascript实现的支持lrc歌词的播放器

下面是实现“用javascript实现的支持lrc歌词的播放器”的完整攻略和示例说明。

1. 资源准备

首先需要准备好播放器所需的资源,包括音频文件和lrc歌词文件。这里以一首名为《夜空中最亮的星》的音乐和其对应的歌词文件为例。将音频文件和歌词文件放到项目的目录下,命名为“audio.mp3”和“audio.lrc”,并将代码中对应的路径修改为相对路径。

2. HTML结构

开始构建HTML结构,其中包括一个音频播放器和一个歌词显示区域。建议可以使用<audio>标签来创建一个控制音频播放的元素,同时在歌词显示区域使用<pre>标签来显示歌词。示例代码如下:

<audio controls src="audio.mp3"></audio>
<pre id="lrc"></pre>

3. 解析lrc歌词

接下来需要解析歌词文件,将其转化为可以JS操作的数据,可采用正则表达式进行匹配。将解析后的数据存储在一个数组中,每个元素包含歌词和对应的时间戳。变量名可以为lrcData。示例代码如下:

function parseLrc(lrcContent) {
  // 解析歌词
  var lrcList = [];
  var lines = lrcContent.split("\n");
  var timeReg = /\[(\d{2}):(\d{2})\.(\d{2})\]/;
  for (var i = 0; i < lines.length; i++) {
    var line = lines[i].trim();
    if (line) {
      var matched = timeReg.exec(line);
      if (matched) {
        var timestamp = parseInt(matched[1]) * 60 + parseInt(matched[2]) + parseInt(matched[3]) / 1000;
        var lrc = line.replace(timeReg, "").trim();
        lrcList.push({
          timestamp: timestamp,
          lrc: lrc
        });
      }
    }
  }
  return lrcList;
}

// 加载歌词文件,解析歌词数据
fetch('audio.lrc')
  .then(function(response) {
    return response.text();
  })
  .then(function(lrcContent) {
    var lrcData = parseLrc(lrcContent);
    // console.log(lrcData);
  });

4. 显示歌词

在播放器上绑定一个时间更新事件,用以判断当前播放时间所处的歌词,并在歌词显示区域展示该行歌词。需要注意的是,在切换歌曲时需要将之前的事件解绑,同时需要清空歌词显示区域。示例代码如下:

var audio = document.querySelector("audio"); // 音频元素
var lrcBox = document.getElementById("lrc"); // 歌词显示区域

var currentLrcIndex = -1; // 当前歌词行

audio.addEventListener("timeupdate", function() {
  if (lrcData && lrcData.length > 0) {
    var currentTime = this.currentTime; // 当前时间点
    if (currentTime >= lrcData[0].timestamp) {
      if (currentLrcIndex === -1) {
        currentLrcIndex = 0;
      }
      for (var i = currentLrcIndex; i < lrcData.length - 1; i++) {
        if (currentTime >= lrcData[i].timestamp && currentTime < lrcData[i + 1].timestamp) {
          // 更新歌词
          if (currentLrcIndex !== i) {
            lrcBox.innerHTML = lrcData[i].lrc;
            currentLrcIndex = i;
          }
        }
      }
    }
  }
});

// 切换歌曲时清空歌词区域
audio.addEventListener("play", function() {
  if (lrcData && lrcData.length > 0) {
    lrcBox.innerHTML = "";
    currentLrcIndex = -1;
  }
});

示例说明

下面分别对上述示例中的两个代码块进行说明。

  1. 歌词解析

首先定义了一个parseLrc函数,用于解析lrc歌词。该函数接收一个歌词字符串作为参数,返回一个数组,数组中的每个元素包含一个时间戳和一行歌词。解析过程中使用正则表达式匹配歌词中的时间戳,并将其转化为秒数进行存储。最后返回歌词数据数组lrcList

接下来使用fetch函数来加载歌词文件,并将其内容作为参数传给parseLrc函数进行解析。解析完成后,可将解析后的歌词数据存储在变量lrcData中,并进行后续操作。

  1. 歌词显示

在音频元素上绑定了一个timeupdate事件,该事件会在音频播放器的播放进度更新时触发。在事件处理函数中,首先判断是否有歌词数据,并且当前时间是否已经超过了第一行歌词的时间戳。如果满足条件,就开始循环歌词数据,通过判断当前时间所处的位置来更新歌词区域。具体思路是将每行歌词的时间戳与当前时间进行比较,找到当前播放的歌词所在的行,并将其展示在歌词区域中,同时将当前歌词行的索引存储在currentLrcIndex中,避免重复更新。

在切换歌曲时,需清空歌词区域,并将当前歌词行的索引恢复为初始值-1,保证后续的歌词更新能够重新从第一行开始。

以上就是通过JavaScript实现支持lrc歌词的播放器的完整攻略和示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用javascript实现的支持lrc歌词的播放器 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 浅谈Maven的build生命周期和常用plugin

    Maven是一个流行的Java项目管理工具,它可以自动化执行各种构建任务。Maven的构建生命周期由多个阶段组成,每个阶段都与一组目标相关联,而这些目标是通过插件实现的。 Maven Build生命周期 Maven的构建生命周期包括三个标准的build生命周期:clean、default和site。每个生命周期都由一系列阶段组成。 Clean生命周期 Cle…

    Java 2023年5月19日
    00
  • Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL数据库的方法

    当我们需要在Spring Boot应用中使用Kotlin通过JdbcTemplate连接MySQL数据库时,可以参考以下步骤: 1. 添加依赖 我们需要在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifa…

    Java 2023年6月16日
    00
  • 基于Beanutils.copyProperties()的用法及重写提高效率

    下面详细讲解一下“基于Beanutils.copyProperties()的用法及重写提高效率”的完整攻略。 基于Beanutils.copyProperties()的用法 Beanutils.copyProperties()方法是Apache Commons BeanUtils库中提供的一种用于将Java对象的属性值从一个对象复制到另一个对象的方法。它的作…

    Java 2023年5月20日
    00
  • 微信小程序 websocket 实现SpringMVC+Spring+Mybatis

    下面是实现“微信小程序 websocket 实现SpringMVC+Spring+Mybatis”的完整攻略: 1. 确定小程序基本环境和websocket环境 首先,要开发微信小程序,需要选择对应的开发环境和工具,例如开发者工具、微信web开发者工具等等。同时还需要了解微信小程序开发的基本要求和技术规范。 对于websocket环境,则需要了解websoc…

    Java 2023年5月23日
    00
  • java异常处理机制示例(java抛出异常、捕获、断言)

    Java 异常处理机制是 Java 编程语言的一部分,可以用来处理可能在程序执行期间发生的错误或特殊情况。该机制利用两个机制来实现异常处理:抛出异常和捕获异常。在代码块中,如果发生了异常,它将会被抛出,然后在某个程序块中被捕获并处理。下面我们将通过两条示例详细讲解 Java 异常处理机制和代码实现。 1. 抛出异常 Java 中的异常通常是以 throw 语…

    Java 2023年5月27日
    00
  • SpringBoot如何整合mybatis-generator-maven-plugin 1.4.0

    下面我将为您讲解如何在Spring Boot项目中整合mybatis-generator-maven-plugin 1.4.0,供您参考。 1. 添加maven依赖 在pom.xml文件中添加mybatis-generator-maven-plugin 1.4.0的依赖,如下所示: <dependency> <groupId>org.…

    Java 2023年6月3日
    00
  • JSP Spring ApplicationContext的国际化支持

    JSP Spring ApplicationContext的国际化支持是一种让应用程序可以在不修改源代码的情况下,动态切换不同语言版本的功能。下面就详细讲解一下该功能的实现步骤: 第一步:准备资源文件 在项目的src/main/resources目录下创建多个.properties文件,每个文件对应一个语言版本。例如,可以创建messages.propert…

    Java 2023年6月15日
    00
  • 深入解析Spring Boot 的SPI机制详情

    深入解析Spring Boot 的SPI机制详情 在Spring Boot中,SPI是一种Java的扩展机制,它让应用程序可以在运行时动态加载一个类或多个类实现的接口,并执行相应的操作。下面我们将深入探究Spring Boot的SPI机制的实现细节。 什么是SPI机制 SPI,全称为Service Provider Interface,是一种Java的扩展机…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部