Wavesurfer.js绘制波形图

HTML使用Wavesurfer.js

要使用wavesurfer.js,首先需要在HTML文件中引入Wavesurfer.js库,然后创建一个音频元素并将其添加到页面中。接下来,初始化Wavesurfer实例并配置相关选项。以下是一个简单的示例:

  1. 在HTML文件中引入Wavesurfer.js库:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Wavesurfer.js 示例</title>
        <!-- 引入Wavesurfer.js库 -->
        <script src="https://unpkg.com/wavesurfer.js"></script>
    </head>
    <body>
        <!-- 创建一个音频元素 -->
        <audio id="audio" src="your-audio-file.mp3"></audio>
        <!-- 创建一个用于显示波形的容器 -->
        <div id="waveform"></div>
    
        <script>
            // 获取音频元素和容器元素
            var audio = document.getElementById('audio');
            var waveform = document.getElementById('waveform');
    
            // 初始化Wavesurfer实例
            var wavesurfer = WaveSurfer.create({
                container: '#waveform', // 指定波形容器的ID
                waveColor: 'violet', // 设置波形颜色
                progressColor: 'purple' // 设置进度条颜色
            });
    
            // 当音频文件加载完成后,开始播放并绘制波形
            audio.addEventListener('canplaythrough', function () {
                wavesurfer.load(audio);
                wavesurfer.play();
            });
        </script>
    </body>
    </html>
    
  2. your-audio-file.mp3替换为你要使用的音频文件路径。

  3. 打开浏览器,查看效果。

 Vue项目中使用Wavesurfer.js

  1. 打开终端或命令提示符。
  2. 使用cd命令导航到Vue项目的根目录。
  3. 运行以下命令来安装wavesurfer.js:
    
npm install wavesurfer.js --save

4. 在Vue组件中引入并使用wavesurfer.js。例如,在components/YourComponent.vue文件中:

<template>
  <div>
    <!-- 在这里添加你的代码 -->
  </div>
</template>

<script>
import WaveSurfer from 'wavesurfer.js';

export default {
  name: 'YourComponent',
  mounted() {
    this.initWavesurfer();
  },
  methods: {
    initWavesurfer() {
      const waveform = document.getElementById('waveform');
      this.wavesurfer = WaveSurfer.create({
        container: waveform,
        waveColor: 'violet',
        progressColor: 'purple'
      });

      this.wavesurfer.load(this.audio);
      this.wavesurfer.play();
    }
  }
};
</script>

5.确保在HTML文件中有一个用于显示波形的容器,例如:

<div id="waveform"></div>

 6.将音频文件添加到Vue组件的data属性中,例如:

data() {
  return {
    audio: 'your-audio-file.mp3'
  };
}

现在,当你运行Vue项目时,wavesurfer.js应该已经成功下载并在页面上显示波形。

案例一

<template>
  <div style="padding: 30px">
    <div ref="waveform_Ref"></div>
    <div style="padding: 30px">
      <el-button
        type="primary"
        size="small"
        icon="el-icon-video-play"
        @click="playMusic"
        v-if="!playing"
      >
        播放 </el-button
      ><el-button
        v-if="playing"
        type="primary"
        size="small"
        icon="el-icon-video-pause"
        @click="playMusic"
      >
        暂停
      </el-button>
    </div>
  </div>
</template>

<script>
import WaveSurfer from "wavesurfer.js";

export default {
  data() {
    return {
      wavesurfer: null,
      playing: false,
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.wavesurfer = WaveSurfer.create({
        // 波形图的容器
        container: this.$refs.waveform_Ref,
        // 已播放波形的颜色
        // progressColor: "red",
        // 未播放波形的颜色
        // waveColor: "lightgrey",
        // 波形图的高度,单位为px
        // height: 10,
        // 是否显示滚动条,默认为false
        // scrollParent: true,
        // 波形的振幅(高度),默认为1
        // barHeight: 0.8,
        // 波形条的圆角
        // barRadius: 2,
        // 波形条的宽度
        // barWidth: 1,
        // 波形条间的间距
        // barGap: 3
        // 播放进度光标条的颜色
        // cursorColor: "red",
        // 播放进度光标条的宽度,默认为1
        // cursorWidth: 10,
        // 播放进度颜色
        // progressColor: "blue",
        //  波形容器的背景颜色
        // backgroundColor: "yellow",
        // 音频的播放速度
        // audioRate: "1",
        // (与区域插件一起使用)启用所选区域的循环
        // loopSelection:false
      });
      const audioFile = require("../assets/03.mp4");
    this.wavesurfer.load(audioFile);
    });
  },
  methods: {
    playMusic() {
      this.wavesurfer.playPause.bind(this.wavesurfer)();
      this.playing = !this.playing;
    },
  },
};
</script>
<style scoped>
</style>

