安装 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();
创建播放实例后调用
常用事件
使用on()和un() 方法订阅和取消订阅各种播放器事件
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/
实战范例
我想用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中编写命令行实用程序
我即将开始一个将录制和编辑音频文件的项目,我正在寻找一个好的库(最好是Ruby,但会考虑Java或.NET以外的任何库)以进行实时可视化波形。有人知道我应该从哪里开始搜索吗? 最佳答案 要流入浏览器的数据量很大。Flash或Flex图表可能是唯一能提高内存效率的解决方案。Javascript图表往往会因大型数据集而崩溃。 关于ruby-Ruby中的波形可视化,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
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
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa