uni-app项目中实现录音管理器(recorderManager)

2023-11-15

项目场景:

通过微信小程序进行录音上传到服务器端进行分析诊断,得出设备发生故障的原因.


问题描述

使用uni-app实现声音的采集以及回放上传等功能,并且用户可以自定义录制时长(录制时长有上限和下限)

效果展示

第一步

第二步

第三步


原因分析:

uni-app 官网中记载了录音管理器recorderManager的使用方法.
recorderManager
在开发功能过程中还需要用到计时器
setTimeout
以及uni-app的扩展组件
uni-ui


解决方案:

template

<template>
	<view class="diagnosis">
		<!-- 录制时长输入框 -->
		<view class="recordinput">
			<uni-easyinput class='input' type="number" v-model="duration" placeholder="请输入录制时长" />
		</view>
		<text>S</text>

		<!-- /录制按钮 -->
		<view class="start" @tap="startRecord()">
			<image src="../../static/录音 (选中).png" class="image"></image>
			开始录音
		</view>
		<view v-show="show">
			<!-- 进度条效果 -->
			<!-- <view>进度条</view> -->
			<!-- 回放以及上传按钮 -->
			<view class="butt" @tap="playVoice()">
				<uni-icons type="sound-filled" size="30"></uni-icons>
				回放录音
			</view>
			<view class="butt" @tap="submitrecord()">
				<uni-icons type="upload-filled" size="30"></uni-icons>
				上传录音
			</view>
		</view>
		<!-- 弹出层 -->
		<view>
			<uni-popup ref="popup" :mask-click="false" type="center" background-color="#fff">
				<view class="time">
					{{second}}/{{duration}}
				</view>
				<view class="start" @tap="endRecord()">
					<image src="../../static/录音 .png" class="image"></image>
					停止录音
				</view>
			</uni-popup>
		</view>
	</view>
</template>

script

<script>
	const recorderManager = uni.getRecorderManager();
	const innerAudioContext = uni.createInnerAudioContext();
	innerAudioContext.autoplay = true;

	export default {
		data() {
			return {
				//回放和上传是否显示
				show: false,
				//录制时长
				duration: '',
				//录制音频路径
				voicePath: '',
				//计时器
				timer: '',
				//计时器秒数
				second: 0,
			}
		},
		onLoad() {
			let self = this;
			recorderManager.onStop(function(res) {
				console.log('recorder stop' + JSON.stringify(res));
				self.voicePath = res.tempFilePath;
			});
		},
		methods: {
			// 计时器方法
			getTimeIntervalplus() {
				//初始化秒数
				this.second = 0
				//首先清除所有计时器
				clearInterval(this.timer);
				//设定一个计时器,将计时器的编号赋值给this.timer
				this.timer = setInterval(() => {
					//延迟的时间设为一秒,所以每过一秒,this.second加一
					this.second += 1;
					//判断当秒数大于等于输入框设定的秒数的时候
					if (this.second >= this.duration) {
						//停止录音
						recorderManager.stop();
						//清除计时器
						clearInterval(this.timer);
						//关闭弹出层
						this.$refs.popup.close('bottom')
						console.log('录音结束')
						this.show = true
					}
				}, 1000);
			},
			startRecord() {
				//首先对输入框中输入的数字进行判断
				if (this.duration >= 3 && this.duration <= 10) {
					// 点击开始录音
					console.log('开始录音');
					this.$refs.popup.open('bottom')
					//将输入框中的数字进行加工成单位为ms的
					var tims = this.duration * 1000
					//封装的一个计时器,调用开始计时
					this.getTimeIntervalplus();
					const options = {
						//指定录音的时长
						duration: tims,
						//采样率
						sampleRate: 44100,
						//录音通道数
						numberOfChannels: 1,
						//编码码率
						encodeBitRate: 192000,
						//音频格式
						format: 'mp3',
						//指定帧大小
						frameSize: 50
					}
					console.log(options)
					recorderManager.start(options);
				} else {
					uni.showToast({
						title: '录制时长在3-10S之间',
						icon: 'none',
						duration: 2000
					});
				}
			},
			endRecord() {
				console.log('录音结束');
				recorderManager.stop(); //结束录音
				clearInterval(this.timer); //清除计时器
				//关闭弹出层
				this.$refs.popup.close('bottom')
				this.show = true
			},
			playVoice() {
				console.log('播放录音');
				console.log(this.voicePath)
				//如果有录音文件的话,将文件赋值给innerAudioContext.src进行播放
				if (this.voicePath) {
					innerAudioContext.src = this.voicePath;
					innerAudioContext.play();
				}
			},
			submitrecord() {
				console.log('上传录音')
				console.log(this.duration)

			}
		}
	}
