首页 > 教程 >
uni-app小程序录音上传的解决方案
2023-02-18教程围观次
简介能力依赖RecorderManager全局唯一的录音管理器录音功能的要求与限制与当前页面其他音频播放/录音功能互斥是否在录音中状态显示结束/不需要录音时,回收RecorderManager对象材料可以/结束录音录音中Codeing(结果代码直接看最后)构造一个简单的DOM结构先实现小程序的录音功能importiconRecordfrom'../../static/images/icon_recor
能力依赖
RecorderManager 全局唯一的 录音管理器
录音功能的要求与限制
与当前页面其他音频播放/录音功能互斥
是否在录音中状态显示
结束/不需要录音时,回收RecorderManager对象
材料
可以/结束 录音 录音中
Codeing(结果代码直接看最后)
构造一个简单的DOM结构
<image @click="recordAction" :src="recordImg" class="record"/>
先实现 小程序的录音功能
import iconRecord from '../../static/images/icon_record.png'import iconRecording from '../../static/images/icon_recording.png'// ...data() { recordImg: iconRecord, // 录音按钮的图标 rm: null, // 录音管理器},// ...mounted() { if (this.rm === null) { // 录音管理器如果没有初始化就先初始化 this.rm = uni.getRecorderManager() } // 绑定回调方法 this.rm. ((e) => this. (e)) this.rm.onPause((e) => this.onPause(e)) this.rm.onResume((e) => this.onResume(e)) this.rm.onInterruptionBegin((e) => this.onInterruptionBegin(e)) this.rm.onInterruptionEnd((e) => this.onInterruptionEnd(e)) this.rm. ((e) => this. (e))},// ...methods: { // ... recordAction() { if (this.recordImg === iconRecord) { // 设置格式为MP3,最长60S,采样率22050 this.rm.start({ duration: 600000, format: 'mp3', sampleRate: 22050, }) // 开始录音后绑定停止录音的回调方法 this.rm. ((e) => this. (e)) } else if (this.recordImg === iconRecording) { this.rm.stop() }, }, (e) { console.log('开始录音', this.question, this.subQuesIndex) this.recordImg = iconRecording console.log(e) }, onPause(e) { console.log(e) afterAudioRecord() }, onResume(e) { console.log(e) }, (e) { console.log(e) this.recordImg = iconRecord // 结束录音之后 上传录音 this.uploadMp3Action(e) }, onInterruptionBegin(e) { console.log(e) }, onInterruptionEnd(e) { console.log(e) }, (e) { console.log(e) }, uploadMp3Action(e) { // TODO uploadMp3 },},
只能同时有一个录音,与音频播放互斥
globalData中增加两个属性audioPlaying,audioRecording
// src/App.vueexport default { globalData: { // 保证全局只有一个音频处于播放状态且录音与播放操作互斥 audioPlaying: false, audioRecording: false, }, // ...},
Util中增加判断方法
// src/lib/Util.js// 结束录音之后释放录音能力export function afterAudioRecord() { getApp().globalData.audioRecording = false}// 结束音频播放之后释放音频播放能力export function afterAudioPlay() { getApp().globalData.audioPlaying = false}/** * 判断是否可以录音或者播放 * @param {string} type play | record */export function beforeAudioRecordOrPlay(type) { const audioPlaying = getApp().globalData.audioPlaying const audioRecording = getApp().globalData.audioRecording if (audioPlaying ||audioRecording) { uni.showToast({ : audioPlaying ? '请先暂停其他音频播放' : '请先结束其他录音', icon: 'none' }) return false } else { if (type === 'play') { getApp().globalData.audioPlaying = true } else if (type === 'record') { getApp().globalData.audioRecording = true } else { throw new Error('type Error', type) } return true }}
改造原有recordAction方法
import { beforeAudioRecordOrPlay, afterAudioRecord} from '../../lib/Utils';// ...recordAction() {- if (this.recordImg === iconRecord) {+ if (this.recordImg === iconRecord && beforeAudioRecordOrPlay('record')) { // 设置格式为MP3,最长60S,采样率22050 this.rm.start({ duration: 600000, format: 'mp3', sampleRate: 22050, }) // 开始录音后绑定停止录音的回调方法 this.rm. ((e) => this. (e)) } else if (this.recordImg === iconRecording) { this.rm.stop()+ afterAudioRecord() },},
这样就避免了多次录音
小程序录音上传
补全我们的uploadMp3Action方法,我们使用 uni-app的uni.uploadFile()方法来上传录音文件
uploadMp3Action(e) { const filePath = e.tempFilePath const option = { url: 'xxx', filePath, header, formData: { filePath }, name: 'audio', } uni.showLoading({ : '录音上传中...' }) return await uni.uploadFile(option) uni.hideloading()}
最后在页面卸载的时候回收RecorderManager对象
beforeDestroy() { this.rm = null}
打完收工~
下载链接:网站源码/小程序源码/网站模板下载
下载排行
- 最新去水印小程序源码分享/无需后台/对接接口/支持全网去水印功能
- WordPress主题 JustNews5.2.2 + QAPress问答插件适合源码站虚拟资源站个人博客
- 自带多平台解析接口短视频去水印图集水印小程序源码下载
- 知识付费小程序源码升级版知识付费变现小程序源码+卡密-独立后台版本
- TooNaughty网址导航主题/WordPress主题下载
- 某鱼最近卖的很火蓝色版微信去水印小程序源码+接口
- 最新短视频去水印小程序源码/带流量主/外卖CPS系统/批量解析/修改MD5
- 新版多功能去水印工具微信小程序源码下载+带流量主功能
- 起点导航系统源码最新V2.6开源可运营版
- 最新版去水印小程序源码/基于WordPress的短视频去水印小程序源码