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

使用wavesurferJs实现录音音波效果

效果图展示

在这里插入图片描述

插件安装
npm i wavesurfer
实现过程
<!-- 
@author: weileiming
@date: 2025-04-26 14:04:08
@description: 悬浮音波层
@props:isRecord: 录制状态waveOptions: 音波基础配置overlayStyle: 基础蒙层配置
@methods:togglePlay: 切换录制状态
-->
<template><div><!-- 悬浮音波层 --><div v-if="isRecord" class="floating-wave" :style="overlayStyle"><div id="waveform"></div></div></div></template><script setup>import { ref, nextTick, watch } from "vue";import WaveSurfer from "wavesurfer.js";import RecordPlugin from "wavesurfer.js/dist/plugins/record.esm.js";const props = defineProps({// 录制状态isRecord: {type: Boolean,required: true,},// 音波基础配置waveOptions: {type: Object,default: () => ({waveColor: "#4CAF50",progressColor: "#52C41A",height: 20,barWidth: 2,barGap: 3,barRadius: 2,barMinHeight: 1,normalize: true,interact: false,fillParent: true,pixelRatio: 1,minPxPerSec: 50,cursorWidth: 0,responsive: true,partialRender: true,removeMediaControl: true,hideScrollbar: true,}),},// 基础蒙层配置overlayStyle: {type: Object,default: () => ({background: 'rgba(0, 0, 0, 0.15)',width: '150px',height: '50px',minWidth: '150px',padding: '15px 10px',boxSizing:'border-box',}),},});const wavesurfer = ref(null);const recorder = ref(null);// 先声明 createWaveformconst createWaveform = async () => {await nextTick();try {wavesurfer.value = WaveSurfer.create({container: "#waveform",...props.waveOptions,});// 创建录音插件前先检查权限await navigator.mediaDevices.getUserMedia({ audio: true });recorder.value = wavesurfer.value.registerPlugin(RecordPlugin.create({scrollingWaveform: true,renderRecordedAudio: false,mediaRecorderOptions: {audioBitsPerSecond: 128000,},}));recorder.value.on("record-start", () => {console.log("录音开始");});recorder.value.on("record-end", () => {console.log("录音结束");});} catch (err) {console.error("创建 WaveSurfer 实例失败:", err);throw err;}};// 初始化录制const initRecorder = async () => {if (!wavesurfer.value) {await createWaveform();}};// 监听当前的启动状态 使用initRecorder 保证父组件获取到的状态和组件一致watch(() => props.isRecord,async (newVal) => {try {await initRecorder();if (newVal) {await recorder.value.startRecording();} else {await recorder.value.stopRecording();}} catch (error) {console.error("录音操作失败:", error);}},{ immediate: true });const togglePlay = async () => {try {await initRecorder();} catch (error) {console.error("麦克风访问错误:", error);alert("请允许访问麦克风");}};// 暴露方法defineExpose({togglePlay,});</script><style scoped></style>
使用示例
<script setup>
import { ref } from 'vue';
import SoundWave from './components/SoundWave/SoundWave.vue'
const mkRef = ref(null);
const isRecord = ref(false);
const handleToggle = () => {console.log('handleToggle', mkRef.value);mkRef.value.togglePlay();isRecord.value = !isRecord.value;
};
</script><template><button class="control-btn" @click="handleToggle">START</button><SoundWave ref="mkRef" :isRecord="isRecord"></SoundWave>
</template><style scoped>
.control-btn {background-color: #4CAF50; border: none; color: white; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px; cursor: pointer; border-radius: 4px; transition: background-color 0.3s ease; 
}.control-btn:hover {background-color: #45a049; 
}
</style>
npm下载该功能

上面功能可以直接去我的npm主页下载

npm i vue-sound-wave
说明

只针对麦克风音波效果开发,不做音频文件导出

http://www.xdnf.cn/news/2390.html

相关文章:

  • 突破常规:探索无 get 方法类设计的独特魅力
  • 1、Linux操作系统下,ubuntu22.04版本切换中英文界面
  • Spring security详细上手教学(三)密码管理
  • 基于STM32、HAL库的HX710A模数转换器ADC驱动程序设计
  • 【PyCharm- Python- ArcGIS】:安装一个和 ArcGIS 不冲突的独立 Python让PyCharm 使用 (解决全过程记录)
  • 树莓派超全系列教程文档--(44)如何在树莓派上编译树莓派内核
  • 详解 Unreal Engine(虚幻引擎)
  • 如何配置osg编译使支持png图标加载显示
  • Arduino 入门学习笔记(六):外部中断实验
  • vscode本地化显示远程图形化界面
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day21
  • 使用 LLM助手进行 Python 数据可视化
  • 为什么选择 Spring Boot? 它是如何简化单个微服务的创建、配置和部署的?
  • 强化学习机器人路径规划——Sparrow复现
  • 【项目篇之消息序列化】仿照RabbitMQ模拟实现消息队列
  • 毕业设计-基于深度学习的入侵检测系统
  • SpringCloud组件——OpenFeign
  • Windows怎样使用curl下载文件
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十四章 集合框架:告别手写链表的苦役
  • 构建AI大模型应用的LangChain之核心功能
  • C++:STL—容器
  • C++指针(三)
  • 《数据库系统工程师》-B站-视频截图整理-2021-23
  • 2025.04.26-淘天春招笔试题-第三题
  • 机器人学入门 (刚体空间 - 正/逆运动学 - 轨迹规划) 笔记 0.1 (台大机器人学-林沛群)
  • File,IO流,字符集
  • 2025.04.26-饿了么春招笔试题-第一题
  • 基于javaweb的SSM投票管理系统设计与实现(源码+文档+部署讲解)
  • qobject与event事件应用
  • 碰撞检测的艺术:Pygame中的Rect与像素级检测