</script>

style

<style lang="scss" scoped>
	.diagnosis {
		width: 86%;
		margin: auto;
	}

	.recordinput {
		display: inline-block;
		width: 80%;
		margin: 300rpx 20rpx 100rpx 50rpx;
	}

	.start {
		width: 50%;
		margin: 50rpx auto;
		font-size: 16px;
		color: #666666;
		height: 80rpx;
		border: 1px solid;
		display: flex;
		flex-direction: row;
		align-items: center;
		border-color: #b8b8b8;
		border-radius: 10rpx;
		font-family: "楷体";
		justify-content: center;

	}

	.start image {
		margin-left: 10rpx;
		margin-right: 10rpx;
		width: 35rpx;
		height: 35rpx;
	}

	.butt {
		width: 50%;
		margin: 50rpx auto;
		font-size: 16px;
		color: #666666;
		height: 80rpx;
		border: 1px solid;
		display: flex;
		flex-direction: row;
		align-items: center;
		border-color: #b8b8b8;
		border-radius: 10rpx;
		font-family: "楷体";
		justify-content: center;
	}


	.time {
		width: 50%;
		margin: 10rpx auto;
		font-size: 22px;
		height: 80rpx;
		display: flex;
		flex-direction: row;
		align-items: center;
		font-family: "楷体";
		justify-content: center;
	}
</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uni-app项目中实现录音管理器(recorderManager) 的相关文章

