草庐IT

vue 绘制波形图 wavesurfer.js (音频/视频) 【实用教程】

朝阳39 2023-05-20 原文

安装 wavesurfer.js

cnpm i wavesurfer.js --save

无 cnpm 的先运行 npm i cnpm -g 全局安装 cnpm

绘制音频波形图


常用的配置参数详见注释。

<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
      });

      this.wavesurfer.load(require("./《祝福你》群星_粤语.mp3"));
    });
  },
  methods: {
    playMusic() {
      this.wavesurfer.playPause.bind(this.wavesurfer)();
      this.playing = !this.playing;
    },
  },
};
</script>
<style scoped>
</style>

常用方法

播放/暂停

this.wavesurfer.playPause();

停止播放(播放进度光标回到音频起点)

this.wavesurfer.stop();

快进/快退播放

// 从当前位置向后快进2秒播放
this.wavesurfer.skip(2);
// 从当前位置向后快退2秒播放
this.wavesurfer.skip(-2);

改变音量

参数值为0到1
– 0为静音
– 0.5为一半音量
– 1为最高音量

this.wavesurfer.setVolume(0.5);

改变音频播放速度

默认为1

this.wavesurfer.setPlaybackRate(2)

缩放波形图

参数是每秒音频的水平像素数。它还会更改参数minPxPerSec并启用该 scrollParent选项。

