uni-app小程序录音上传解决方案(后续更新Taro版)

10 篇文章 0 订阅
4 篇文章 0 订阅

能力依赖

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.onStart((e) => this.onStart(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.onError((e) => this.onError(e))
},
// ...
methods: {
  // ...
  recordAction() {
    if (this.recordImg === iconRecord) {
      // 设置格式为MP3,最长60S,采样率22050
      this.rm.start({
        duration: 600000,
        format: 'mp3',
        sampleRate: 22050,
      })
      // 开始录音后绑定停止录音的回调方法
      this.rm.onStop((e) => this.onStop(e))
    } else if (this.recordImg === iconRecording) {
      this.rm.stop()
    },
  },
  onStart(e) {
    console.log('开始录音', this.question, this.subQuesIndex)
    this.recordImg = iconRecording
    console.log(e)
  },
  onPause(e) {
    console.log(e)
    afterAudioRecord()
  },
  onResume(e) {
    console.log(e)
  },
  onStop(e) {
    console.log(e)
    this.recordImg = iconRecord
    // 结束录音之后上传录音
    this.uploadMp3Action(e)
  },
  onInterruptionBegin(e) {
    console.log(e)
  },
  onInterruptionEnd(e) {
    console.log(e)
  },
  onError(e) {
    console.log(e)
  },
  uploadMp3Action(e) {
  	// TODO uploadMp3
  },
},
只能同时有一个录音,与音频播放互斥
  • globalData中增加两个属性audioPlayingaudioRecording
// src/App.vue
export 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({
      title: 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.onStop((e) => this.onStop(e))
  } else if (this.recordImg === iconRecording) {
    this.rm.stop()
+   afterAudioRecord()
  },
},

这样就避免了多次录音

小程序录音上传

补全我们的uploadMp3Action方法,我们使用uni-appuni.uploadFile()方法来上传录音文件

uploadMp3Action(e) {
  const filePath = e.tempFilePath
  const option = {
    url: 'xxx',
    filePath,
    header,
    formData: {
      filePath
    },
    name: 'audio',
  }
  uni.showLoading({
    title: '录音上传中...'
  })
  return await uni.uploadFile(option)
  uni.hideloading()
}
最后在页面卸载的时候回收RecorderManager对象
beforeDestroy() {
  this.rm = null
}

打完收工~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Uni-app 是一款能够开发多个终端的跨平台框架,包括小程序、H5、App 等,可以在同一个代码库中开发出具有不同功能的应用。而 Uni-app 小程序源码就是使用 Uni-app 开发的小程序的代码。 Uni-app 小程序源码具有以下优势: 1. 高效开发:借助 Uni-app 的跨平台开发框架,Uni-app 小程序源码可以快速开发出具有高质量和高性能的小程序。 2. 多平台统一:Uni-app 小程序源码可以快速发布到多个平台的小程序环境中,如微信小程序、支付宝小程序、百度小程序等。 3. 组件库完整:Uni-app 小程序源码提供了完整的组件库和工具库,开发者可以快速开发出小程序。 4. 商业支持:Uni-app 小程序源码由腾讯公司开发,具有较强的商业支持,可以解决开发者在开发过程中的各种问题。 总的来说,Uni-app 小程序源码是一种高效、跨平台的小程序开发方式,可以大大节省开发者的时间和精力。同时,也为多个终端用户提供了更加方便和高效的小程序服务。 ### 回答2: Uni-app是一个跨平台开发框架,支持将一个代码库编译成多个平台的应用程序,其中包括iOS、Android、H5、微信小程序等。而Uni-app小程序源码是指使用Uni-app框架开发出来的小程序代码,通过该源码可以进行二次开发,解析出小程序的各个功能和页面,进行定制化开发,满足不同业务场景的需求。 使用Uni-app小程序源码可以快速实现小程序的开发,不仅减少了代码的编写量,同时也兼容了多个平台,方便用户在不同设备上使用该应用。同时,Uni-app小程序源码的可维护性也很高,因为只需要在一个代码库中进行修改和维护,而不需要针对每个平台单独编写代码。 在使用Uni-app小程序源码时,需要先进行环境搭建,安装相关的开发工具和依赖库,然后即可进行开发。源码中包含了小程序的各个功能和页面,开发者可以根据自己的需求进行修改和扩展,同时也可以使用Uni-app提供的组件和API完成自己的开发任务。 需要注意的是,在进行Uni-app小程序源码开发时,需要熟悉Vue.js框架的相关知识,因为Uni-app是基于Vue.js的框架进行开发的。同时,还需要了解小程序开发的相关知识,包括小程序的生命周期、路由、组件等。掌握这些知识后,才能够更好地利用Uni-app小程序源码进行开发,实现优秀的小程序应用。 ### 回答3: uni-app 小程序源码是指在 uni-app 开发框架下开发的小程序代码。uni-app 是一个多端开发框架,可以让开发者使用一套代码同时开发出跨 iOS、Android、H5 等多个平台的应用程序。在这个框架下,我们可以通过 Vue.js 开发小程序,并且使用 uni-app 提供的开发工具来进行调试和编译。 uni-app 具有许多优点,如跨平台、快速开发、高效编译等,其提供了丰富的组件和插件,让开发者可以轻松地在小程序上实现各种功能。开发者只需要按照 Vue.js 的组件开发方式去编写小程序代码,就可以实现复杂的应用逻辑。 uni-app 小程序源码的开发需要一定的技术积累和编程经验,同时还需要对互联网技术有一定的了解。一般来说,开发者需要掌握 Vue.js 基础、小程序开发技能等,才能开发出可靠、高效的 uni-app 小程序源码。 总之,uni-app 小程序源码是一个非常有价值的开发项目,可以帮助更多的开发者快速实现小程序应用功能,同时也可以提高开发效率,降低开发成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值