vue2 wavesurfer.js(7.8.5)简单使用

news2024/11/26 0:27:29

在这里插入图片描述
文档地址:https://wavesurfer.xyz/docs/

<template>
  <div>
    <el-row>
      <el-card class="card">
        <div id="waveform" ref="waveform"></div>
      </el-card>
    </el-row>
    <div>总时长:{{ totalTime }}</div>
    <div>
      <el-button type="primary" @click="playMusic">
        <i v-if="play" class="el-icon-video-play"></i>
        <i v-else class="el-icon-video-pause"></i>
        播放 / 暂停
      </el-button>

      <el-button type="primary" @click="stopMusic">
        <i class="el-icon-refresh-left"></i>
        停止
      </el-button>

      <el-button type="primary" @click="retreatMusic">
        <i class="el-icon-d-arrow-left"></i>
        快退
      </el-button>
      <el-button type="primary" @click="enterMusic">
        快进
        <i class="el-icon-d-arrow-right"></i>
      </el-button>

      <div style="width: 200px;">
        音量
        <el-slider v-model="volume" @change="changeVolume"></el-slider>
      </div>

      <el-button type="primary" @click="reSlowDownMusic">
        <i class="el-icon-remove-outline"></i>
        减速
      </el-button>
      <span>{{ speed }}</span>
      <el-button type="primary" @click="accelerateMusic">
        加速
        <i class="el-icon-circle-plus-outline"></i>
      </el-button>

      <div>
        从第
        <el-input-number v-model="time"></el-input-number>
        秒开始播放
        <el-button type="primary" @click="timeMusic">
          <i class="el-icon-caret-right"></i>
          开始
        </el-button>
      </div>
    </div>
  </div>
</template>
<script>
import WaveSurfer from "wavesurfer.js";
import Timeline from "wavesurfer.js/dist/plugins/timeline.js";
import Regions from "wavesurfer.js/dist/plugins/regions.js";

