uniapp实现录音上传功能

目录
  • uni-app 介绍
  • html部分
  • js部分
    • 创建实例
    • 开始录音
    • 结束录音
    • 播放录音
    • 暂停播放
    • 提交录音到后端
    • 重新录制
    • onLoad部分
    • 计时器
    • 数据部分

uni-app 介绍

uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架。
开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS、Android、微信小程序等多个平台,保证其正确运行并达到优秀体验。

html部分

我是写了个录音的图片
点击之后弹出一个弹出层(仿了下qq的样式)

样式怎么写我就不赘述了大家都会

js部分

这是重点敲黑板!!!

创建实例

为了全局都好获取到,可以随时开始录音,随时停止录音,我把他扔进全局了

const recorderManager = uni.getRecorderManager();//创建一个录音实例
	const innerAudioContext = uni.createInnerAudioContext();//用来播放的实例
	// 为了防止苹果手机静音无法播放
	uni.setInnerAudioOption({
		obeyMuteSwitch: false
	})
	innerAudioContext.autoplay = true;
	export default {

开始录音

this.timecount = '00:00:00';//初始化录音时间
this.hour = 0;
this.minute = 0;
this.second = 0;
this.getTimeIntervalplus();//封装的一个计时器,调用开始计时
const options = {//参数
	duration: 600000,
	sampleRate: 44100,
	numberOfChannels: 1,
	encodeBitRate: 192000,
	format: 'mp3',
	frameSize: 50
}
recorderManager.start(options);

结束录音

需要限制最短时长的可以做下判断,我这边没写

recorderManager.stop();//结束录音
clearInterval(this.timer);//结束计时

播放录音

innerAudioContext.src = this.voicePath;//播放的地址(上面录的本地地址)
innerAudioContext.play();//播放

暂停播放

innerAudioContext.pause();//暂停播放
clearInterval(this.timer);//清除定时器

提交录音到后端

//结束录音提交录音
submitrecord: function() {
	this.count += 1;//这是定义了一个全局的变量来防止多次提交
	if (this.count == 1){
		console.log(this.count);
		var https = getApp().globalData.https;
		if (this.recordednum == 2) {
		this.recordednum = 3;
		recorderManager.stop();
		clearInterval(this.timer);
	}
	if (this.voicePath != '') {
		console.log(this.voicePath);
		uni.uploadFile({
			url: https + 'Uploads/uploadVoiceVideo',
			filePath: this.voicePath,
			name: 'file',
			success: (res) => {
			this.count = 0;
			//初始化
			this.initialize()//我封装了一个初始化定时器的函数
			this.timer = this.timecount;
			this.show_recording = false;
			var data = JSON.parse(res.data);
			if (this.current == 0) {//判断是哪个列里面录的音插回去
				this.firsvideo.push(data.address);
				} else if (this.current == 1) {
					this.secovideo.push(data.address);
					console.log(this.secovideo);
				} else if (this.current == 2) {
					this.thrivideo.push(data.address);
				}
				uni.showToast({
						title: '提交成功!',
						icon: 'none',
						duration: 1200
				})
			},
			fail: (err) => {
				uni.hideLoading();
				uni.showToast({
					tilte: '上传失败~',
					icon: 'none',
					duration: 1200
				})
					return
				}
			});
		} else {
			console.log("录音失败")
			uni.showToast({
				tilte: '录音失败',
				icon: 'none',
				duration: 1200
			})
			uni.hideLoading();
			this.show_recording = false;
			this.checkPermission()
			this.rerecord()
		}
	} else {
		uni.showToast({
			title: '请勿重复提交',
			icon: 'none',
			duration: 2000
		})
	this.count=0;
	}
},

重新录制

//重新录制
			rerecord: function() {
				//初始化定时器
				this.initialize()
				this.getTimeIntervalplus();//开始计时
				const options = {
					duration: 600000,
					sampleRate: 44100,
					numberOfChannels: 1,
					encodeBitRate: 192000,
					format: 'mp3',
					frameSize: 50
				}
				recorderManager.start(options);//开始录音
			},

onLoad部分

onLoad(option) {
			var appointment_message = option.appointment_message;
			appointment_message = JSON.parse(appointment_message);
			this.appointment_message = appointment_message;
			let that = this;
			recorderManager.onStop(function(res) {
				console.log('recorder stop' + JSON.stringify(res));
				that.voiceDuration = res.duration;
				that.voicePath = res.tempFilePath;
				console.log(res);
			});
		},

计时器

// 计时器增
			getTimeIntervalplus() {
				clearInterval(this.timer);
				this.timer = setInterval(() => {
					this.second += 1;
					if (this.second >= 60) {
						this.minute += 1;
						this.second = 0;
					}
					if (this.minute >= 10) {
						this.recordednum = 3;
						recorderManager.stop();
						clearInterval(this.timer);
					}
					this.second2 = this.second;
					this.minute2 = this.minute;
					this.timecount = this.showNum(this.hour) + ":" + this.showNum(this.minute) + ":" + this
						.showNum(this.second);

 - console.log("this.timecount", this.timecount)

				}, 1000);
			},

数据部分

data() {
			return {
				action: 'https://yl.letter-song.top/api/Uploads/uploadPicture', //上传图片地址
				textareavalue: '', //文字描述值
				fileList2: [], //返回图片路径2
				fileList3: [], //返回图片路径3
				fileList: [], //返回图片路径1
				firsvideo: [], //录音路径1
				secovideo: [], //录音路径2
				thrivideo: [], //录音路径3
				appointment_message: '', //预约信息上个页面传参过来的
				list: [{ //标签表
					name: '过往症状'
				}, {
					name: '近期症状'
				}, {
					name: '本次症状',
				}],
				current: 0, //选中项
				sty: { //滑块样式
					height: '4px',
					borderRadius: '2rpx',
					borderTopLeftRadius: '10px',
					backgroundColor: '#3ECEB5'
				},
				activeItem: { //选中项样式
					color: '#333333',
					fontWeight: '600',
					fontSize: '36rpx',
				},
				show_recording: false, //调起录音弹窗
				recordednum: 1, //1:初始状态2.录音状态3结束
				voicePath: '', //本次音频录音路径
				voiceDuration: '',
				timecount: '00:00:00',
				timecount2: "",
				hour: 0,
				minute: 0,
				second: 0,
				hour2: 0,
				minute2: 0,
				second2: 0,
				isZant: false,
				timer: '',
				yuming: '这是域名',
				permiss: 0, //0为开启录音权限1已开启录音权限,
				count: 0
			}
		},

到此这篇关于uniapp 实现录音上传功能的文章就介绍到这了,更多相关uniapp 录音上传内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • uniapp开发小程序的经验总结

    1. 新建UI项目 首先,我们的UI是基于ColorUI,当ColorUI没有的样式,就基于Uniapp自带的UI.所以项目的开始要引入这两个UI框架. 如下,新建一个uni-ui项目. 再建立一个ColorUI项目. 如果需要观看ColorUI的效果以便直到自己需要用哪些组件,可以将其运行起来,如下. uni-ui同理.这样只要我们需要的样式都可以在这两个UI取材了. 2. 搭建自己的项目 新建一个自己的uniapp项目,建立完成后.项目结构如下. 接着先引入ColorUI样式: 将Color

  • 如何在uniapp项目中使用mqtt

    由于要取一些实时数据并在手机app上展示,就想到用mqtt进行即时通讯. 下面附上uniapp中引入mqtt的全过程: 一.uniapp插件市场的参考插件 https://ext.dcloud.net.cn/plugin?id=854 二.具体引入过程 1.安装mqtt和uuid 在uniapp项目根目录下分别运行安装mqtt和uuid的命令行,因为后面会用uuid生成mqtt的clientId,所以这边就一起安装了. npm install mqtt@3.0.0 npm install uui

  • uniapp动态修改元素节点样式详解

    目录 一,通过style属性绑定来修改 html: 对应的js: 实现的效果: 二,利用ref来获取dom元素节点 代码: 实现的效果: 总结 一,通过style属性绑定来修改 第一步:肯定是需要获取元素节点 在uniApp项目中没有windouw对象,所以通过document不能直接获取dom节点,vue的refs只对自定义组件有效,对uniapp中的标签不生效. 查看uniapp官网有一个uni.createSelectorQuery() API:可以通过这个属性获取标签的样式,在通过动态绑

  • uniapp小程序实现瀑布流布局的思路与代码

    一.前言 现在写瀑布流算不算是炒冷饭啊? 我不管, 我就要写,谁也别想拦我. 瀑布流应该算是很常见的一种布局方法了,大致的思路也很好理解, 但是在小程序里面确有另外需要考虑的几个问题. 问题1:uniapp是基于Vue的,所以不好直接操作DOM. 问题2:uniapp基于Vue,但也做了一些修改,所以不好拿ref来操作 二.先说思路 为了保证文章的长度,以及有些小伙伴对瀑布流的基本思路不是很了解,所以先讲讲瀑布流的思路,先看下图. 可以看到,商品的图片高度是不一致的,再加上商品标题的行数不一致,

  • 详解uniapp无痛刷新token方法

    前端在请求接口时,和后端定义好了,如果状态码为 401 ,则表明 token 过期,需要前端请求新的 token 大概流程如下: 1.用户登录之后,后端会返回两个 token ,分别为accessToken 和refreshToken 存储到Storage 平时请求数据时,请求头使用accessToken 来发送接口 2.当返回401 token 过期后, 我们通过接口向后端获取新的 token ,请求参数为refreshToken 3.我们拿到新的accessToken 和refreshTok

  • uniapp微信小程序:key失效的解决方法

    uniapp 代码 <template> <view> <image v-for="(item, i) in fileList" :key="item[urlKey]" :src="item[urlKey]"></image> </view> </template> <script> export default { props: { urlKey: {defau

  • uniapp实现录音上传功能

    目录 uni-app 介绍 html部分 js部分 创建实例 开始录音 结束录音 播放录音 暂停播放 提交录音到后端 重新录制 onLoad部分 计时器 数据部分 uni-app 介绍 uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架. 开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS.Android.微信小程序等多个平台,保证其正确运行并达到优秀体验. html部分 我是写了个录音的图片 点击之后弹出一个弹出层(仿了下qq的样式) 样式怎么写我就不赘述了大

  • js实现录音上传功能

    本文实例为大家分享了js代码实现录音上传,供大家参考,具体内容如下 1.html页面 2.Recorder.js内容 3.flask写法 1.html页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title id="title"></title> </head> <bod

  • 小程序实现录音上传功能

    本文实例为大家分享了小程序录音上传的具体代码,供大家参考,具体内容如下 首先我们可以先看一下微信小程序的API 这里有关于小程序录音的一些基本配置 index.wxml: <view class='progress_box' bindtap='openRecording' style="display:{{openRecordingdis}}"> <view class="progress_bgs"> <view class="

  • AjaxFileUpload+Struts2实现多文件上传功能

    本文重点给大家介绍AjaxFileUpload+Struts2实现多文件上传功能,具体实现代码大家参考下本文. 单文件和多文件的实现区别主要修改两点, 一是插件ajaxfileupload.js里接收file文件ID的方式 二是后台action是数组形式接收 1.ajaxFileUpload文件下载地址http://www.phpletter.com/Demo/AjaxFileUpload-Demo/ 2.引入jquery-1.8.0.min.js.ajaxFileUpload.js文件 3.文

  • Ajax 配合node js multer 实现文件上传功能

    说明 作为一个node 初学者,最近在做一个聊天软件,支持注册.登录.在线单人.多人聊天.表情发送.各种文件上传下载.增删好友.聊天记录保存.通知声开关.背景图片切换.游戏等功能,所以用到了multer 模块,经过各种查文档,做demo例子,终于成功实现单个文件上传功能,支持大部分文件格式上传,同时显示到网页上 效果 是不是有种微信即视感,没错,就是根据网页版微信来做的, 要实现整体效果的话,要配合css和html来做,前端初学者,第一次发博客,实在捉急,近期,将会将代码放到github上去,感

  • jQuery的ajax中使用FormData实现页面无刷新上传功能

    接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方法和XMLHttpRequest Level 2的FormData接口.关于FormData,大家可以看MDN文档. 1,先看效果图 期望的功能和效果很简单:点击页面中的上传文件表单控件,选择文件后点击"ajax提交",将文件上传至服务器,上传成功后,页面给出一个简单的提示. 2,前端的代

  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    使用的技术有jquery.form.js框架, 以及springmvc框架.主要实现异步文件上传的同时封装对象,以及一些注意事项. 功能本身是很简单的,但是涉及到一些传递参数类型的问题.例如:jquery的ajax方法与jquery.form.js中的ajaxSubmit方法的参数,具体细节将在下一篇博客中分享. 重点: html表格三要素: action="fileUpload/fileUpload" method="post" enctype="mul

  • java使用CKEditor实现图片上传功能

    java如何使用CKEditor实现图片上传功能,具体内容如下 1.根据实际需要下载指定的CKEditor 2.删除文件ckeditor/plugins/image/dialogs/image.js预览框中文本内容,并修改hidden属性值为显示上传选项卡 删除image.js中包含在双引号中的上述文本 将image.js中的hidden属性值改为0 3.修改ckeditor/config.js文件,配置"上传到服务器"按钮调用的controller接口 4."上传到服务器&

  • Java组件commons fileupload实现文件上传功能

    Apache提供的commons-fileupload jar包实现文件上传确实很简单,最近要用Servlet/JSP做一个图片上传功能,在网上找了很多资料,大多是基于struts框架介绍的,还有些虽然也介绍common-fileupload的上传,但是那些例子比较老,有些类现在都废弃了. 通过研究学习总结,终于完成了这个上传功能,下面与大家分享一下. 案例场景 一个图书馆后台管理界面,需要提供上传图书图片的功能并且最终显示在页面中. 实现效果 进入添加书籍页面,默认显示一个图片"暂无突破&qu

  • Spring实现文件上传功能

    本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.0.2.RELEASE</version> </dep

随机推荐