随机推荐

  • 基于深度学习识别模型的缺陷检测

    一 介绍 缺陷检测被广泛使用于布匹瑕疵检测 工件表面质量检测 航空航天领域等 传统的算法对规则缺陷以及场景比较简单的场合 能够很好工作 但是对特征不明显的 形状多样 场景比较混乱的场合 则不再适用 近年来 基于深度学习的识别算法越来越成熟
  • 西班牙放大招,利用区块链技术防腐

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 在过去十年来 西班牙爆发了一系列引人注目的腐败丑闻 其中以公共采购最甚 但据TI 2017年的腐败认知指数表明 西班牙下滑了8个百分点 成为欧盟排名最低的国家之一
  • windows下解决matplotib中文乱码问题

    matplotlib默认是不支持中文的 在window系统下如何设置使其可以显示中文 参考文章
  • 科目一:信息系统综合知识——4.嵌入式技术

    4 嵌入式技术 4 1 嵌入式微处理器体系结构 冯诺依曼结构 传统计算机采用 也称普林斯顿结构 该结构下的存储器将程序指令存储器和数据存储器合并在一起 计算机程序和数据共用一个存储空间 程序指令存储地址和数据存储地址指向同一存储器的不同物理
  • treectrl遍历

    树是一种十分重要的数据结构 在程序设计中 我们经常用树来组织数据 对于树的遍历也是一种常规的运算 下面提供了两个算法 前面一个只是简单的遍历了所有的结点 后面一个则可以根据传入条件返回相应的结点 功能 遍历CTreeCtrl所有结点 参数
  • expected type: java.lang.String, actual value: $Proxy26

    这个错误是在什么情况下报出的 sqlsever ssh的 时候 使用的是非持久化的查询 因为是多服务器查询 query getSession createSQLQuery sql setResultTransformer Transform
  • 2023-9-14 最长上升子序列

    题目链接 最长上升子序列 include
  • C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化 将object对象序列化常见的两种方式即string和xml对象 第一种将object转换为string对象 这种比较简单没有什么可谈的 public string
  • Eclipse-修改工程名

    直接修改工程可能会产生一些莫名其妙的问题 需遵循以下四步 1 右键工程 Refactor gt Rename 或选中工程按F2 修改名称 2 右键工程 Properties gt Web Project Settings 修改Context
  • 性能测试的方法

    性能测试主要采用的方法有 1 负载测试 通过对系统不断的加压 直到超过预定的指标或者部分资源达到一种饱和状态不能再加压为止 该方法主要用于找到系统最大的负载能力 为性能调优提供数据 2 压力测试 指系统已经达到一定的饱和程度 CPU 磁盘等
  • Django2.0-redis

    redis 概述 redis是一种nosql数据库 他的数据是保存在内存中 同时redis可以定时把内存数据同步到磁盘 即可以将数据持久化 并且他比memcached支持更多的数据结构 string list列表 队列和栈 set 集合 s
  • LRU和LFU的区别

    分析 回答 LRU和LFU都是内存管理的页面置换算法 LRU 即 最近最少使用淘汰算法 Least Recently Used LRU是淘汰最长时间没有被使用的页面 LRU关键是看数据最后一次被使用到发生替换的时间长短 时间越长 数据就会被
  • 都在用 AI 生成美少女,而我却。。。

    最近 AI 画画特别的火 你能从网上看到非常多好看的图片 于是我就开始了我的安装之旅 我看到的图是这样的 这样的 还有这样的 然后我就开始了我的 AI 安装生成计划 安装环境 首先我们需要安装 Python 环境 因为这个需要显卡 我估计我
  • [C++]for 循环多个限制条件

    for int i 0 j 0 i lt 5 j lt 7 i j 那么最后判断的会是j lt 7的条件 应该写成 for int i 0 j 0 i lt 5 j lt 7 i j 转载于 https www cnblogs com dr
  • django celery简单 例子

    django celery简单 例子 https docs celeryq dev en latest django first steps with django html pip list pip install Django4 2 3
  • Oracle的基本数据类型总结

    1 字符类型 CHAR 一个定长字符串 当位数不足自动用空格填充来达到其最大长度 如非NULL的CHAR 12 总是包含12字节信息 CHAR字段最多可以存储2 000字节的信息 VARCHAR2 这是一个变长字符串 与CHAR 类型不同
  • JavaScript WebGL 三维相关概念

    引子 在 JavaScript WebGL 矩阵之后 发现在实现三维效果之前还有一些概念需要理解 就去查了下资料 按照自己的习惯整合了一下 Origin My GitHub 齐次坐标 三维坐标理论上三个分量就够了 但在看相关程序的时候 发现
  • linux spi 设备节点 读写

    本文记录spi设备节点的操作方法 SPI总线设备文件名通常为 dev spidevN P N 0 1 2 P 0 1 2 其中N表示第几路SPI总线 而P表示在该路SPI总线中使用哪个CS信号线 参考链接 http www wzaobao
  • 【深度解析→博文总结】李宏毅机器学习2023作业04Self-attention(Speaker Identification)

    文章目录 系列文章 简要说明 视频分享 作业详情 调参记录 Simple Baseline 0 66025 Medium Baseline 0 81750 Stong Baseline 0 88500 Boss Baseline 0 931
  • uni-app项目中实现录音管理器(recorderManager)

    项目场景 通过微信小程序进行录音上传到服务器端进行分析诊断 得出设备发生故障的原因 问题描述 使用uni app实现声音的采集以及回放和上传等功能 并且用户可以自定义录制时长 录制时长有上限和下限 效果展示 原因分析 uni app 官网中