更新记录
1.0.0(2026-04-18)
-支持 Android / iOS 原生录音
-支持录音权限申请
-支持开始、暂停、恢复、停止
-支持自定义分片时长
-支持保留原始分片并输出合并文件
-支持返回录音文件路径,便于业务侧播放、上传和转写
平台兼容性
uni-app(4.75)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| × |
× |
× |
× |
√ |
√ |
√ |
√ |
× |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| × |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
uni-app x(4.75)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| × |
× |
√ |
√ |
× |
× |
austin-recorder
简介
austin-recorder 是一个UTS后台录音引擎插件,支持录音权限申请、开始 / 暂停 / 恢复 / 停止、分片落盘、状态回调、会话管理和录音文件输出。
当前插件下的是通用模板页演示:
- 录音权限申请
- 开始 / 暂停 / 恢复 / 停止录音
- 自定义分片时长
- 分片文件输出
- 会话列表查询
- 合并文件路径输出
功能特性
- 支持 Android / iOS 原生录音
- 支持自定义时间自动切片
- 支持暂停和恢复
- 支持录音状态回调
- 支持实时分贝回调
- 支持分片文件回调
- 支持分片合并输出文件回调
- 支持查询当前会话和历史会话
- 支持删除会话及其文件
- 默认输出
m4a(AAC) 文件,在 Android / iOS 原生录音场景中更稳定,且文件体积通常更小
- 原始分片保留不删,停止后额外生成
merged.m4a
manifest.json 权限配置
根项目 manifest.json 需要补齐以下权限。
Android
在 app-plus.distribute.android.permissions 中添加:
{
"app-plus": {
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>",
"<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MICROPHONE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>"
]
}
}
}
}
字段说明:
RECORD_AUDIO:录音必需权限
FOREGROUND_SERVICE:前台服务权限
FOREGROUND_SERVICE_MICROPHONE:前台录音服务权限
WAKE_LOCK:保持录音过程中的运行稳定性
iOS
在 app-plus.distribute.ios.privacyDescription 中添加:
{
"app-plus": {
"distribute": {
"ios": {
"privacyDescription": {
"NSMicrophoneUsageDescription": "用于后台录音、业务留痕和语音采集"
}
}
}
}
}
说明:
NSMicrophoneUsageDescription 是 iOS 麦克风权限弹窗文案,未配置时应用无法正常通过权限申请
- 文案建议按你的真实业务场景改写,不要直接写成和插件无关的用途
字段描述
StartRecorderOptions
| 字段名 |
类型 |
默认值 |
说明 |
scene |
string |
background-record |
业务场景标识 |
sessionId |
string |
自动生成 |
自定义会话 id |
outputDir |
string |
插件默认目录 |
自定义输出目录 |
segmentDurationMs |
number |
300000 |
分片时长,单位毫秒 |
maxDurationMs |
number |
3600000 |
最大录音时长,单位毫秒 |
enableMetering |
boolean |
true |
是否开启分贝回调 |
notificationTitle |
string |
空 |
Android 前台通知标题预留字段 |
notificationText |
string |
空 |
Android 前台通知文案预留字段 |
onStateChange |
function |
空 |
状态变化回调 |
onMetering |
function |
空 |
分贝变化回调 |
onSegmentReady |
function |
空 |
分片生成回调 |
success |
function |
空 |
开始录音成功回调 |
fail |
function |
空 |
开始录音失败回调 |
complete |
function |
空 |
开始录音结束回调 |
RecorderPermissionResult
| 字段名 |
类型 |
说明 |
ok |
boolean |
本次权限请求是否成功 |
platform |
string |
当前平台 |
action |
string |
当前动作名 |
errCode |
number |
错误码,成功时通常为 0 |
errMsg |
string |
错误信息 |
note |
string |
补充说明 |
granted |
boolean |
是否已授权 |
canAskAgain |
boolean |
是否还能再次请求权限 |
permissions |
Array<string> |
已申请权限列表 |
deniedPermissions |
Array<string> |
被拒绝的权限列表 |
RecorderStateEvent
| 字段名 |
类型 |
说明 |
sessionId |
string |
当前会话 id |
scene |
string |
当前场景标识 |
status |
string |
当前状态,常见值:idle / recording / paused / stopped / error |
durationMs |
number |
当前累计时长 |
segmentCount |
number |
当前已生成分片数量 |
reason |
string |
状态变化原因 |
time |
number |
状态回调时间戳 |
RecorderMeteringEvent
| 字段名 |
类型 |
说明 |
sessionId |
string |
当前会话 id |
durationMs |
number |
当前累计时长 |
db |
number |
当前分贝值 |
peak |
number |
当前峰值 |
time |
number |
分贝回调时间戳 |
RecorderSegmentInfo
| 字段名 |
类型 |
说明 |
sessionId |
string |
所属会话 id |
index |
number |
第几个分片 |
filePath |
string |
分片文件路径 |
durationMs |
number |
当前分片时长 |
sizeBytes |
number |
当前分片文件大小 |
createdAt |
number |
分片创建时间 |
RecorderSessionInfo
| 字段名 |
类型 |
说明 |
sessionId |
string |
会话 id |
scene |
string |
业务场景标识 |
status |
string |
当前会话状态 |
outputDir |
string |
当前会话输出目录 |
startedAt |
number |
开始时间 |
endedAt |
number |
结束时间 |
totalDurationMs |
number |
会话总时长 |
segmentCount |
number |
分片数量 |
mergedFilePath |
string |
合并文件路径 |
mergedSizeBytes |
number |
合并文件大小 |
mergeNote |
string |
合并结果说明 |
platform |
string |
当前平台 |
RecorderStatus
| 字段名 |
类型 |
说明 |
supported |
boolean |
当前平台是否支持 |
platform |
string |
当前平台 |
status |
string |
当前引擎状态 |
sessionId |
string |
当前会话 id |
scene |
string |
当前场景标识 |
durationMs |
number |
当前累计时长 |
segmentCount |
number |
当前已生成分片数量 |
meterDb |
number |
当前分贝值 |
note |
string |
状态说明 |
RecorderFail
| 字段名 |
类型 |
说明 |
errSubject |
string |
错误主题 |
errCode |
number |
错误码 |
errMsg |
string |
错误信息 |
platform |
string |
当前平台 |
action |
string |
出错动作 |
note |
string |
补充说明 |
使用示例
1. 申请录音权限
import { requestRecorderPermission } from '@/uni_modules/austin-recorder'
requestRecorderPermission({
success(res) {
console.log('permission-success', res)
},
fail(err) {
console.log('permission-fail', err)
},
})
2. 开始后台录音
import { startRecorder } from '@/uni_modules/austin-recorder'
startRecorder({
scene: 'background-record',
segmentDurationMs: 10000,
maxDurationMs: 60 * 60 * 1000,
enableMetering: true,
onStateChange(event) {
console.log('state', event)
},
onMetering(event) {
console.log('meter', event)
},
onSegmentReady(segment) {
console.log('segment-file', segment.filePath)
console.log('segment', segment)
},
success(session) {
console.log('session-start', session)
},
fail(err) {
console.log('start-fail', err)
},
})
3. 停止录音并获取合并文件
import { stopRecorder } from '@/uni_modules/austin-recorder'
stopRecorder({
reason: 'manual-stop',
success(session) {
console.log('merged-file', session.mergedFilePath)
console.log('session-stop', session)
},
fail(err) {
console.log('stop-fail', err)
},
})
4. 查询当前状态和会话
import {
getRecorderStatusSync,
getCurrentSessionSync,
listRecorderSessionsSync,
listRecorderSegmentsSync,
} from '@/uni_modules/austin-recorder'
const status = getRecorderStatusSync()
const currentSession = getCurrentSessionSync()
const sessions = listRecorderSessionsSync()
const segments = currentSession ? listRecorderSegmentsSync(currentSession.sessionId) : []
console.log('status', status)
console.log('currentSession', currentSession)
console.log('sessions', sessions)
console.log('segments', segments)