前端Vue使用js-audio-plugin实现录音功能

在前端 Vue 项目中使用 js-audio-recorder 组件,可按以下流程进行操作:

  1. 安装组件 :在项目根目录下执行npm i js-audio-recorder命令,安装该组件。
  2. 引入组件 :在需要使用录音功能的 Vue 组件中,通过import Recorder from 'js - audio - recorder'引入 Recorder。
  3. 初始化与使用 :在组件的created钩子函数或setup函数中初始化 Recorder 实例,并定义相关方法来控制录音操作。

具体使用方法如下:

  • 创建实例 :可在created中创建 Recorder 实例,如this.recorder = new Recorder()。也可传入参数自定义采样位数、采样率等,如this.recorder = new Recorder({sampleBits: 16, sampleRate: 16000, numChannels: 1})
  • 开始录音 :先通过Recorder.getPermission()获取麦克风权限,成功后调用start方法,如Recorder.getPermission().then(() => {this.recorder.start()})
  • 控制录音 :暂停录音调用pause方法,即this.recorder.pause();继续录音调用resume方法,即this.recorder.resume();停止录音调用stop方法,即this.recorder.stop()
  • 播放录音 :调用play方法播放录制的音频,如this.recorder.play()
  • 销毁实例 :录音结束后,可调用destroy方法销毁实例,释放资源,如this.recorder.destroy()
  • 获取音频数据 :可通过getWAVBlob方法获取录制音频的 WAV 格式 Blob 数据,如const blob = this.recorder.getWAVBlob(),用于上传或其他操作。\

示例:

html 复制代码
<template>
  <div>
    <h1>音频录制示例</h1>
    <button @click="startRecording" :disabled="isRecording">开始录音</button>
    <button @click="pauseRecording" :disabled="!isRecording || isPaused">暂停录音</button>
    <button @click="resumeRecording" :disabled="!isRecording ||!isPaused">继续录音</button>
    <button @click="stopRecording" :disabled="!isRecording">停止录音</button>
    <button @click="playRecording" :disabled="!recordingBlob">播放录音</button>
    <button @click="downloadRecording" :disabled="!recordingBlob">下载录音</button>
  </div>
</template>

<script setup>
import Recorder from 'js - audio - recorder';
import { ref } from 'vue';

// 录音状态
const isRecording = ref(false);
// 暂停状态
const isPaused = ref(false);
// 存储录制的音频Blob
const recordingBlob = ref(null);

let recorder;

const startRecording = async () => {
  try {
    await Recorder.getPermission();
    recorder = new Recorder();
    recorder.start();
    isRecording.value = true;
    isPaused.value = false;
  } catch (error) {
    console.error('获取权限或开始录音失败', error);
  }
};

const pauseRecording = () => {
  if (recorder) {
    recorder.pause();
    isPaused.value = true;
  }
};

const resumeRecording = () => {
  if (recorder) {
    recorder.resume();
    isPaused.value = false;
  }
};

const stopRecording = () => {
  if (recorder) {
    recorder.stop();
    isRecording.value = false;
    isPaused.value = false;
    recordingBlob.value = recorder.getWAVBlob();
    recorder.destroy();
  }
};

const playRecording = () => {
  if (recordingBlob.value) {
    const audioUrl = URL.createObjectURL(recordingBlob.value);
    const audio = new Audio(audioUrl);
    audio.play();
  }
};

const downloadRecording = () => {
  if (recordingBlob.value) {
    const link = document.createElement('a');
    link.href = URL.createObjectURL(recordingBlob.value);
    link.download ='recording.wav';
    link.click();
  }
};
</script>

<style scoped>
button {
  margin: 10px;
}
</style>
相关推荐
2601_962122972 分钟前
nginx 部署前端vue项目
前端·vue.js·nginx
码视野35 分钟前
基于 Spring Boot + Vue3 的【城市道路地下空洞塌陷微动传感监测与路面脱空沉降预警中台】设计与实现(含PRD/三端高保真源码/大屏)
vue.js·spring boot·后端
雪芽蓝域zzs41 分钟前
第三节:目录结构重构(仿若依,优化层级,layout 与 components 同级)
前端·vue.js·重构
小磊哥er1 小时前
深入解构Claude Code - 第 5 篇 · 每次提问都给 AI 塞了什么资料
javascript·ai编程
小磊哥er1 小时前
深入解构Claude Code - 第 4 篇 · 工具:AI 的手
javascript·ai编程
子非鱼a2 小时前
【WEB】[NewStarCTF 公开赛赛道]UnserializeOne
前端·javascript·html
南雨北斗2 小时前
Vue3 v-model中的自动事件绑定
前端
小磊哥er3 小时前
深入解构Claude Code - 第 3 篇 · 一问一答怎么转起来
javascript·ai编程
小磊哥er3 小时前
深入解构Claude Code - 第 2 篇 · 启动的秘密
javascript·ai编程