当前位置: 首页 > news >正文

uniapp使用音频录音功能

在这里插入图片描述

录音功能

主要根据uniapp官网提供的uni.getRecorderManager() API来实现路由功能,官网地址:https://uniapp.dcloud.net.cn/api/media/record-manager.html

注意:uniapp提供的uni.getRecorderManager()在h5上面不支持,如果h5想实现录音功能使用navigator.mediaDevices.getUserMedia({ audio: true })API来实现
在这里插入图片描述

使用全局管理状态管理录音功能

uniapp就支持全局状态管理功能只要文件下创建store文件
在这里插入图片描述

index.js

import { createStore } from 'vuex'import audio from './modules/audio'
import user from './modules/user'const store = createStore({modules: {audio,user}
})export default store

audio.js文件

export default {state: {// 存放全局事件events: [],// 录音管理器RECORD: null,RecordTime: 0,RECORDTIMER: null,sendVoice: null},mutations: {initRECORD(state) {state.RECORD = uni.getRecorderManager()// 监听录音开始state.RECORD.onStart(() => {state.RecordTime = 0state.RECORDTIMER = setInterval(() => {state.RecordTime++}, 1000)})// 监听录音结束state.RECORD.onStop(e => {if(state.RECORDTIMER) {clearInterval(state.RECORDTIMER)state.RECORDTIMER = null}// 执行发送if(typeof state.sendVoice === 'function') {state.sendVoice(e.tempFilePath)}})},// 注册发送音频事件regSendVoiceEvent(state, event) {state.sendVoice = event},// 注册全局事件regEvent(state, event) {state.events.push(event)},// 执行全局事件doEvent(state, params) {state.events.forEach(e => {e(params)})},// 注销事件removeEvent(state, event) {let index = state.events.findIndex(item => {return item === event})if(index !== -1) {state.events.splice(index, 1)}}},actions: {// 分发注册全局时间$onAudio({ commit }, event) {commit('regEvent', event)},// 分发执行全局事件$emitAduio({commit}, params) {commit('doEvent', params)},//  分发注销全局事件$offAudio({commit}, event) {commit('removeEvent', event)}}
}

App.vue文件初始化录音功能initRECORD方法

import store from './store';
export default {onLaunch() {// 初始化录音管理器store.commit('initRECORD')}
}

点击录音按钮进行录音

  • 页面按钮
<view v-if="mode === 'audio'" class="rounded flex align-center justify-center" :class="isRecording ? 'bg-hover-light':'bg-white'"style="height: 80rpx;" @touchstart="voiceTouchStart" @touchend="voiceTouchEnd"@touchcancel="voiceTouchCancel"@touchmove="voiceTouchMove"
><text class="font">{{ isRecording ? '松开 结束' : '按住 说话' }}</text>
</view>
  • 逻辑
import { mapState, mapMutations } from 'vuex'
export default {data() {return {// 音频录制状态isRecording: false,// 取消录音unRecord: false,}},computed: {...mapState({RECORD: state => state.audio.RECORD})},methods: {// 录音相关voiceTouchStart(e) {this.isRecording = truethis.recordingStartY = e.changedTouches[0].clientYthis.unRecord = false// 开始录音this.RECORD.start({format: 'mp3'})},// 录音结束voiceTouchEnd() {this.isRecording = false// 停止录音this.RECORD.stop()},// 录音被打断voiceTouchCancel() {this.isRecording = falsethis.unRecord = true// 停止录音this.RECORD.stop()},voiceTouchMove(e) {let Y = Math.abs(e.changedTouches[0].clientY - this.recordingStartY)this.unRecord = (Y >= 50)},}
}

播放音频功能

  <view v-else-if="item.type === 'audio'" class="flex align-center" @click="openAudio"><image v-if="isself" :src="!audioPlaying ? '/static/audio/audio3.png':'/static/audio/play.gif'" style="width: 50rpx;height: 50rpx;" class="mx-1"></image><text class="font">{{item.options.time}}</text><image v-if="!isself" :src="!audioPlaying ? '/static/audio/audio3.png':'/static/audio/play.gif'" style="width: 50rpx;height: 50rpx;"class="mx-1"></image></view>
import { mapState, mapActions } from 'vuex'
export default {data() {return {innerAudioContext: null,}},mounted() {// 注册全局事件if(this.item.type === 'audio') {this.$onAudio(this.onPlayAudio)}},methods: {...mapActions(['$onAudio', '$emitAduio', '$offAudio']),// 播放音频openAudio() {// 通知其他音频this.$emitAduio(this.index)if(!this.innerAudioContext) {this.innerAudioContext = uni.createInnerAudioContext()this.innerAudioContext.src = this.item.datathis.innerAudioContext.play()// 监听播放this.innerAudioContext.onPlay(() => {this.audioPlaying = true})// 监听暂停this.innerAudioContext.onPause(() => {this.audioPlaying = false})// 监听停止this.innerAudioContext.onStop(() => {this.audioPlaying = false})// 监听错误this.innerAudioContext.onError(() => {this.audioPlaying = false})} else {this.innerAudioContext.stop()this.innerAudioContext.play()}},// 监听音频全局事件onPlayAudio(index) {if(this.innerAudioContext) {if(this.index !== index) {this.innerAudioContext.pause()}}},// 关闭音频closeAudio() {if(this.item.type === 'audio') {this.$offAudio(this.onPlayAudio)}// 销毁音频if(this.innerAudioContext) {this.innerAudioContext.destroy()this.innerAudioContext = null}},}
}

H5录音功能

// H5 录音示例
let mediaRecorder;
let audioChunks = [];// 开始录音
export const startRecord = () => {navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {mediaRecorder = new MediaRecorder(stream);audioChunks = [];mediaRecorder.addEventListener("dataavailable", event => {audioChunks.push(event.data);});mediaRecorder.start();}).catch(error => {console.error("无法访问麦克风:", error);});
}// 停止录音
export const stopRecord = () => {return new Promise(resolve => {mediaRecorder.stop();mediaRecorder.addEventListener("stop", () => {const audioBlob = new Blob(audioChunks, { type: "audio/wav" });const audioUrl = URL.createObjectURL(audioBlob);resolve(audioUrl); // 返回录音的临时 URL});});
}
http://www.dtcms.com/a/486277.html

相关文章:

  • 【Linux运维】 Prometheus + Grafana + Alertmanager 监控系统部署指南(CentOS Ubuntu 通用版)
  • 目标检测核心知识与技术
  • 【免费源码】使用YOLOv11和OCSort进行多类别目标跟踪。(基于ncnn框架,c++实现)
  • 学习:uniapp全栈微信小程序vue3后台(31)
  • 微信小程序开发实战指南(三)-- Webview访问总结
  • 公司自建网站加盟装修公司哪家好
  • 哪个软件做网站好如何制作橡皮泥 简单
  • DDE方式下Delphi7程序间及与VB6程序的数据交换
  • 网络安全等级保护要求(10+4 层面)记忆总结
  • 活字格AI智能体:重塑企业级自动化与智能交互新范式
  • 【通信网络安全主题】第六届计算机通信与网络安全国际学术会议(CCNS 2025)
  • 海商网做网站价格自己做的网站怎么添加采集模块
  • vscode使用翻译插件分享
  • Web通信技术:Comet(服务器推送)详解
  • 互联网营销网站建设玩具租赁网站开发与实现论文
  • 为什么格林公式二重积分一侧的被积函数是两项相减
  • 成都网站建设软件石家庄模板网站
  • 【实战-12】flink版本表
  • ‌MyBatis-Plus 的 LambdaQueryWrapper 可以实现 OR 条件查询‌
  • 带你了解STM32:SPI通信(硬件部分)
  • CentOS下安装配置JDK24和tomcat11
  • springboot mybatisplus 配置SQL日志,但是没有日志输出
  • Windows下安装配置JDK24和tomcat11
  • 建个大型网站要多少钱房产信息网网站
  • 贵阳建站公司做的不错的h5高端网站
  • 实践 3:Vim 编辑器的使用
  • UG(NX)转换为3DXML全流程技术指南,附迪威模型网在线方案,适用于技术人员与学生
  • Python爬虫第4课:XPath与lxml高级解析技术
  • 使用 EasyExcel 封装通用 Excel 导出工具类
  • asp.net做网站的流程百度标注平台怎么加入