im-ui-mobile
Version:
A Vue3.0 + Typescript instant messaging component library for Uniapp
297 lines (258 loc) • 6.67 kB
JavaScript
/**
* 录音管理器类
*/
class RecorderApp {
/**
* 构造函数
* @param {Object} options - 配置选项
* @param {Function} options.getToken - 获取token的函数
* @param {string} options.uploadUrl - 上传URL
*/
constructor(options = {}) {
// 获取录音管理器
this.rc = uni.getRecorderManager();
// 配置参数
this.getToken = options.getToken || (() => '');
this.uploadUrl = options.uploadUrl || '';
// 录音开始时间
this.startTime = null;
// 绑定事件处理器
this.bindEventHandlers();
}
/**
* 绑定事件处理器
* @private
*/
bindEventHandlers() {
// 录音开始回调
this.rc.onStart(() => {
this.startTime = new Date();
if (this.onStartCallback) {
this.onStartCallback();
}
});
// 录音错误回调
this.rc.onError((e) => {
console.log("录音错误:", e);
if (this.onErrorCallback) {
this.onErrorCallback(e);
}
});
// 录音停止回调
this.rc.onStop((wavFile) => {
if (this.onStopCallback) {
this.onStopCallback(wavFile);
}
});
}
/**
* 设置配置
* @param {Object} options - 配置选项
*/
setOptions(options) {
if (options.getToken) {
this.getToken = options.getToken;
}
if (options.uploadUrl) {
this.uploadUrl = options.uploadUrl;
}
}
/**
* 获取配置
* @returns {Object} 当前配置
*/
getOptions() {
return {
getToken: this.getToken,
uploadUrl: this.uploadUrl
};
}
/**
* 检查是否支持录音功能
* @returns {boolean} 是否支持录音
*/
checkIsEnable() {
// 这里可以添加更详细的兼容性检查
return true;
}
/**
* 开始录音
* @returns {Promise<void>} 录音开始Promise
*/
start() {
return new Promise((resolve, reject) => {
// 设置开始回调
this.onStartCallback = () => {
this.onStartCallback = null;
resolve();
};
// 设置错误回调
this.onErrorCallback = (e) => {
this.onErrorCallback = null;
reject(e);
};
// 开始录音
this.rc.start({
format: "mp3", // 录音格式,可选值:aac/mp3
});
});
}
/**
* 停止录音
*/
close() {
this.rc.stop();
}
/**
* 上传录音文件
* @returns {Promise<Object>} 上传结果Promise
*/
upload() {
return new Promise((resolve, reject) => {
// 设置停止回调
this.onStopCallback = (wavFile) => {
this.onStopCallback = null;
this.handleFileUpload(wavFile, resolve, reject);
};
// 停止录音
this.rc.stop();
});
}
/**
* 处理文件上传
* @private
* @param {Object} wavFile - 录音文件对象
* @param {Function} resolve - Promise resolve函数
* @param {Function} reject - Promise reject函数
*/
handleFileUpload(wavFile, resolve, reject) {
// 检查是否有开始时间
if (!this.startTime) {
reject(new Error("录音开始时间未记录"));
return;
}
// 获取令牌
const accessToken = this.getToken();
if (!accessToken) {
reject(new Error("未找到访问令牌"));
return;
}
// 检查基础URL
if (!this.uploadUrl) {
reject(new Error("未配置API基础URL"));
return;
}
// 上传文件
uni.uploadFile({
url: this.uploadUrl,
header: {
accessToken: accessToken,
},
filePath: wavFile.tempFilePath,
name: "file",
success: (res) => {
try {
const r = JSON.parse(res.data);
if (r.code !== 200) {
reject(new Error(r.message || "上传失败"));
return;
}
// 计算录音时长
const duration =
(new Date().getTime() - this.startTime.getTime()) / 1000;
const data = {
duration: Math.round(duration),
url: r.data,
};
resolve(data);
} catch (error) {
console.error(error);
reject(new Error("解析响应数据失败"));
}
},
fail: (e) => {
reject(e);
},
});
}
/**
* 获取录音时长
* @returns {number|null} 录音时长(秒),如果未开始录音则返回null
*/
getDuration() {
if (!this.startTime) {
return null;
}
return (new Date().getTime() - this.startTime.getTime()) / 1000;
}
/**
* 重置录音状态
*/
reset() {
this.startTime = null;
this.onStartCallback = null;
this.onErrorCallback = null;
this.onStopCallback = null;
}
/**
* 销毁录音管理器
*/
destroy() {
this.rc.stop();
this.reset();
// 移除所有事件监听
this.rc.onStart(() => {});
this.rc.onError(() => {});
this.rc.onStop(() => {});
}
/**
* 静态方法:创建录音管理器实例
* @param {Function} getToken - 获取token的函数
* @param {string} uploadUrl - API基础URL
* @returns {RecorderApp} 录音管理器实例
*/
static create(getToken, uploadUrl) {
return new RecorderApp({ getToken, uploadUrl });
}
}
// 导出类
export default RecorderApp;
// 使用示例:
/*
import RecorderApp from './recorderApp.js';
import { getToken } from './auth.js';
// 创建实例
const recorder = new RecorderApp({
getToken: getToken,
uploadUrl: 'https://api.example.com/file/upload'
});
// 或使用静态方法创建
const recorder2 = RecorderApp.create(getToken, 'https://api.example.com/file/upload');
// 使用录音功能
async function recordAudio() {
try {
// 检查支持
if (!recorder.checkIsEnable()) {
console.log('设备不支持录音');
return;
}
// 开始录音
await recorder.start();
console.log('录音开始');
// 录音中...
await new Promise(resolve => setTimeout(resolve, 3000));
// 停止并上传
const result = await recorder.upload();
console.log('录音上传成功:', result);
} catch (error) {
console.error('录音失败:', error);
}
}
// 获取录音时长
const duration = recorder.getDuration();
console.log('当前录音时长:', duration);
// 重置录音状态
recorder.reset();
// 销毁录音管理器
recorder.destroy();
*/