uni-app小程序实现音频播放,uniapp播放录音,uniapp简单实现播放录音

7 篇文章 0 订阅
6 篇文章 0 订阅

效果图

在这里插入图片描述

实现

复制到.vue文件即可预览效果

<template>
	<view class="container">
		<view style="margin-bottom: 20px;">
			<view class="audio-time">
				<text>{{currentTimeStr}}</text><!-- 进度时间 -->
			</view>
			<u-slider v-model="sliderValue" min="0" :max="sliderMax" @change="sliderChangeComplate()"></u-slider>
			<!-- 进度条 -->
			<view class="audio-time">
				<text>{{timeStr}}</text><!-- 总时间 -->
			</view>
		</view>
		<u-button :text="btn_text" type="success" size="normal" @click="changePlayState()">
		</u-button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				btn_text: '播放语音',
				timeStr: '00:00',
				sliderValue: 0,
				currentTimeStr: '00:00',
				sliderMax: 0,
				rePlay: false,
				innerAudioContext: null,
				audioPlay: false,
			}
		},
		onLoad(options) {
			this.creatAudio();
		},
		methods: {
			// 录音实例-初始化
			creatAudio() {
				this.innerAudioContext = uni.createInnerAudioContext(); //创建实例
				//this.innerAudioContext.autoplay = true;//设置是否自动播放
				//this.innerAudioContext.src = ''; //音频的url
				// 开始播放
				this.innerAudioContext.onPlay(() => {
					this.btn_text = '正在播放...';
					this.audioPlay = true;
				});
				// 暂停播放
				this.innerAudioContext.onPause(() => {
					this.btn_text = '播放暂停';
					this.audioPlay = false;
				});
				// 播放结束
				this.innerAudioContext.onEnded(() => {
					this.btn_text = '重新播放';
					this.audioPlay = false;
					this.rePlay = true;
					this.innerAudioContext.stop();
				});
				// 停止播放
				this.innerAudioContext.onStop(() => {
					this.btn_text = '重新播放';
					this.audioPlay = false;
					this.rePlay = true;
				});
				// 播放错误
				this.innerAudioContext.onError((res) => {
					console.log("播放错误", res)
				});
				// 进度
				this.timeUpdate();
			},
			// 播放时间进度
			timeUpdate() {
				this.sliderValue = 0;
				this.currentTimeStr = '00:00';
				this.sliderMax = 0;
				this.timeStr = '00:00';
				this.innerAudioContext.onTimeUpdate(() => {
					const {
						currentTime,
						duration
					} = this.innerAudioContext; //这俩参数是这个api自带的参数

					// 实时进度
					this.sliderValue = parseInt(currentTime);
					// 变动的时间
					this.currentTimeStr = this.formatTime(currentTime);
					// 进度条最大值
					this.sliderMax = parseInt(duration);
					// 总时长
					this.timeStr = this.formatTime(duration);
				});
			},
			// 录音暂停播放
			changePlayState() {
				if (this.audioPlay == false) {
					if (!this.innerAudioContext.src) {
						this.innerAudioContext.src = getApp().globalData.imgUrl + "/upload/49/tem/1.mp3"; // 音频地址
					}
					this.innerAudioContext.play();
					// 当重新播放的时候进来
					if (this.rePlay == true) {
						this.timeUpdate();
						this.rePlay = false;
					}
				} else {
					this.innerAudioContext.pause()
				}
			},
			// 音频前进回退
			sliderChangeComplate(val) {
				// 变动的时间
				this.currentTimeStr = this.formatTime(val);
				// 实时进度
				this.sliderValue = parseInt(val);
				this.innerAudioContext.seek(val);
				this.innerAudioContext.pause();
			},
			//格式化时间格式
			formatTime(num) {
				num = num.toFixed(0);
				let second = num % 60;
				if (second < 10) second = '0' + second;
				let min = Math.floor(num / 60);
				if (min < 10) min = '0' + min;
				return min + ":" + second;
			},
			/**
			 * 格式化时间 
			 * @param {String} date 原始时间格式
			 * 格式后的时间:hh:mm:ss
			 **/
			formatSecond(seconds) {
				var h = Math.floor(seconds / 3600) < 10 ? '0' + Math.floor(seconds / 3600) : Math.floor(seconds / 3600);
				var m = Math.floor((seconds / 60 % 60)) < 10 ? '0' + Math.floor((seconds / 60 % 60)) : Math.floor((
					seconds / 60 % 60));
				var s = Math.floor((seconds % 60)) < 10 ? '0' + Math.floor((seconds % 60)) : Math.floor((seconds % 60));
				return h + ":" + m + ":" + s;
			}
		},
	}
</script>

<style>
	page {
		background-color: #fff !important;
	}

	.container {
		padding: 10px 15px;
	}
</style>

问题:开发者工具中.onTimeUpdate方法可能会失效!

官方参考:https://uniapp.dcloud.net.cn/api/media/audio-context.html#
其他博客参考:https://blog.csdn.net/weixin_45328705/article/details/114091301

录音实现参考https://blog.csdn.net/weixin_43992507/article/details/129857780

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app实现小程序上传大文件的方法可以使用文件切片上传的方式。首先,需要明确需求和方案,然后可以开始动手了。大文件上传的难点之一是实现断点续传。具体的实现方法是使用uni-app官方内部方法uni.chooseFile来实现H5端的上传,而在小程序端,由于不能使用本地HTML,可以使用uni-app官方内部方法wx.chooseMessageFile。在移动端,可以使用web-view组件,并在该组件内使用input元素的type="file"来实现上传。目前,该方法支持上传各种类型的文件,如图片、视频、文件等。如果只想上传单个类型的文件,比如只上传图片或者视频或者某个特定类型的文件,可以参考input的accept属性。切片上传大文件是最复杂的部分之一,需要将文件切割成多个片段并进行上传。关于具体的切片上传实现方式,可以参考uniapp文档以及微信官方文档中关于FileSystemManager的部分。在实现断点续传时,需要注意一些细节。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [uniapp 微信小程序 分片 断点续传 大文件上传](https://blog.csdn.net/qq_34157798/article/details/119324994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [uniApp移动端-H5-微信小程序上传文件(图片,文档和视频等)](https://blog.csdn.net/weixin_45145119/article/details/130581411)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值