前端音频录制工具:AudioRecorder 类详解与使用指南

在前端开发中,音频录制是一个常见的需求(如语音笔记、音频投稿、实时语音交互等)。本文将详细介绍一个功能完善的 AudioRecorder 类,它支持麦克风权限处理、录制时长控制、暂停 / 恢复 / 停止 / 关闭、音频格式转换(WebM → 48kHz WAV)等核心能力,并提供完整的使用示例和功能解析。

一、AudioRecorder 类核心功能

该类基于浏览器的 MediaRecorder 和 AudioContext API 实现,具备以下核心特性:

  1. 基础录制能力:启动 / 暂停 / 恢复 / 停止 / 关闭录音,支持重复调用的异常处理;
  2. 时长控制:自定义最大录制时长(默认 5 分钟),超时自动停止,实时返回 mm:ss 格式的录制时长;
  3. 权限处理:优雅处理麦克风权限申请,拒绝时给出明确错误提示;
  4. 资源管理:自动释放媒体流、音频上下文等资源,避免内存泄漏;
  5. 格式转换:将录制的 WebM 格式音频转为 48kHz 16 位 PCM WAV 格式(兼容性更强);
  6. 状态管理:内置录音状态(录制中 / 暂停 / 空闲),避免重复操作;
  7. 回调体系:提供开始、时长更新、停止、错误等回调,方便业务层处理。

二、完整代码实现

javascript

运行