案例二

<template>
  <div class="mixin-components-container">
    <el-row>
      <el-card class="box-card" style="text-align: left">
        <div id="waveform" ref="waveform">
          <!-- Here be the waveform -->
        </div>
        <div id="wave-timeline" ref="wave-timeline">
          <!--时间轴 -->
        </div>
        <div class="buttonBox">
          <el-button type="primary" @click="rew">后退</el-button>
          <el-button type="primary" @click="plays">
            <i class="el-icon-video-play"></i>
            播放 /
            <i class="el-icon-video-pausee"></i>
            暂停
          </el-button>
          <el-button type="primary" @click="speek">前进</el-button>
          <el-button type="primary" @click="replay">重放</el-button>
          <el-tooltip
            class="item"
            effect="dark"
            content="指定播放"
            placement="bottom"
          >
            <el-popover placement="top" width="200" trigger="click">
              <el-input
                v-model="appointTime"
                placeholder="请输入内容"
                class="input-with-select"
              >
                <el-button slot="append" @click="appointPlay">播放</el-button>
              </el-input>
              <el-button slot="reference" circle> 指定播放 </el-button>
            </el-popover>
          </el-tooltip>
          <span
            style="
              border: 2px solid #2f4f4f;
              margin-left: 8px;
              margin-right: 4px;
            "
          />
          <el-tooltip
            class="item"
            effect="dark"
            content="音量"
            placement="bottom"
          >
            <el-popover
              placement="top-start"
              trigger="click"
              style="min-width: 38px; margin-left: 10px"
            >
              <div class="block" style="width: 42px">
                <el-slider
                  v-model="value"
                  vertical
                  height="100px"
                  @change="setVolume"
                />
              </div>
              <el-button slot="reference" circle> 音量 </el-button>
            </el-popover>
          </el-tooltip>
          <el-tooltip
            class="item"
            effect="dark"
            content="播放倍速"
            placement="bottom"
          >
            <el-popover
              placement="top"
              width="220"
              trigger="click"
              style="margin-left: 10px"
            >
              <el-input-number
                v-model="ds"
                width="180"
                :precision="2"
                :step="0.1"
                :min="0.5"
                :max="2"
                @change="DoubleSpeed"
              />
              <el-button slot="reference" round>
                {{ ds + " X" }}
              </el-button>
            </el-popover>
          </el-tooltip>
        </div>
      </el-card>
    </el-row>
  </div>
</template>
<script>
import WaveSurfer from "wavesurfer.js";
// import CursorPlugin from "wavesurfer.js/dist/plugins/wavesurfer.cursor.js";
import Timeline from "wavesurfer.js/dist/plugins/timeline.js";
export default {
  // name: "Details",
  // components: { MyWaveSurfer },
  data() {
    return {
      wavesurfer: null,
      // 指定播放功能的播放时间点
      appointTime: 1,
      // 播放倍速
      ds: 1.0,
      // 设置音量
      value: 0,
    };
  },
  mounted() {
    this.$nextTick(() => {
      console.log(WaveSurfer);
      this.wavesurfer = WaveSurfer.create({
        // 应该在其中绘制波形的CSS选择器或HTML元素。这是唯一必需的参数。
        container: this.$refs.waveform,
        // 光标的填充颜色,指示播放头的位置。
        cursorColor: "red",
        // 更改波形容器的背景颜色。
        backgroundColor: "gray",
        // 光标后的波形填充颜色。
        waveColor: "violet",
        // 光标后面的波形部分的填充色。当progressColor和waveColor相同时,完全不渲染进度波
        progressColor: "purple",
        backend: "MediaElement",
        // 音频播放时间轴
        mediaControls: false,
        // 播放音频的速度
        audioRate: "1",
        // 插件:此教程配置了光标插件和时间轴插件
        plugins: [
          // 光标插件
          // CursorPlugin.create({
          //   showTime: true,
          //   opacity: 1,
          //   customShowTimeStyle: {
          //     "background-color": "#000",
          //     color: "#fff",
          //     padding: "2px",
          //     "font-size": "10px",
          //   },
          // }),
          // 时间轴插件
          Timeline.create({
            container: "#wave-timeline",
          }),
        ],
      });
      this.wavesurfer.on("error", function (e) {
        console.warn(e);
      });
      this.wavesurfer.load(require("../assets/03.mp4"));
    });
  },
  methods: {
    // 播放时暂停,播放时暂停
    plays() {
      this.wavesurfer.playPause();
    },
    // 后退,
    rew() {
      this.wavesurfer.skip(-3);
    },
    // 前进,
    speek() {
      this.wavesurfer.skip(3);
    },
    // 重放
    replay() {
      this.wavesurfer.stop();
    },
    // 设置音量:
    setVolume(val) {
      this.wavesurfer.setVolume(val / 100);
    },
    // 指定播放
    appointPlay() {
      this.wavesurfer.play([this.appointTime]);
    },
  },
};
</script>
<style scoped>
.mixin-components-container {
  background-color: #f0f2f5;
  padding: 30px;
  min-height: calc(100vh - 84px);
  box-sizing: border-box;
}
.buttonBox {
    margin-top: 20px;
    display: flex;
    justify-content: center;
}
</style>

 我没找到wavesurfer.cursor.js文件,就注释了