this.wavesurfer.zoom(88

指定播放范围

从第10秒开始播放

this.wavesurfer.play(10);

播放第1-10秒之间的音频

this.wavesurfer.play(1, 10);

获取当前播放位置

this.wavesurfer.getCurrentTime()

获取音频片段的持续时间

this.wavesurfer.getDuration(); 

其他方法

创建播放实例后调用

  • cancelAjax() – 取消音频文件加载过程。
  • destroy() – 删除事件、元素并断开 Web 音频节点。
  • empty() – 清除波形,就像加载了零长度音频一样。
  • getActivePlugins() – 返回当前初始化的插件名称映射。
  • getBackgroundColor() – 返回波形容器的背景颜色。
  • getCursorColor() – 返回指示播放头位置的光标的填充颜色。
  • getPlaybackRate() – 返回音频剪辑的播放速度。
  • getProgressColor() – 返回光标后面波形的填充颜色。
  • getVolume() – 返回当前音频剪辑的音量。
  • getMute() – 返回当前静音状态。
  • getFilters() – 返回当前设置过滤器的数组。
  • getWaveColor() – 返回光标后波形的填充颜色。
  • exportPCM(length, accuracy, noWindow, start)– 将 PCM 数据导出为 JSON 数组。可选参数length [number] - default: 1024, accuracy [number] - default: 10000, noWindow [true|false] - default: false,start [number] - default: 0
  • exportImage(format, quality, type) – 将波形图像作为数据 URI 或 Blob 返回。
  • isPlaying()–true如果当前正在播放则返回,否则返回false。
  • load(url, peaks, preload)–URL通过 XHR加载音频。的可选数组peaks。可选preload参数[none|metadata|auto],如果使用后端 MediaElement ,则传递给Audio 元素。
  • loadBlob(url)– 从Blob或File对象加载音频。
  • on(eventName, callback)– 订阅事件。
  • un(eventName, callback) – 取消订阅事件。
  • unAll() – 取消订阅所有事件。
  • pause() – 暂停播放。
  • seekAndCenter(progress)– 寻求进度和中心视图[0…1](0 = 开始,1 = 结束)。
  • seekTo(progress)– 寻求进步[0…1](0 = 开始,1 = 结束)。
  • setBackgroundColor(color) – 设置波形容器的背景颜色。
  • setCursorColor(color) – 设置指示播放头位置的光标的填充颜色。
  • setHeight(height) – 设置波形的高度。
  • setFilter(filters)- 用于将您自己的 WebAudio 节点插入图中。请参阅下面的连接过滤器。
  • setPlayEnd(position) – 设置播放停止点(以秒为单位)。
  • setMute(mute)– 静音当前声音。可以是true静音或false取消静音的布尔值
  • setProgressColor(color) – 设置光标后面波形的填充颜色。
  • setWaveColor(color) – 设置光标后波形的填充颜色。
  • skipBackward()- 倒带skipLength秒。
  • skipForward()- 跳过skipLength几秒钟。
  • setSinkId(deviceId) - 设置接收器 ID 以更改音频输出设备。
  • toggleMute() – 打开和关闭音量。
  • toggleInteraction() – 切换鼠标交互。
  • toggleScroll()– 切换scrollParent。

常用事件

使用on()和un() 方法订阅和取消订阅各种播放器事件

  • audioprocess– 在音频播放时持续触发。也在寻找上火。
  • dblclick – 双击实例时。
  • destroy – 当实例被销毁时。
  • error– 发生错误。回调将收到(字符串)错误信息。
  • finish – 当它完成播放时。
  • interaction – 与波形交互时。
  • loading– 使用 fetch 或 drag’n’drop 加载时连续触发。回调将以百分比 [0…100] 接收(整数)加载进度。
  • mute– 静音更改。回调将收到(布尔值)新的静音状态。
  • pause – 音频暂停时。
  • play – 播放开始时。
  • ready– 加载音频、解码并绘制波形时。使用 MediaElement 时,这会在绘制波形之前触发,请参阅waveform-ready。
  • scroll- 当滚动条移动时。回调将接收一个ScrollEvent对象。
  • seek– 在寻求。回调将收到(浮动)进度[0…1]。
  • volume– 关于音量变化。回调将接收(整数)新卷。
  • waveform-ready– 在使用 MediaElement 后端绘制波形后触发。如果您使用的是 - - - WebAudio 后端,则可以使用ready.
  • zoom– 关于缩放。回调将接收(整数)minPxPerSec。

自动播放

      this.wavesurfer.load(require("./《祝福你》群星_粤语.mp3"));

      // 自动播放
      let that = this;
      this.wavesurfer.on("ready", function () {
        that.wavesurfer.play();
      });

谷歌浏览器默认禁止音频自动播放,解除此设置的方法为:
https://blog.csdn.net/weixin_41192489/article/details/127671295

插件–时间轴

<template>
  <div style="padding: 30px">
    <div ref="waveform_Ref"></div>
    <div ref="timeline_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";
 //导入插件--时间轴
import Timeline from "wavesurfer.js/dist/plugin/wavesurfer.timeline.js";

export default {
  data() {
    return {
      wavesurfer: null,
      playing: false,
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.wavesurfer = WaveSurfer.create({
        container: this.$refs.waveform_Ref,
        plugins: [
           //插件--时间轴的配置
          Timeline.create({
            container: this.$refs.timeline_Ref,
            fontSize: 14,
            //主要时间标签颜色
            primaryColor: "#9191a5",
            //主要时间文字颜色
            primaryFontColor: "#9191a5",
            //次要时间标签颜色
            secondaryColor: "#9191a5",   
            //次要时间文字颜色
            secondaryFontColor: "#9191a5",
            }),
        ],
      });
      this.wavesurfer.load(require("./《祝福你》群星_粤语.mp3"));
    });
  },
  methods: {
    playMusic() {
      this.wavesurfer.playPause();
      this.playing = !this.playing;
    },
  },
};
</script>

插件–指针轴

<template>
  <div style="padding: 30px">
    <div ref="waveform_Ref"></div>
  </div>
</template>

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

export default {
  data() {
    return {
      wavesurfer: null,
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.wavesurfer = WaveSurfer.create({
        container: this.$refs.waveform_Ref,
        plugins: [
          // 插件--指针轴的配置
          CursorPlugin.create({
            showTime: true,
            opacity: 1,
            customShowTimeStyle: {
              "background-color": "#000",
              color: "#fff",
              padding: "2px",
              "font-size": "10px",
            },
          }),
        ],
      });
      this.wavesurfer.load(require("./《祝福你》群星_粤语.mp3"));
    });
  },
};
</script>

