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

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; // 波形条的radius
    barWidth?: 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)
  })
}

http://www.kler.cn/a/228233.html

相关文章:

  • 计算机视觉算法实战——无人机检测
  • 怎样使用树莓派自己搭建一套ADS-B信号接收系统
  • 【RabbitMQ 消息丢失常见情况分析】
  • C#集合操作优化:高效实现批量添加与删除
  • 2024年智慧消防一体化安全管控年度回顾与2025年预测
  • 【深度学习】嘿马深度学习笔记第11篇:卷积神经网络,学习目标【附代码文档】
  • 【Linux】进程间通信 --管道通信
  • JVM之Java内存区域
  • IP风险画像在企业网络安全中应用
  • freertos 源码分析一 list链表数据结构
  • 终端环境:zsh 和 oh-my-zsh
  • 【项目管理】CMMI-项目结项管理过程
  • Unity中blendtree和state间的过渡
  • 【Java万花筒】Java图形库探秘:创意编程、数据可视化与用户界面设计
  • 【Tomcat与网络9】提高Tomcat启动速度的八大措施
  • es6中标签模板
  • 大型软件编程实例分享,诊所门诊处方笺管理系统多台电脑同时使用的软件教程
  • 常用工具类-StringUtils
  • 网易和腾讯面试题精选---API 设计和开发面试问答
  • 387. First Unique Character in a String(字符串中的第一个唯一字符)
  • 【Spring连载】使用Spring Data访问Redis(八)----发布/订阅消息
  • platfrom tree架构下实现3-Wire驱动(DS1302)
  • 【PostgreSQL内核学习(二十六) —— (共享数据缓冲区)】
  • Qt案例 在对QGraphicsView视图修改和撤销修改图元操作时,使用命令模式实现。
  • sqlserver alwayson部署文档手册
  • 一知半解,临时解决ajax跨域请求