参考

Wavesurfer.js 生成音浪波形图(vue) - 简书

vue 绘制波形图 wavesurfer.js (音频/视频) 【实用教程】_朝阳39的技术博客_51CTO博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

瑞幸咖啡用户运营的秘诀是什么?普通用户通过数据分析也能得到答案!

大数据产业创新服务媒体 ——聚焦数据 改变商业 在快速发展的数字经济时代&#xff0c;BI已成为企业决策过程中不可或缺的工具。通过高效地收集、处理和分析海量数据&#xff0c;BI技术赋予企业洞察市场动态、优化运营策略、提升客户体验的能力。与人工智能、大数据和云计算的…

碳排放预测 | 基于ARIMA和GM(1,1)的碳排放预测(Matlab)

目录 预测效果基本介绍模型描述ARIMA模型GM(1,1)模型 程序设计参考资料 预测效果 基本介绍 基于ARIMA和GM(1,1)的碳排放预测&#xff08;Matlab&#xff09; 基于ARIMA&#xff08;自回归移动平均模型&#xff09;和GM(1,1)&#xff08;灰色预测模型&#xff09;的碳排放预测是…

如何自定义右键弹框并实现位置自适应?

一、问题 右键显示弹框&#xff0c;但是靠近浏览器边缘的部分会被隐藏&#xff0c;需要实现弹框位置自适应 二、 问题分析 如果想要最终弹框的宽高不超过屏幕视口&#xff0c;就等于屏幕视口的总宽/高减去弹框打开时的起点坐标&#xff0c;剩下的部分大于等于弹框的宽/高&…

智能优化算法应用:基于猎食者算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于猎食者算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于猎食者算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.猎食者算法4.实验参数设定5.算法结果6.参考文…

flutter开发实战-设置bottomNavigationBar中间按钮悬浮效果

flutter开发实战-设置bottomNavigationBar中间按钮悬浮的效果 在使用tabbar时候&#xff0c;可以使用bottomNavigationBar来设置中间凸起的按钮&#xff0c;如下 一、效果图 中间按钮凸起的效果图如下 二、实现代码 我们使用BottomAppBar 一个容器&#xff0c;通常与[Sscaf…

【Redis】六、Redis发布订阅

文章目录 1、订阅/发布消息图&#xff1a;2、Redis命令3、测试订阅端:发送端: 3、原理vx公众号发文章 4、使用场景 参考&#xff1a;狂神说Java 在之前的线程通信概念中&#xff0c;也有一个队列&#xff0c;发送者线程把消息发给接收者线程。 Redis 发布订阅(pub/sub)是一种消…

后台留言列表

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>后台管理系统</title> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta http-equiv"Acc…

步兵 cocos2dx 加密和混淆

文章目录 摘要引言正文代码加密具体步骤代码加密具体步骤测试和配置阶段IPA 重签名操作步骤 总结参考资料 摘要 本篇博客介绍了针对 iOS 应用中的 Lua 代码进行加密和混淆的相关技术。通过对 Lua 代码进行加密处理&#xff0c;可以确保应用代码的安全性&#xff0c;同时提高性…

