当前位置: 首页 > news >正文

vue绘制语音波形图---wavesurfer.js

文章目录

  • 创建实例
  • options
  • method
  • 接收Blob流

https://wavesurfer.xyz/

创建实例

  1. 引入插件:import WaveSurfer from "wavesurfer.js"
  2. 创建实例对象:`this.wavesurfer = WaveSurfer.create(options);
<div id="waveform"><!-- the waveform will be rendered here -->
</div><script type="module">
import WaveSurfer from 'https://unpkg.com/wavesurfer.js@7/dist/wavesurfer.esm.js'const wavesurfer = WaveSurfer.create({container: '#waveform',waveColor: '#4F4A85',progressColor: '#383351',url: '/audio.mp3',
})wavesurfer.on('interaction', () => {wavesurfer.play()
})

options

WaveSurferOptions: {audioRate?: number; // 音频的播放速度,数值越小越慢autoCenter?: boolean; // 如果有滚动条,将波形根据进度居中autoScroll?: boolean;autoplay?: boolean;backend?: "WebAudio" | "MediaElement";barAlign?: "top" | "bottom";barGap?: number; // 波纹柱状图之间的间距barHeight?: number; // 波纹柱状图的高度,当大于1的时候,将增加设置的高度barRadius?: number; // 波形条的radiusbarWidth?: number; // 如果设置,波纹的样式将变成类似柱状图的形状container: HTMLElement | string; // 必填参数,指定渲染的dom的id名、类名或者dom本身cursorColor?: string; // 鼠标点击的颜色cursorWidth?: number; // 鼠标点击显示的宽度dragToSeek?: boolean;duration?: number;fetchParams?: RequestInit;fillParent?: boolean;height?: number | "auto"; // 音频的显示高度hideScrollbar?: boolean; // 是否隐藏水平滚动条interact?: boolean; // 初始化时是否启用鼠标交互。之后可以随时切换该参数media?: HTMLMediaElement;mediaControls?: boolean; // (与 MediaElement一起使用) 为true则将启动媒体元素的本机控件minPxPerSec?: number; // 音频每秒最小像素数normalize?: boolean; // 如果为true,则以最大峰值而非1.0进行归一化peaks?: (Float32Array | number[])[];plugins?: GenericPlugin[]; // 使用的插件progressColor?: string | string[] | CanvasGradient; // 光标后面的波形部分的填充颜色renderFunction?: ((peaks, ctx) => void);sampleRate?: number;splitChannels?: Partial<WaveSurferOptions>[]; // 对于不同通道的音频使用分开的波形渲染url?: string;waveColor?: string | string[] | CanvasGradient; // 光标后面的波形的填充颜色width?: number | string;
}

method

方法说明
destroy(): void销毁waveform,移除事件,元素和关联节点
empty(): void清空waveform
exportImage(format: string, quality: number, type: "dataURL"): Promise<string[]>
exportImage(format: string, quality: number, type: "blob"): Promise<Blob[]>
exportPeaks(__namedParameters?): number[][]
getActivePlugins(): GenericPlugin[]返回当前已初始化插件的map
getCurrentTime(): number获取当前播放的进度,单位:秒
getDecodedData(): null | AudioBuffer
getDuration(): number获取音频的总时长,单位:秒
getMediaElement(): HTMLMediaElement
getMuted(): boolean返回当前的静音状态.
getScroll(): number
getPlaybackRate(): number返回音频片段的播放速度
getVolume(): number 获取音量
getWrapper(): HTMLElement
isPlaying(): boolean 判断音频是否在播放
isSeeking(): boolean
load(url: string, channelData?: (Float32Array | number[])[] , duration?: number): Promise<void> 加载音频
loadBlob(blob: Blob, channelData?: (Float32Array | number[])[], duration?: number): Promise<void> 从Bolb或者file对象中调用音频
on<EventName>(event: EventName, listener: EventListener<WaveSurferEvents, EventName>, options?): (() => void)
once<EventName>(event, listener): (() => void)
pause(): void停止播放
play(): Promise<void> 从当前位置开始播放音频文件。结合使用start和end可以指定一个音频播放范围
playPause(): Promise<void> 如果当前为状态状态开始播放,反之暂停播放
registerPlugin<T>(plugin): T
seekTo(progress): void
setMediaElement(element: HTMLMediaElement): void
setMuted(muted: boolean): void
setOptions(options: Partial): void
setPlaybackRate(rate: number, preservePitch?: boolean): void
setSinkId(sinkId: string): Promise
setTime(time: number): void
setVolume(volume: number): void设置音量[0-1]
skip(seconds: number): void调到offset的位置
stop(): void停止播放并回到音频文件的起始处
toggleInteraction(isInteractive: boolean): void
un<EventName>(event, listener): void解绑事件
unAll(): void
zoom(minPxPerSec: number): void水平放大或缩小波形,参数是每秒音频的水平像素

接收Blob流

通过XMLHttpRequest对象向后端发出请求,获取音频数据的blob流。然后通过WaveSurfer.create()方法创建一个wavesurfer实例,传入一个容器元素和一些配置选项。最后调用loadBlob()方法将blob数据传递给wavesurfer进行处理。这样就可以在前端使用wavesurfer.js处理后端传递过来的音频数据了。

var xhr = new XMLHttpRequest();
xhr.open('GET', '/audio', true);
xhr.responseType = 'blob';
xhr.onload = function() {if (this.status == 200) {var blob = this.response;// 使用wavesurfer.js处理音频数据var wavesurfer = WaveSurfer.create({container: '#waveform',backend: 'MediaElement',mediaType: 'audio',waveColor: 'blue',progressColor: 'purple',cursorColor: 'navy'});wavesurfer.loadBlob(blob);}
};
xhr.send();

this.socket = new WebSocket('ws://localhost:8080')
this.socket.binaryType = 'arraybuffer'
this.socket.onmessage = (event) => {let blob = new Blob([event.data], { type: 'audio/wav' })let objectURL = URL.createObjectURL(blob)this.wavesurfer.load(objectURL)this.wavesurfer.on('finish', () => {URL.revokeObjectURL(objectURL)})
}

相关文章:

  • FPS游戏框架漫谈第二十二天
  • 【go】ent操作之CRUD与联表查询
  • uniapp /微信小程序 使用map组件实现手绘地图方案
  • office文件转pdf在线预览
  • 【前端高频面试题--Vue基础篇】
  • 多模态对比语言图像预训练CLIP:打破语言与视觉的界限,具备零样本能力
  • 猫头虎分享已解决Bug || 未定义的变量(Undefined Variable):ReferenceError: x is not defined
  • 获取旁站 / C 段:第三方网站(附链接)
  • 天猫数据分析(天猫数据查询工具):2023年滑雪服市场消费现状及趋势(天猫服饰行业分析报告)
  • php 函数三
  • 新型RedAlert勒索病毒针对VMWare ESXi服务器
  • 利用LLM大模型生成sql的深入应用探究
  • 新增同步管理、操作日志模块,支持公共链接分享,DataEase开源数据可视化分析平台v2.3.0发布
  • 版本控制工具——Git
  • PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程、Spark新特性
  • [译]如何构建服务器端web组件,为何要构建?
  • eclipse(luna)创建web工程
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • httpie使用详解
  • JS笔记四:作用域、变量(函数)提升
  • PHP变量
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Spark RDD学习: aggregate函数
  • 机器学习学习笔记一
  • const的用法,特别是用在函数前面与后面的区别
  • 组复制官方翻译九、Group Replication Technical Details
  • (2)MFC+openGL单文档框架glFrame
  • (31)对象的克隆
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (十) 初识 Docker file
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net core 6 集成和使用 mongodb
  • .net core 控制台应用程序读取配置文件app.config
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET构架之我见
  • :=
  • [2023-年度总结]凡是过往,皆为序章
  • [Android]通过PhoneLookup读取所有电话号码
  • [AR Foundation] 人脸检测的流程
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [cogs2652]秘术「天文密葬法」
  • [GN] DP学习笔记板子
  • [ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】
  • [java基础揉碎]方法的重写/覆盖
  • [LeetCode]—Permutations II 求全排列(有重复值)
  • [LOJ 6213]「美团 CodeM 决赛」radar
  • [NEWS] J2SE5.0来了
  • [NISACTF 2022]sign-ezc++
  • [Pytorch] pytorch笔记 三
  • [SE]软件项目需求分析为什么困难
  • [SRM603] WinterAndSnowmen