插件–标注

<template>
  <div style="padding: 30px">
    <div ref="waveform_Ref"></div>
  </div>
</template>

<script>
import WaveSurfer from "wavesurfer.js";
// 导入插件--标注
import markers from "wavesurfer.js/dist/plugin/wavesurfer.markers.js";
export default {
  data() {
    return {
      wavesurfer: null,
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.wavesurfer = WaveSurfer.create({
        container: this.$refs.waveform_Ref,
        plugins: [
          // 插件--标注的配置
          markers.create({
            markers: [
              {
                time: 15,
                label: "第15秒",
                color: "red",
              },
              {
                time: 40,
                label: "第40秒",
                color: "blue",
                position: "top",
              },
            ],
          }),
        ],
      });
      this.wavesurfer.load(require("./《祝福你》群星_粤语.mp3"));
    });
  },
};
</script>

新增标注

      this.wavesurfer.addMarker({
        time: 60,
        label: "第60秒",
        color: "blue",
        position: "top",
      });

插件–区域

官方文档 https://wavesurfer-js.org/plugins/regions.html

<template>
  <div style="padding: 30px">
    <div ref="waveform_Ref"></div>
  </div>
</template>

<script>
import WaveSurfer from "wavesurfer.js";
// 导入插件--区域
import RegionsPlugin from "wavesurfer.js/dist/plugin/wavesurfer.regions.min.js";
export default {
  data() {
    return {
      wavesurfer: null,
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.wavesurfer = WaveSurfer.create({
        container: this.$refs.waveform_Ref,
        plugins: [
          // 插件--区域的配置
          RegionsPlugin.create({
            regionsMinLength: 2,
            regions: [
              {
                start: 10,
                end: 30,
                loop: false,
                color: "hsla(400, 100%, 30%, 0.5)",
              },
              {
                start: 50,
                end: 70,
                loop: false,
                color: "hsla(200, 50%, 70%, 0.4)",
                minLength: 1,
                maxLength: 5,
              },
            ],
            dragSelection: {
              slop: 5,
            },
          }),
        ],
      });
      this.wavesurfer.load(require("./《祝福你》群星_粤语.mp3"));
    });
  },
};
</script>

新增区域

 this.wavesurfer.addRegion({
        start: 2, // 区域开始时间
        end: 10,// 区域结束时间
        color: "red",// 区域颜色
        drag: false,// 是否可拖拽
        loop: false,// 是否循环播放
        resize: false,// 是否可改变大小
        minLength: 1, // 区域最小值
        maxLength: 5, // 区域最大值
      });

清除区域

this.wavesurfer.clearRegions()

绘制视频波形图

https://wavesurfer-js.org/example/video-element/index.html

绘制渐变色的炫彩波形图

https://wavesurfer-js.org/example/gradient-fill-styles/index.html

改变左右声道

https://wavesurfer-js.org/example/panner/index.html

更多功能

详见官网文档 https://wavesurfer-js.org/docs/

实战范例

有关vue 绘制波形图 wavesurfer.js (音频/视频) 【实用教程】的更多相关文章

  1. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  2. ruby - Ruby 中的波形可视化 - 2

    我即将开始一个将录制和编辑音频文件的项目,我正在寻找一个好的库(最好是Ruby,但会考虑Java或.NET以外的任何库)以进行实时可视化波形。有人知道我应该从哪里开始搜索吗? 最佳答案 要流入浏览器的数据量很大。Flash或Flex图表可能是唯一能提高内存效率的解决方案。Javascript图表往往会因大型数据集而崩溃。 关于ruby-Ruby中的波形可视化,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  5. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  6. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  7. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  8. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  9. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  10. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

随机推荐