java设计模式学习之【命令模式】

文章目录 引言命令模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用股票示例代码地址 引言 想象一下&#xff0c;你在一个忙碌的厨房里&#xff0c;厨师们正忙于准备各种菜肴。每当服务员带来一个新订单时&#xff0c;他们不会直接对厨师说需要做什么菜。相…

Elasticsearch Reroute API 的使用

本文通过一个 Elasticsearch 集群中主分片分配不均衡的例子演示一下 Cluster reroute API 的使用。 对于 Elasticsearch 分片分配策略不了解的同学可以点一下关注&#xff0c;后面更文之后获取第一手资料。 环境信息 Windows 10 Elasticsearch 8.1 JDK17 初始集群状态 分片…

在Jetpack Compose中使用ExoPlayer进行直播流和音频均衡器

在Jetpack Compose中使用ExoPlayer进行直播流和音频均衡器 背景 ExoPlayer与Media3的能力结合&#xff0c;为Android应用程序播放多媒体内容提供了强大的解决方案。在本教程中&#xff0c;我们将介绍如何设置带有Media3的ExoPlayer来支持使用M3U8 URL进行直播流。此外&#x…

17个常用经典数据可视化图表与冷门图表

数据可视化是创建信息图形表示的过程。随着可视化技术的飞速发展&#xff0c;可以利用强大的可视化工具选择合适的数据可视化图表来展示数据。以下专业人士都应该知道的一些最重要的数据可视化图表。 常见数据可视化图表 饼图 饼图是最常见和最基本的数据可视化图表之一。饼图…

C++ 复合数据类型:指针

文章目录 指针用法无效指针空指针void *ptr指向指针的指针指向常量的指针指针常量指针和数组指针数组和数组指针 指针 计算机中的数据都存在内存中&#xff0c;访问内存的最小单元是“字节”&#xff0c;所有数据&#xff0c;就保存在内存中具有连续编号的一串字节中。 指针顾…

python三大开发框架django、 flask 和 fastapi 对比

本文讲述了什么启发了 FastAPI 的诞生&#xff0c;它与其他替代框架的对比&#xff0c;以及从中汲取的经验。 如果不是基于前人的成果&#xff0c;FastAPI 将不会存在。在 FastAPI 之前&#xff0c;前人已经创建了许多工具 。 几年来&#xff0c;我一直在避免创建新框架。首先&…

竞赛保研 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…

Python深度学习029:pytorch中常用的模块或方法

PyTorch是一个广泛使用的深度学习库,提供了许多用于构建和训练神经网络的模块和方法。下面是一些PyTorch中常用的模块和方法的简要介绍: PyTorch常用模块和方法 torch 用途:PyTorch的基础模块,提供了多种数学运算功能。常用方法: torch.tensor():创建张量torch.randn():…

使用for语句换行打印久久乘法表格

一、基本思想 思想来源于九九乘法表&#xff0c;使用*来表示乘法并进行乘法的运算&#xff0c;最大的思想就是双层for循环&#xff0c;最关键的思想是进行里面的第二次for循环时&#xff0c;第二次索引的变量要小于等于第一次索引的变量。 二、 相关代码 public class Jiujiu…

IntelliJ IDEA 2023.3 安装教程

引言 IntelliJ IDEA&#xff0c;通常简称为 IDEA&#xff0c;是由 JetBrains 开发的一款强大的集成开发环境&#xff0c;专为提升开发者的生产力而设计。它支持多种编程语言&#xff0c;包括 Java、Kotlin、Scala 和其他 JVM 语言&#xff0c;同时也为前端开发和移动应用开发提…

实战:使用 OpenCV 和 PyTesseract 对文档进行 OCR

随着世界各地的组织都希望将其运营数字化&#xff0c;将物理文档转换为数字格式是非常常见的。这通常通过光学字符识别 (OCR) 完成&#xff0c;其中文本图像&#xff08;扫描的物理文档&#xff09;通过几种成熟的文本识别算法之一转换为机器文本。当在干净的背景下处理打印文本…

BUUCTF-Crypto合集-WP

获取CTF工具可关注CSJH网络安全团队&#xff0c;回复CTF工具 一眼就解密 下面的字符串解密后便能获得flag&#xff1a;ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30 注意&#xff1a;得到的 flag 请包上 flag{} 提交 大小写字母加数字&#xff0c;而且等于号结尾&#xff0c;bas…