当前位置:首页 > VUE

vue实现音频录音

2026-01-19 22:29:51VUE

Vue 实现音频录音的方法

使用浏览器 MediaRecorder API

浏览器原生提供的 MediaRecorder API 是录制音频的核心工具。通过 navigator.mediaDevices.getUserMedia 获取麦克风权限后,可初始化录音功能。

// 在 Vue 组件中
export default {
  data() {
    return {
      mediaRecorder: null,
      audioChunks: [],
      audioBlob: null,
      audioUrl: ''
    }
  },
  methods: {
    async startRecording() {
      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
      this.mediaRecorder = new MediaRecorder(stream);
      this.mediaRecorder.ondataavailable = (event) => {
        this.audioChunks.push(event.data);
      };
      this.mediaRecorder.start();
    },
    stopRecording() {
      return new Promise((resolve) => {
        this.mediaRecorder.onstop = () => {
          this.audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' });
          this.audioUrl = URL.createObjectURL(this.audioBlob);
          resolve(this.audioBlob);
        };
        this.mediaRecorder.stop();
      });
    }
  }
}

添加录音控制按钮

在模板中添加按钮控制录音开始和结束,并播放录音结果。

<template>
  <div>
    <button @click="startRecording" :disabled="isRecording">开始录音</button>
    <button @click="stopRecording" :disabled="!isRecording">停止录音</button>
    <audio v-if="audioUrl" :src="audioUrl" controls></audio>
  </div>
</template>

处理录音权限问题

需处理用户拒绝麦克风权限的情况,通过 catch 捕获错误。

startRecording() {
  navigator.mediaDevices.getUserMedia({ audio: true })
    .then((stream) => {
      this.mediaRecorder = new MediaRecorder(stream);
      // 其他初始化代码
    })
    .catch((err) => {
      console.error('麦克风权限被拒绝:', err);
    });
}

录音格式与兼容性

MediaRecorder 支持多种音频格式,但不同浏览器兼容性不同。可通过 mimeType 指定格式。

const options = { mimeType: 'audio/webm' }; // Chrome 首选
this.mediaRecorder = new MediaRecorder(stream, options);

第三方库简化流程

若需更复杂功能(如可视化、格式转换),可使用 recordrtcwavesurfer.js 等库。

安装 recordrtc

npm install recordrtc

使用示例:

vue实现音频录音

import RecordRTC from 'recordrtc';

export default {
  methods: {
    async startRecording() {
      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
      this.recorder = new RecordRTC(stream, { type: 'audio' });
      this.recorder.startRecording();
    },
    stopRecording() {
      return new Promise((resolve) => {
        this.recorder.stopRecording(() => {
          resolve(this.recorder.getBlob());
        });
      });
    }
  }
}

注意事项

  • 仅在 HTTPS 或 localhost 环境下可用,部分浏览器不允许 HTTP 访问麦克风。
  • 移动端浏览器可能有额外限制,需测试目标平台兼容性。
  • 长时间录音需注意内存管理,及时释放 Blob 对象。

标签: 音频vue
分享给朋友:

相关文章

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…

vue实现高亮

vue实现高亮

Vue 实现文本高亮的方法 在 Vue 中实现文本高亮可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-html 指令 通过 v-html 指令可以动态插入 HTML 内容,将需要高…

vue实现路由

vue实现路由

Vue 路由的实现方法 Vue 路由可以通过 Vue Router 库来实现,Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue Router 通…

vue 实现href

vue 实现href

Vue 实现 href 的方法 在 Vue 中实现 href 功能可以通过多种方式,具体取决于需求场景。以下是几种常见的方法: 使用 <a> 标签 直接使用 HTML 的 <a&g…

vue实现定时

vue实现定时

Vue 实现定时功能的方法 使用 setInterval 和 clearInterval 在 Vue 中可以通过 setInterval 和 clearInterval 实现定时功能。在组件的 mou…

vue实现slot

vue实现slot

Vue 中的 Slot 实现方法 Vue 的 slot 是一种内容分发机制,允许父组件向子组件插入内容。以下是几种常见的 Slot 实现方式: 默认 Slot 子组件通过 <slot>…