uni-app使用NativeJS获取录音分贝

前言

因为uni-appHTML5+ 没有获取录音分贝的功能,无奈只能记录一下使用NativeJS实现


代码实现

(1)初始化

data() {
    return {
		interval:null,
		MediaRecorder:null,
		filePath:"",
		radio:null
    }
}

(2)导入MediaRecorder类

var recorder = plus.android.importClass("android.media.MediaRecorder");

(3)录音对象的设置

// 文件保存路径(使用uni-app的默认保存路径,可以配合uni-app的API使用)
this.filePath = plus.io.convertLocalFileSystemURL("_doc")+'/uniapp_save/'+Date.now()+".mp3";
// 创建录音媒体对象
var MediaRecorder = new recorder();
// 设置音频源
MediaRecorder.setAudioSource(recorder.AudioSource.DEFAULT);
// 设置输出编码
MediaRecorder.setOutputFormat(recorder.OutputFormat.DEFAULT);
// 设置编码格式
MediaRecorder.setAudioEncoder(recorder.AudioEncoder.DEFAULT);
// 设置输出路径
MediaRecorder.setOutputFile(this.filePath);

(4)录音准备

MediaRecorder.prepare();

(5)开始录制

MediaRecorder.start();
this.MediaRecorder = MediaRecorder;

(6)每100毫秒获取最大的振幅

this.interval = setInterval(()=>{
	if(this.MediaRecorder){
		var radio = this.MediaRecorder.getMaxAmplitude();
		if(radio > 1){
			radio = 20 * Math.log10(radio); // 计算分贝
		}
		this.radio = radio;
	}
},100)

(7)结束录制

// 清除计时器
clearInterval(this.interval);
// 暂停录音
this.MediaRecorder.stop();
// 释放录音
this.MediaRecorder.release();

(8)播放录音

let player = plus.audio.createPlayer({ src:this.filePath });
player.play(/*success:callback,fail:callback*/);

(9)获取文件列表

let _this = this;
uni.getSavedFileList({
	success({fileList}) {
		// 文件筛选
		fileList = fileList.filter(e=>{
			let filePath = e.filePath;
			return /\.mp3$/i.test(filePath);
		})
		_this.fileList = fileList;
	}
})

210811补充代码

注:分贝获取不知道准不准确

<template>
	<view class="content">
		<div>录音权限:{{ permission }}</div>
		分贝:{{ radio }}
		<button type="default" @click="start">开始录制</button>
		<button type="default" @click="stop">结束录制</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				interval: null,
				MediaRecorder: null,
				filePath: '',
				radio: 0,
				fileList: [],
				code: null
			};
		},
		computed: {
			permission() {
				return ({
					"-1": '永久拒绝',
					"0": '临时拒绝',
					"1": '允许'
				})[this.code]
			}
		},
		onLoad() {
			this.initPermissions();
		},
		methods: {
			async initPermissions() {
				plus.android.requestPermissions(['android.permission.RECORD_AUDIO'], e => {
					if (e.deniedAlways.length > 0) { //权限被永久拒绝
						this.code = -1;
					}
					if (e.deniedPresent.length > 0) { //权限被临时拒绝
						this.code = 0;
					}
					if (e.granted.length > 0) { //权限被允许
						this.code = 1;
					}
				});
			},
			// 每100毫秒获取最大的振幅
			getDecibel() {
				this.interval = setInterval(() => {
					if (this.MediaRecorder) {
						let radio = this.MediaRecorder.getMaxAmplitude();
						if (radio > 1) {
							radio = 20 * Math.log10(radio); // 计算分贝
						}
						this.radio = radio;
					}
				}, 100);
			},
			start() {
				if (this.code !== 1) return this.initPermissions();
				if (this.MediaRecorder) {
					this.MediaRecorder.release();
					this.MediaRecorder = null;
				}
				var recorder = plus.android.importClass('android.media.MediaRecorder');
				// 创建录音媒体对象
				var MediaRecorder = new recorder();
				// 设置音频源
				MediaRecorder.setAudioSource(recorder.AudioSource.DEFAULT);
				// 设置输出编码
				MediaRecorder.setOutputFormat(recorder.OutputFormat.DEFAULT);
				// 设置编码格式
				MediaRecorder.setAudioEncoder(recorder.AudioEncoder.DEFAULT);
				// 设置输出路径
				let filePath = plus.io.convertLocalFileSystemURL('_doc') + Date.now() + '.mp3';
				MediaRecorder.setOutputFile(filePath);
				MediaRecorder.prepare();
				MediaRecorder.start();
				this.MediaRecorder = MediaRecorder;
				this.getDecibel();
			},
			stop() {
				// 清除计时器
				clearInterval(this.interval);
				// 暂停录音
				this.MediaRecorder.stop();
				// 释放录音
				this.MediaRecorder.release();
				this.MediaRecorder = null;
			}
		}
	};
</script>

<style>
	.content {
		position: absolute;
		left: 50%;
		top: 50%;
		transform: translate(-50%, -50%);
	}
</style>

开启APP权限

"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>"
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>"
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值