【Recorder】在 vue3 中使用 Recorder 实现录音并上传(mp3、wav)兼容 PC 和移动端

Web录音插件Recorder:实现跨平台音频录制与可视化
本文介绍了如何在网页上使用Recorder插件进行音频录制,包括安装步骤、基本使用示例(如按钮控制录音/停止、波形显示)以及兼容性说明。还提及了注意事项,如浏览器安全限制和本地开发解决方案。

一、Recorder 介绍

使用 Recorder插件可以在网页中进行录音。生成 blob 文件并可以自定义上传,同时,录音过程中会显示可视化波形,同时能够做到兼容PC端、Android、和iOS,十分好用!

Recorder github 首页
在这里插入图片描述
插件效果展示:
在这里插入图片描述

二、安装

npm install recorder-core

三、使用

1、demo 界面

    <div>
      <div>
        <!-- 按钮 -->
        <button @click="recOpen">打开录音,请求权限</button>
        | <button @click="recStart">开始录音</button>
        <button @click="recStop">结束录音</button>
        | <button @click="recPlay">本地试听</button>
      </div>
      <div style="padding-top: 5px">
        <!-- 波形绘制区域 -->
        <div style="border: 1px solid #ccc; display: inline-block; vertical-align: bottom">
          <div style="height: 100px; width: 300px" ref="recwave">
<think>嗯,用户正在寻找关于Vue2实现录音功能的完整方案,包括调用麦克风、生成音频文件、上传服务器浏览器兼容性问题。结合用户的历史查询系统指令,我需要提供系统化解答。先理清核心需求:vue2项目要支持跨端录音功能,需要覆盖权限处理、音频录制、格式转换文件上传全流程。用户特别提到MediaRecorderWebAudioAPI技术选型,说明ta可能遇到过兼容性问题。浏览引用文献发现关键信息点:引用[1]详细描述了Recorder库解决本地测试权限问题的方法,引用[2]确认了MediaRecorder的浏览器支持范围,引用[3]提到Android原生方案优势但用户需要纯前端方案,引用[4]给出vue-video-player的集成示例。技术方案设计上,优先选择recorder-core库因为:1)支持MP3格式避免转码2)自带权限异常处理3)兼容移动端特殊行为。需要特别注意的坑是iOS浏览器的自动播放策略限制。组件实现部分要分模块设计:1)音频设备初始化时区分https环境2)录制控制需考虑移动端触摸事件3)上传前要用Blob处理二进制数据。用户演示代码需要包含错误处理分支,比如处理Chrome的自动暂停策略。兼容性方案准备双层fallback:现代浏览器用MediaRecorder,旧版用WebAudioAPI模拟。测试用例要覆盖PC端Chrome的PermissionsAPI移动端微信内核的特殊行为。最后生成的提问要引导深度优化方向:性能方面可讨论Worker线程处理编码,扩展性可考虑WebSocket实时传输,这都是用户可能需要的进阶功能。</think> 以下是基于Vue2的录音功能完整实现方案(兼容PC/H5),结合`Web Audio API``MediaRecorder`,包含关键代码兼容性处理: --- ### 一、核心代码实现Vue2组件) ```vue <template> <div> <button @click="initRecording" :disabled="isRecording">开始录音</button> <button @click="stopRecording" :disabled="!isRecording">停止上传</button> <audio v-if="audioUrl" :src="audioUrl" controls></audio> <p v-if="error">{{ error }}</p> </div> </template> <script> export default { data() { return { isRecording: false, mediaRecorder: null, audioChunks: [], audioUrl: null, error: "", recorder: null }; }, methods: { // 初始化录音 async initRecording() { try { // 兼容性检查 if (!navigator.mediaDevices) { this.error = "浏览器不支持媒体设备"; return; } const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); // 方案1:使用原生MediaRecorder(推荐) this.mediaRecorder = new MediaRecorder(stream); this.audioChunks = []; this.mediaRecorder.ondataavailable = event => { if (event.data.size > 0) this.audioChunks.push(event.data); }; this.mediaRecorder.onstop = this.handleRecordingStop; this.mediaRecorder.start(); this.isRecording = true; } catch (err) { this.handleRecorderError(err); } }, // 停止录音处理音频 stopRecording() { if (this.mediaRecorder) { this.mediaRecorder.stop(); this.isRecording = false; // 关闭麦克风流 this.mediaRecorder.stream.getTracks().forEach(track => track.stop()); } }, // 生成音频文件上传 async handleRecordingStop() { try { // 生成Blob(MP3格式) const audioBlob = new Blob(this.audioChunks, { type: &#39;audio/mp3&#39; }); // 本地预览 this.audioUrl = URL.createObjectURL(audioBlob); // 上传服务器 await this.uploadToServer(audioBlob); } catch (err) { console.error("音频处理失败:", err); } }, // 上传到后端 async uploadToServer(audioBlob) { const formData = new FormData(); formData.append(&#39;audio&#39;, audioBlob, `recording_${Date.now()}.mp3`); try { const response = await fetch(&#39;https://your-api.com/upload&#39;, { method: &#39;POST&#39;, body: formData }); console.log("上传成功:", await response.json()); } catch (e) { console.error("上传失败:", e); } }, // 错误统一处理 handleRecorderError(err) { console.error("录音错误:", err); switch (err.name) { case &#39;NotAllowedError&#39;: this.error = "请允许麦克风权限"; break; case &#39;NotFoundError&#39;: this.error = "未检测到录音设备"; break; default: this.error = `录音失败: ${err.message}`; } } }, mounted() { // 本地开发需启用HTTPS(或localhost白名单) if (location.protocol !== &#39;https:&#39; && !location.hostname.includes(&#39;localhost&#39;)) { this.error = "请在HTTPS环境或localhost中运行"; } } }; </script> ``` --- ### 二、关键兼容性方案 1. **权限问题处理** - 本地测试:Chrome/Firefox 允许`localhost``127.0.0.1`调用麦克风 - 生产环境:**必须部署HTTPS**[^2] - iOS Safari:需在用户手势事件(如点击按钮)中触发录音 2. **格式兼容方案** ```javascript // 备用方案:使用recorder-core库(兼容旧浏览器) import Recorder from &#39;recorder-core&#39;; // 在initRecording中备用初始化 if (!MediaRecorder) { this.recorder = new Recorder({ type: &#39;mp3&#39; }); this.recorder.open(() => this.recorder.start()); } ``` 3. **移动端特殊处理** ```javascript // 解决iOS音频播放需用户触发的问题 document.querySelector(&#39;audio&#39;).play().catch(e => { console.log("自动播放被阻止,需用户手动播放"); }); ``` --- ### 三、优化方向 1. **音频可视化**:通过`AnalyserNode`获取音频数据绘制波形图 2. **格式转换**:使用`lamejs`将WAVMP3降低文件体积 3. **断点续传**:大文件分片上传(通过`Blob.slice()`) --- ### 四、常见问题解决 | 问题现象 | 解决方案 | |--------------------------|-----------------------------------------| | 无法调起麦克风 | 检查HTTPS、用户手势触发、浏览器隐私设置 | | 录音无数据 | 确认`audioChunks`是否正常填充数据 | | 移动端录音时间短 | 避免自动停止,监听`devicechange`事件 | | Safari无法录制MP3 | 改用`audio/webm`格式或引入转码库 | | 本地开发报权限错误 | 使用`http-server --ssl`生成临时HTTPS环境 | > ⚠️ 浏览器兼容性参考:Chrome 47+、Firefox 63+、Edge 79+、Safari 14.1+[^2],安卓微信内核需测试实际机型 ---
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值