class AudioRecorder { /** * 构造函数 * @param {Object} options 配置项 * @param {number} options.maxDuration 最大录制时长(秒,默认300秒=5分钟) * @param {Function} options.onTimeUpdate 录制时间更新回调(参数:格式化为 mm:ss 的时间字符串) * @param {Function} options.onStart 录音开始回调 * @param {Function} options.onStop 录音停止回调(参数:最终音频 Blob 对象) * @param {Function} options.onError 错误回调(参数:错误信息) */ constructor(options = {}) { // 配置项默认值 this.config = { maxDuration: options.maxDuration || 300, // 最大录制时长(秒) onTimeUpdate: options.onTimeUpdate || (() => {}), // 时间更新回调 onStart: options.onStart || (() => {}), // 开始回调 onStop: options.onStop || (() => {}), // 停止回调 onError: options.onError || ((err) => console.error('录音错误:', err)) // 错误回调 }; // 录音核心状态 this.state = { isRecording: false, // 是否正在录音 isPaused: false, // 是否暂停 recordDuration: 0, // 已录制时长(秒) recordTimer: null, // 时间计时定时器 mediaStream: null, // 媒体流 audioCtx: null, // 音频上下文 recorder: null, // 媒体录制器 audioChunks: [], // 音频数据片段 isAcquiringPermission: false, // 标记是否正在获取麦克风权限 permissionPromise: null // 存储获取权限的Promise,用于中断 }; } /** * 1. 开始录音(支持实时返回 mm:ss 格式时间) * @returns {Promise<void>} */ async start() { try { // 避免重复启动 if (this.state.isRecording && !this.state.isPaused) { this.config.onError('当前已在录音中,无需重复启动'); return; } // 情况1:从暂停状态恢复录音 if (this.state.isPaused) { this._resumeRecording(); return; } // 情况2:全新启动录音 → 标记异步状态 this.state.isAcquiringPermission = true; // 开始获取权限 this.state.permissionPromise = navigator.mediaDevices.getUserMedia({ audio: { sampleRate: { ideal: 48000 }, channelCount: { ideal: 1 }, echoCancellation: { ideal: true }, noiseSuppression: { ideal: true } } }); // 等待权限获取结果 this.state.mediaStream = await this.state.permissionPromise; // 关键:如果在权限获取期间已调用close,直接终止后续逻辑 if (!this.state.isAcquiringPermission) { this._cleanupMediaStream(); // 释放已获取的流(若有) return; } // 权限获取成功 → 清除异步标记 this.state.isAcquiringPermission = false; this.state.permissionPromise = null; // 创

Read more

Java 测试 12:Selenium Web 自动化(Java 操作 Chrome 浏览器)

Java 测试 12:Selenium Web 自动化(Java 操作 Chrome 浏览器)

👋 大家好,欢迎来到我的技术博客! 💻 作为一名热爱 Java 与软件开发的程序员,我始终相信:清晰的逻辑 + 持续的积累 = 稳健的成长。 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕一个常见的开发话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! Java 测试 12:Selenium Web 自动化(Java 操作 Chrome 浏览器) 🧪 在现代软件开发中,Web 应用程序的稳定性和用户体验至关重要。为了确保这些应用程序在各种浏览器和设备上都能正常运行,自动化测试成为了一项不可或缺的实践。Selenium 作为业界领先的 Web 自动化测试框架,为开发者和测试工程师提供了强大的工具集,使得在真实浏览器环境中执行测试成为可能。 在 Selenium 的众多功能中,Selenium WebDriver 是其核心组件之一。它允许我们通过编程方式控制浏览器,模拟用户行为,如点击按钮、填写表单、导航页面等。

Python Web-FastApi和Django开发的最强平台 ZQ-Platform

zq-platform(芷青开发平台) 一个现代化的完全开源免费的企业级后台管理系统,提供 Django 和 FastAPI 双后端选择 + Vue3 + Element Plus 构建 演示链接(支持Django和FastApi) https://django-ninja.zq-platform.cn 开源地址 https://github.com/jiangzhikj/zq-platform.git 📖 项目简介 zq-platform 是一个功能完善的企业级后台管理系统解决方案,采用前后端分离架构。提供两种后端选择:Django 5.2 + Django Ninja 或 FastAPI + SQLAlchemy 异步 ORM,前端基于 Vue 3 + Vben Admin + Element Plus 打造现代化的管理界面。 ✨ 核心特性 * 🎯 完整的

前端常用算法解析:Bubble Sort,Quick Sort,Merge Sort,Binary Search,DFS,BFS,DP,Dijkstra,Union-Find

前端常用算法解析:Bubble Sort,Quick Sort,Merge Sort,Binary Search,DFS,BFS,DP,Dijkstra,Union-Find

目录 * 一、算法在前端开发中的重要性 * 二、常用算法解析 * 2.1. 排序算法(Bubble Sort,Quick Sort,Merge Sort) * 2.2 二分查找(Binary Search) * 2.3 深度优先搜索(DFS) * 2.4 广度优先搜索(BFS) * 2.5 动态规划(DP) * 2.6 Dijkstra算法 * 2.7 并查集(Union-Find) * 三、总结 一、算法在前端开发中的重要性 算法在前端开发中不仅仅用于面试,更重要的是解决实际问题:优化性能、处理复杂数据、提升用户体验等。 二、常用算法解析 2.

ARM.CMSIS.5.5.1.pack 嵌入式开发资源高效获取指南

1. 为什么嵌入式开发者需要关注pack资源 作为一名嵌入式开发老手,我深知在项目初期搭建开发环境时遇到的种种困扰。特别是当你拿到一块新的开发板,兴致勃勃地打开Keil或者IAR准备大干一场时,突然弹出一个"Missing Software Pack"的提示,那种感觉真是让人崩溃。 ARM CMSIS(Cortex Microcontroller Software Interface Standard)是ARM公司为Cortex-M系列处理器提供的一套软件接口标准,它包含了各种外设驱动、DSP库、RTOS接口等关键组件。而pack文件就是这些组件的安装包格式,相当于嵌入式开发的"应用商店安装包"。 在实际开发中,特别是使用STM32系列芯片时,你会发现几乎每个项目都离不开这些pack包。比如最近我在做一个智能家居项目,使用的STM32F407芯片就需要CMSIS 5.5.1包来提供标准的外设访问接口,还需要STM32F4xx_DFP 2.11.0包来获得具体的设备支持。 但是官方下载速度慢如蜗牛,有时候甚至因为网络问题根本下不动。更让人头疼的是,很多资源网站把这些基础开发资源包