更新记录
1.8.2(2025-03-31)
- 修复蓝牙麦克风识别异常的问题
- 修改默认采样率为16000Hz(IOS特殊48000Hz、蓝牙麦克风16000Hz)
- 更新补充demo案例代码
1.8.0(2025-03-31)
- 移除iOS配置缓冲区大小参数
- 一些log注释修改
- 文档补充修改
- 增加demo代码
1.0.0(2025-03-15)
- 实时音频流数据获取
平台兼容性
Vue2 | Vue3 |
---|---|
√ | √ |
App | 快应用 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
---|---|---|---|---|---|---|
HBuilderX 4.53,Android:5.0,iOS:10,HarmonyNext:不支持 | × | × | × | × | × | × |
钉钉小程序 | 快手小程序 | 飞书小程序 | 京东小程序 | 鸿蒙元服务 |
---|---|---|---|---|
× | × | × | × | × |
H5-Safari | Android Browser | 微信浏览器(Android) | QQ浏览器(Android) | Chrome | IE | Edge | Firefox | PC-Safari |
---|---|---|---|---|---|---|---|---|
× | × | × | × | × | × | × | × | × |
darifo-audio
一个基于 UniApp UTS 的录音插件,支持实时监听和录音保存,提供了 iOS 和 Android 双平台支持。
功能特性
- 实时音频流数据获取
- 录音状态管理
- 完整的错误处理
- 支持 iOS/Android 双平台
安装
- 将插件放入项目的
uni_modules
目录 - HBuilderX 中点击 "重新安装依赖"
- 在 manifest.json 中配置相应平台的权限
使用方法
引入模块
import { audioRecorder } from '@/uni_modules/darifo-audio'
启动麦克风录音
// 获取平台
const platform = uni.getSystemInfoSync().platform;
// IOS平台
if (platform === "ios") {
recorder.start( (code, message) => {
if (code === 0) {
console.log("[Voice] 录音设备初始化成功");
// 这里执行循环获取帧数据的函数
startFrameLoop();
} else {
console.error("[Voice] 录音设备初始化失败:", code, message);
error.value = `录音设备错误: ${message}`;
isRecording.value = false;
}
}
);
}
// 安卓平台
if (platform === 'android') {
recorder.onStart((code, message, data) => {
// 先检查录音状态,如果已经停止,则不处理数据
if (!isRecording.value) {
console.log("[Voice] 录音已停止,不处理音频数据");
try {
recorder.stop();
} catch (err) {
console.error("[Voice] 停止录音设备失败:", err);
}
return;
}
if (code === 0) {
console.log("[Voice] Android获取到音频数据:", data);
// 再次检查录音状态和WebSocket连接状态
if (isRecording.value && recognizer.isConnected) {
// 这里发送音频数据
// recognizer.sendAudioData(data);
} else {
console.log("[Voice] 录音已停止或WebSocket未连接,不发送数据");
}
} else {
console.error("[Voice] 录音错误:", code, message);
error.value = `录音设备错误: ${message}`;
isRecording.value = false;
try {
recorder.stop();
} catch (err) {
console.error("[Voice] 停止录音设备失败:", err);
}
}
});
}
停止录音
console.log("[Voice] 停止录音设备");
recorder.stop();
定时器循环获取帧(IOS平台)
function startFrameLoop() {
console.log("[Voice] 开始音频帧循环");
let lastFrameTime = Date.now();
// 先清理可能存在的旧定时器
stopFrameLoop();
frameTimer = setInterval(() => {
try {
// 如果已经停止录音,立即清理定时器
if (!isRecording.value) {
console.log("[Voice] 录音已停止,终止音频帧循环");
stopFrameLoop();
return;
}
// 通过recorder.getFrame获取当前音频数据帧
const frame = recorder.getFrame();
if (frame && frame.byteLength > 0) {
const now = Date.now();
console.log("[Voice] 获取音频帧:", {
time: now - lastFrameTime,
size: frame.byteLength,
});
lastFrameTime = now;
// 只在录音状态时发送数据
if (isRecording.value) {
// 这里发送音频数据到服务器
// recognizer.sendAudioData(frame);
}
}
} catch (err) {
console.error("[Voice] 获取音频帧失败:", err);
console.error("[Voice] 错误堆栈:", err.stack);
error.value = `获取音频失败: ${err.message}`;
stopRecording();
}
}, 100);
}
// 停止循环
function stopFrameLoop() {
if (frameTimer) {
clearInterval(frameTimer);
frameTimer = null;
}
}
权限配置
Android 平台
需要在 AndroidManifest.xml 中添加以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
iOS 平台
需要在 Info.plist 中添加以下权限描述:
<key>NSMicrophoneUsageDescription</key>
<string>需要使用麦克风进行录音</string>
错误码说明
错误码 | 说明 |
---|---|
200001 | 麦克风引擎启动失败 |
200002 | 录音初始化失败 |
200003 | 录音启动失败 |
200004 | 麦克风权限拒绝 |
200006 | 未知权限问题 |
注意事项
-
权限处理
- 使用前请确保已获取录音权限
- Android 10+ 需要动态申请权限
-
内存管理
- 及时停止录音并释放资源
- 避免长时间录音导致内存占用过大
-
兼容性
- iOS 支持版本:iOS 10.0+
- Android 支持版本:Android 5.0+
常见问题
-
录音无声音
- 检查麦克风权限是否授予
- 检查设备是否静音
- 检查音频会话配置
-
内存占用过高
- 避免过长时间录音
- 及时释放不需要的录音实例
更新日志
1.0.0
- 初始版本发布
- 支持实时音频流获取
- 提供完整的错误处理机制