export default {
  name: "Details",
  data() {
    return {
      wavesurfer: null,
      play: true,
      volume: 1,
      speed: 1,
      time: 0,
      totalTime: 0,
    };
  },
  mounted() {
    this.$nextTick(() => {
      const regions = Regions.create();
      this.wavesurfer = WaveSurfer.create({
        container: "#waveform", // 波形图的容器
        barWidth: 1, // 波形条的宽度
        cursorColor: "black", // 播放进度光标条的颜色
        progressColor: "blue", // 已播放波形的颜色
        backend: "MediaElement",
        audioRate: "1", // 音频的播放速度
        // height: 10, // 波形图的高度 单位px
        // scrollParent: true, // 是否显示滚动条
        // barHeight: 0.8, // 波形的振幅(高度),默认为1
        // barRadius: 2, // 波形条的圆角
        // barWidth: 1, // 波形条的宽度
        // barGap: 3, // 波形条间的间距
        plugins: [
          Timeline.create({
            timeInterval: 5,
            primaryLabelInterval: 10, // 数字标签之间的间隔(秒)
            style: { // 自定义内联样式以应用于容器
              fontSize: "10px",
              color: "#6A3274",
            },
          }),
          regions,
        ],
      });
      this.wavesurfer.on("ready", () => {
        // 当wavesurfer准备好后,获取总时长
        this.totalTime = this.getMinute(this.wavesurfer.getDuration());
        this.volume = this.wavesurfer.getVolume() * 100;
      });

      // 范围
      const random = (min, max) => Math.random() * (max - min) + min;
      const randomColor = () =>
        `rgba(${random(0, 255)}, ${random(0, 255)}, ${random(0, 255)}, 0.5)`;
      this.wavesurfer.on("decode", () => {
        // regions
        regions.addRegion({
          start: 10, // 开始位置
          end: 60, // 结束位置
          content: "范围1", // 内容
          color: randomColor(), // 颜色
          drag: false, // 是否可拖动
          resize: false, // 是否可改变大小
        });
        regions.addRegion({
          start: 80,
          end: 120,
          content: "范围2",
          color: randomColor(),
          drag: false,
          resize: false,
        });
        regions.addRegion({
          start: 160,
          content: "Marker",
          color: randomColor(),
        });
      });

      regions.on("region-clicked", (region, e) => {
        e.stopPropagation(); // prevent triggering a click on the waveform
        region.play();
        region.setOptions({ color: randomColor() });
      });
      // 特别提醒:此处需要使用require(相对路径),否则会报错
      this.wavesurfer.load(require("../assets/测试文档/music.mp3"));
    });
  },
  methods: {
    getMinute(second) {
      const totalMinutes = Math.floor(second / 60);
      const remainingSeconds = Math.round((second % 60) * 100) / 100; // 保留两位小数
      return `${totalMinutes}:${remainingSeconds}`;
    },
    // 播放 / 暂停
    playMusic() {
      this.play = !this.play;
      this.wavesurfer.playPause.bind(this.wavesurfer)();
    },
    // 停止
    stopMusic() {
      this.wavesurfer.stop();
    },
    // 快退
    retreatMusic() {
      // 从当前位置向后快进2秒播放
      this.wavesurfer.skip(-2);
    },
    // 快进
    enterMusic() {
      // 从当前位置向后快进2秒播放
      this.wavesurfer.skip(2);
    },
    // 音量参数为0-1
    changeVolume(val) {
      let num = val * 0.01;
      this.wavesurfer.setVolume(num);
    },
    // 减速
    reSlowDownMusic() {
      if (this.speed > 1) {
        this.speed--;
        this.wavesurfer.setPlaybackRate(this.speed);
      }
    },
    // 加速
    accelerateMusic() {
      if (this.speed < 6) {
        this.speed++;
        this.wavesurfer.setPlaybackRate(this.speed);
      }
    },
    // 跳转到指定时间
    timeMusic() {
      this.wavesurfer.setTime(this.time);
      this.wavesurfer.play();
    },
  },
};
</script>
<style scoped lang="scss">
.mixin-components-container {
  width: 100% !important;
  padding: 30px;
  /* min-height: calc(100vh - 84px); */
}
.el-card__body {
  height: 70px !important;
  padding: 0 auto !important;
  .card {
    height: 70px;
    #waveform {
      wave {
        height: 50px !important;
      }
    }
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

004——双向链表和循环链表

目录 双向链表 双向链表的初始化&#xff08;与单链表类似&#xff09; 增&#xff1a; Ⅰ&#xff09;头插法 Ⅱ&#xff09;尾插法 Ⅲ&#xff09;中间插入 删 改 查 整体代码示例&#xff1a; 循环链表 循环单链表 ​编辑 循环双链表 双向链表 不同于单链表&…

亲测可用导航网站源码分享 – 幽络源

幽络源为大家分享一套经过亲测可用的导航网站源码。初看这套PHP源码时&#xff0c;其数据库结构更像是商城系统源码&#xff0c;但经过某位小天才的修改&#xff0c;它已变成一个功能完备的导航网站。经过站长的测试&#xff0c;该源码运行良好&#xff0c;简单部署即可使用&am…

基于springboot的在线租房系统设计与实现

项目描述 这是一款基于springboot的在线租房系统 截图

438.找到字符串中所有字母异位词

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 很容易想到&#xff0c;这个题目要求我们在字符串s中找到一个定长的窗口让窗口里面出现异位词。 OK&#xff0c;先思考一下怎么快速判断两个字符串是否是异位词&#xff1f; 比较简单的方法是…

AV1 Bitstream Decoding Process Specification:约定

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

ubuntu配置tftp、nfs

tftp配置 tftp是简单文件传输协议&#xff0c;基于udp实现传输。这里的简单文件&#xff0c;指的是不复杂、开销不大的文件。 先在ubuntu中安装tftp&#xff0c;输入命令&#xff1a;sudo apt-get install tftp-hpa tftpd-hpa。 接着配置tftp。 输入命令&#xff1a;sudo v…

div内英文不换行问题以及解决方案

div内英文不换行问题以及解决方案 div盒子中文字换行问题&#xff1a;div中放中文的代码&#xff1a;div中放英文的代码&#xff1a; 解决办法注意 div盒子中文字换行问题&#xff1a; div设置宽度以后&#xff0c;如果div中放的是中文&#xff0c;默认文字超过div宽度会自动换…

GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断

GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断 目录 GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断分类效果格拉姆矩阵图 基本介绍程序设计参考资料 分类效果 格拉姆矩阵图 基本介绍 1.Matlab实现GAF-PCNN-Bi…

Kerberos:更安全的网络认证协议

简介 Kerberos 是一种网络认证协议&#xff0c;主要用于特定的场景下&#xff0c;代替传统的token方式&#xff0c;以一种更繁琐&#xff0c;但更安全的方式来认证用户信息。它通过票据 (ticket) 机制&#xff0c;确保用户在网络中与服务之间进行加密通信&#xff0c;并且避免…

【云备份】可视化客户端----QT开发➕QT数据库编程

文章目录 一、 需求分析二、 概念结构设计三、逻辑结构设计1. 用户表 (users)2. 客户端本地文件信息表 (upload_files)3. 备份记录表 (backup_records)4. 服务端备份文件信息表 (backup_files) 四、 开发工具五、具体实现&#xff08;一&#xff09; 客户端程序运行演示 一、 需…

7.科学计算模块Numpy(4)ndarray数组的常用操作(二)

引言 书接上回&#xff0c;numpy能作为python中最受欢迎的数据处理模块&#xff0c;脱离不了它最核心的部件——ndarray数组。那么&#xff0c;我们今天就来了解一下numpy中对ndarray的常用操作。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.掌握ndarray数组的分割 …

shader 案例学习笔记之smoothstep函数

参考&#xff1a;smoothstep 用来生成0-1的平滑过渡值 smoothstep函数源码实现&#xff1a; float smoothstep(float t1, float t2, float x) {// Scale, bias and saturate x to 0..1 rangex clamp((x - t1) / (t2 - t1), 0.0, 1.0); // Evaluate polynomialreturn x * x *…

@rem和rem用法和区别

在Windows的命令提示符&#xff08;cmd&#xff09;中&#xff0c;rem和rem都是用来注释批处理脚本的。 用法&#xff1a; rem&#xff1a;在一行的开头使用&#xff0c;注释只对当前行有效。rem&#xff1a;也在一行的开头使用&#xff0c;注释会一直持续到下一行。 区别&a…

基于SpringBoot的在线汽车租赁信息管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的在线汽车租赁信息…

STM32 HAL freertos零基础(五) STM32CubeMX配置完成后自定义二值信号量 解决二值信号量初始值为1问题

1、简介 通过上文虽然实现了二值信号量实战&#xff0c;但每次配置STM32CubeMX二值信号量都恢复默认值1&#xff0c;为了解决该问题&#xff0c;对于二值信号量通过CubeMX配置完成后&#xff0c;在程序内自定义二值信号量。 2、文件建立 建立BinarySem文件夹添加BinarySem.c…

Selenium自动化测试网页加载太慢如何解决(超详细)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 遇到网页加载慢&#xff0c;selenium运行效率降低&#xff0c;可以通过修改页面加载策略提升自动化效率。 selenium加载很慢 通过URL导航到新页面时&#xff0c;…

利用平板电脑和谷歌浏览器进行在线教育学习

在数字化时代&#xff0c;教育的形式越来越多样化&#xff0c;特别是在线教育的兴起为学习带来了前所未有的便利。对于经常在平板电脑上进行学习的用户来说&#xff0c;谷歌浏览器提供了强大的功能&#xff0c;帮助用户更有效地学习。本文将指导您如何在使用平板电脑和谷歌浏览…

系统工程建模MBSE

################################# ############# 片段一 ############## ################################# 下图采用“V”模式显示了集成的基于模型的系统/嵌入式软件开发流程Harmony。左侧描述了自顶向下的设计流程,而右侧显示了自底而上的从单元测试到最终系统验收测试…

‌语音控制小夜灯的实现方案介绍

‌语音控制小夜灯的实现方案组成部分‌ 语音控制小夜灯的实现方案主要包括硬件组装和软件编程两个部分。‌ ‌硬件组装‌涉及将语音声控模块、灯泡、USB连接线等组件正确连接。首先&#xff0c;使用螺丝刀和螺丝将四个隔离柱固定在底板四个拐角处&#xff0c;同时将语音声控模…

Linux CentOS更换阿里云源解决Could not retrieve mirrorlist http://mirrorlist.centos.org

Linux CentOS7 更新yum 操作的时候出现这个问题&#xff1a; Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org 然后我执行 grep -nr "mirrorlist.centos.org" /etc/yum.repos.d/* 出现 这个问题时可以…