当前位置:首页 > VUE

vue实现录音

2026-03-28 00:13:34VUE

Vue 实现录音功能

在 Vue 中实现录音功能通常需要借助浏览器的 MediaRecorder APIgetUserMedia 方法。以下是具体实现步骤:

获取用户麦克风权限

使用 navigator.mediaDevices.getUserMedia 请求麦克风访问权限。该方法返回一个 Promise,成功后会得到音频流。

async function requestMicrophone() {
  try {
    const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
    return stream;
  } catch (error) {
    console.error('麦克风访问被拒绝:', error);
    return null;
  }
}

初始化录音器

通过 MediaRecorder 实例化录音对象,并监听数据存储事件。

vue实现录音

function setupRecorder(stream) {
  const mediaRecorder = new MediaRecorder(stream);
  const audioChunks = [];

  mediaRecorder.ondataavailable = (event) => {
    if (event.data.size > 0) {
      audioChunks.push(event.data);
    }
  };

  return { mediaRecorder, audioChunks };
}

控制录音开始与结束

调用 mediaRecorder.start()mediaRecorder.stop() 控制录音流程。停止录音后,将音频数据转为可播放格式(如 BlobURL)。

function startRecording(mediaRecorder) {
  mediaRecorder.start();
}

function stopRecording(mediaRecorder, audioChunks) {
  return new Promise((resolve) => {
    mediaRecorder.onstop = () => {
      const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
      const audioUrl = URL.createObjectURL(audioBlob);
      resolve(audioUrl);
    };
    mediaRecorder.stop();
  });
}

在 Vue 组件中集成

将上述逻辑封装到 Vue 组件的 methods 中,并通过按钮触发录音操作。

vue实现录音

export default {
  data() {
    return {
      isRecording: false,
      audioUrl: null,
      mediaRecorder: null,
      audioChunks: [],
    };
  },
  methods: {
    async toggleRecording() {
      if (!this.isRecording) {
        const stream = await requestMicrophone();
        if (stream) {
          const { mediaRecorder, audioChunks } = setupRecorder(stream);
          this.mediaRecorder = mediaRecorder;
          this.audioChunks = audioChunks;
          startRecording(mediaRecorder);
          this.isRecording = true;
        }
      } else {
        this.audioUrl = await stopRecording(this.mediaRecorder, this.audioChunks);
        this.isRecording = false;
      }
    },
  },
};

模板部分

添加按钮和音频播放控件,绑定组件数据和方法。

<template>
  <div>
    <button @click="toggleRecording">
      {{ isRecording ? '停止录音' : '开始录音' }}
    </button>
    <audio v-if="audioUrl" :src="audioUrl" controls></audio>
  </div>
</template>

注意事项

  1. 兼容性MediaRecorder API 在部分旧浏览器中不支持,需检查兼容性或使用 polyfill。
  2. HTTPS 环境getUserMedia 仅在 HTTPS 或 localhost 环境下生效。
  3. 音频格式:默认生成的音频格式可能因浏览器而异,可通过 mimeType 参数指定(如 audio/webm)。

完整代码示例

以下是一个完整的 Vue 3 组件示例:

<template>
  <div>
    <button @click="toggleRecording">
      {{ isRecording ? '停止录音' : '开始录音' }}
    </button>
    <audio v-if="audioUrl" :src="audioUrl" controls></audio>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isRecording: false,
      audioUrl: null,
      mediaRecorder: null,
      audioChunks: [],
    };
  },
  methods: {
    async toggleRecording() {
      if (!this.isRecording) {
        try {
          const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
          this.mediaRecorder = new MediaRecorder(stream);
          this.audioChunks = [];

          this.mediaRecorder.ondataavailable = (event) => {
            if (event.data.size > 0) {
              this.audioChunks.push(event.data);
            }
          };

          this.mediaRecorder.start();
          this.isRecording = true;
        } catch (error) {
          console.error('录音失败:', error);
        }
      } else {
        this.mediaRecorder.stop();
        this.mediaRecorder.onstop = () => {
          const audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' });
          this.audioUrl = URL.createObjectURL(audioBlob);
          this.isRecording = false;
        };
      }
    },
  },
};
</script>

标签: vue
分享给朋友:

相关文章

vue聊天实现

vue聊天实现

Vue 聊天应用实现步骤 创建 Vue 项目 使用 Vue CLI 或 Vite 初始化项目,安装必要依赖(如 Vue 3、Element UI 或 Vuetify 用于 UI 组件)。 npm c…

代码实现vue

代码实现vue

创建Vue项目 使用Vue CLI快速初始化项目,确保已安装Node.js和npm/yarn: npm install -g @vue/cli vue create my-vue-project c…

vue element实现

vue element实现

Vue Element UI 实现 Vue Element UI 是基于 Vue.js 的组件库,提供丰富的 UI 组件,适合快速开发企业级中后台产品。以下是一些关键实现方法和步骤: 安装 Vue…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FFm…

vue实现picker

vue实现picker

Vue 实现 Picker 组件的方法 在 Vue 中实现 Picker 组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 实现 通过 Vue 的模板和样式绑定,…

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…