【wavesurfer.js实战范例】多区域音频标注(含区域实时切换显示)

简介: 【wavesurfer.js实战范例】多区域音频标注(含区域实时切换显示)

通过多选框,实现多区域显示的实时切换,实现原理:

  1. 每次切换时先清除所有区域
  2. 对选中区域进行重绘
<template>
  <div style="padding: 30px">
    <el-row type="flex" justify="center">
      <el-checkbox-group v-model="showList" @change="showListChange">
        <el-checkbox
          v-for="(regionInfo, regionKey) in regionDic"
          :label="regionKey"
          :key="'region' + regionKey"
        >
          <div class="colorTag" :style="{ background: regionInfo.color }"></div>
          {{ regionInfo.label }}</el-checkbox
        >
      </el-checkbox-group>
    </el-row>
    <div class="waveBox" ref="wave_Ref"></div>
  </div>
</template>

<script>
import WaveSurfer from "wavesurfer.js";
// 导入插件--区域
import RegionsPlugin from "wavesurfer.js/dist/plugin/wavesurfer.regions.min.js";
// 导入插件--指针轴
import CursorPlugin from "wavesurfer.js/dist/plugin/wavesurfer.cursor.js";

export default {
  data() {
    return {
      showList: ["1", "2", "3", "4", "5"],
      wavesurfer: null,
      regionDic: {
        1: {
          label: "前奏",
          color: "rgba(255, 255, 0, 0.5)",
          dataMark: "preludeList",
        },
        2: {
          label: "男声",
          color: "rgba(0, 0, 255, 0.5)",
          dataMark: "boyVoiceList",
        },
        3: {
          label: "女声",
          color: "rgba(255, 0, 0, 0.5)",
          dataMark: "girlVoiceList",
        },
        4: {
          label: "男/女合唱",
          color: "rgba(0, 255, 255, 0.5)",
          dataMark: "chorusList",
        },
        5: {
          label: "间奏",
          color: "rgba(255, 0, 255, 0.5)",
          dataMark: "interludeList",
        },
      },

      boyVoiceList: [
        {
          start: 14,
          end: 26,
        },
        {
          start: 59,
          end: 64,
        },
        {
          start: 109,
          end: 134,
        },
        {
          start: 148,
          end: 160,
        },
      ],

      girlVoiceList: [
        {
          start: 27,
          end: 39,
        },
        {
          start: 52,
          end: 58,
        },
      ],

      preludeList: [
        {
          start: 0,
          end: 14,
        },
      ],

      // 男女合唱
      chorusList: [
        {
          start: 40,
          end: 52,
        },
        {
          start: 65,
          end: 71,
        },
        {
          start: 97,
          end: 109,
        },
        {
          start: 135,
          end: 147,
        },
        {
          start: 161,
          end: 173,
        },
      ],
      // 间奏
      interludeList: [
        {
          start: 72,
          end: 96,
        },
      ],
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.wavesurfer = WaveSurfer.create({
        container: this.$refs.wave_Ref,
        plugins: [
          // 插件--区域的配置
          RegionsPlugin.create({}),

          // 插件--指针轴的配置
          CursorPlugin.create({
            showTime: true,
            opacity: 1,
            customShowTimeStyle: {
              "background-color": "#000",
              color: "#fff",
              padding: "2px",
              "font-size": "10px",
            },
          }),
        ],
      });
      this.wavesurfer.load(require("./《祝福你》群星_粤语.mp3"));
      // 自动播放
      let that = this;
      this.wavesurfer.on("ready", function () {
        that.wavesurfer.play();
      });
      this.drawRegion();
    });
  },
  methods: {
    showListChange() {
      this.wavesurfer.clearRegions();
      this.drawRegion();
    },
    wavesurferAddRegion(start, end, color) {
      this.wavesurfer.addRegion({
        start: start, // 区域开始时间
        end: end, // 区域结束时间
        color: color, // 区域颜色
        drag: false, // 是否可拖拽
        resize: false, // 是否可改变大小
      });
    },
    drawRegion() {
      this.showList.forEach((regionType) => {
        let regionInfo = this.regionDic[regionType];
        this[regionInfo.dataMark].forEach((item) => {
          this.wavesurferAddRegion(item.start, item.end, regionInfo.color);
        });
      });
    },
  },
};
</script>
<style scoped>
.colorTag {
  display: inline-block;
  height: 10px;
  width: 30px;
}
.waveBox {
  border: 1px solid gray;
  margin-top: 15px;
}
</style>
目录
相关文章
|
21天前
|
前端开发 JavaScript Java
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
26 3
|
19天前
|
设计模式 JavaScript 前端开发
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
JavaScript的继承机制基于原型链,它定义了对象属性和方法的查找规则。每个对象都有一个原型,通过原型链,对象能访问到构造函数原型上的方法。例如`Animal.prototype`上的`speak`方法可被`Animal`实例访问。原型链的尽头是`Object.prototype`,其`[[Prototype]]`为`null`。继承方式包括原型链继承(通过`Object.create`)、构造函数继承(使用`call`或`apply`)和组合继承(结合两者)。ES6的`class`语法是语法糖,但底层仍基于原型。继承选择应根据需求,理解原型链原理对JavaScript面向对象编程至关重要
33 7
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
|
5天前
|
存储 前端开发 JavaScript
Next.js 实战 (一):项目搭建指南
这篇文章介绍了作者在2024年下半年计划使用Next.js从零开始搭建一个后台模板,以探索Next.js的奥秘。文章包含了项目搭建、目录结构、APP路由约定、配置Eslint、Prettierrc、Husky等项目提交规范、使用release-it自动管理版本号和生成CHANGELOG、import排序规则、安装NextUI等内容。作者还提到会在开发过程中记录遇到的问题和解决方法,并计划在后期使用Prisma+Supabase数据库存储数据,最终完成一个基于Next.js的全栈项目。
Next.js 实战 (一):项目搭建指南
|
12天前
|
移动开发 前端开发 JavaScript
HTML5+CSS3+JavaScript网页实战
HTML5+CSS3+JavaScript网页实战
|
2天前
|
JavaScript
JS【实战】跨域的网页链接跳转
JS【实战】跨域的网页链接跳转
4 0
|
3天前
|
前端开发 JavaScript
js【详解】Promise(含 Promise 的三种状态及其变化,创建 Promise, Promise.all 语法、Promise.all 实战范例、手写 Promise.all)
js【详解】Promise(含 Promise 的三种状态及其变化,创建 Promise, Promise.all 语法、Promise.all 实战范例、手写 Promise.all)
15 0
|
27天前
|
数据库 数据安全/隐私保护 Python
Web实战丨基于django+html+css+js的电子商务网站
Web实战丨基于django+html+css+js的电子商务网站
42 3
|
4天前
|
前端开发 JavaScript
js 打开资源管理器(经典范例:纯前端选择并预览图片)
js 打开资源管理器(经典范例:纯前端选择并预览图片)
16 0
|
27天前
|
前端开发 安全 数据安全/隐私保护
Web实战丨基于django+html+css+js的在线博客网站
Web实战丨基于django+html+css+js的在线博客网站
31 2
|
3天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的个人健康管理系统小程序附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的个人健康管理系统小程序附带文章源码部署视频讲解等
11 2