`
水木清华77
  • 浏览: 36878 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MediaRecorder测量音量大小

阅读更多
	
MediaRecorder mMediaRecorder;
int ratio = mMediaRecorder.getMaxAmplitude() / BASE;
int db = 0;// 分贝 也可以理解为定义的音量大小
if (ratio > 1)
db = (int) (20 * Math.log10(ratio));//db就是我们需要取得的音量的值。
//(int) (20 * Math.log10(ratio))振幅和音量大小的公式
//BASE的值由自己测试获得,我是怎么获取这个值得呢?
//开启麦克风,不对麦克风说话,而由周围噪声获取的值  大概在300到600之间  我取得是600这个基准值。

一下是一部分应用的代码:
package com.taobao.baby.manager;

import java.io.File;
import java.io.IOException;

import com.taobao.baby.R;
import com.taobao.baby.util.Log;
import android.media.MediaRecorder;
import android.os.Handler;
import android.widget.ImageView;

/**
 * amr音频处理
 * 
 * @author hongfa.yy
 * @version 创建时间2012-11-21 下午4:33:28
 */
public class RecordManager {
	private final String TAG = "RecordManager";
	private MediaRecorder mMediaRecorder;
	public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;
	private File file;

	public RecordManager(File file,ImageView view) {
		this.file = file;
		this.view=view;
	}
	public RecordManager(File file) {
		this.file = file;
	}

	private long startTime;
	private long endTime;

	/**
	 * 开始录音 使用amr格式
	 * 
	 * @param mRecAudioFile
	 *            录音文件
	 * @return
	 */
	public void startRecord() {
		// 开始录音
		/* ①Initial:实例化MediaRecorder对象 */
		if (mMediaRecorder == null)
			mMediaRecorder = new MediaRecorder();
		try {
			/* ②setAudioSource/setVedioSource */
			mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
			/*
			 * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
			 * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
			 */
			mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
			/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
			mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
			/* ③准备 */
			mMediaRecorder.setOutputFile(file.getAbsolutePath());
			mMediaRecorder.setMaxDuration(MAX_LENGTH);
			mMediaRecorder.prepare();
			/* ④开始 */
			mMediaRecorder.start();
			// AudioRecord audioRecord.
			/* 获取开始时间* */
			startTime = System.currentTimeMillis();
			// pre=mMediaRecorder.getMaxAmplitude();
			updateMicStatus();
			Log.i("ACTION_START", "startTime" + startTime);
		} catch (IllegalStateException e) {
			Log.i(TAG,
					"call startAmr(File mRecAudioFile) failed!"
							+ e.getMessage());
		} catch (IOException e) {
			Log.i(TAG,
					"call startAmr(File mRecAudioFile) failed!"
							+ e.getMessage());
		}

	}

	/**
	 * 停止录音
	 * 
	 * @param mMediaRecorder
	 */
	public long stopRecord() {
		if (mMediaRecorder == null)
			return 0L;
		endTime = System.currentTimeMillis();
		Log.i("ACTION_END", "endTime" + endTime);
		mMediaRecorder.stop();
		mMediaRecorder.reset();
		mMediaRecorder.release();
		mMediaRecorder = null;
		Log.i("ACTION_LENGTH", "Time" + (endTime - startTime));
		return endTime - startTime;
	}

	private final Handler mHandler = new Handler();
	private Runnable mUpdateMicStatusTimer = new Runnable() {
		public void run() {
			updateMicStatus();
		}
	};

	/**
	 * 更新话筒状态 分贝是也就是相对响度 分贝的计算公式K=20lg(Vo/Vi) Vo当前振幅值 Vi基准值为600:我是怎么制定基准值的呢? 当20
	 * * Math.log10(mMediaRecorder.getMaxAmplitude() / Vi)==0的时候vi就是我所需要的基准值
	 * 当我不对着麦克风说任何话的时候,测试获得的mMediaRecorder.getMaxAmplitude()值即为基准值。
	 * Log.i("mic_", "麦克风的基准值:" + mMediaRecorder.getMaxAmplitude());前提时不对麦克风说任何话
	 */
	private int BASE = 600;
	private int SPACE = 300;// 间隔取样时间
	private ImageView view;

	private void updateMicStatus() {
		if (mMediaRecorder != null && view != null) {
			// int vuSize = 10 * mMediaRecorder.getMaxAmplitude() / 32768;
			int ratio = mMediaRecorder.getMaxAmplitude() / BASE;
			int db = 0;// 分贝
			if (ratio > 1)
				db = (int) (20 * Math.log10(ratio));
			switch (db / 4) {
			case 0:
				view.setImageBitmap(null);
				break;
			case 1:
				view.setImageResource(R.drawable.audio_recorder_volume_1);
				break;
			case 2:
				view.setImageResource(R.drawable.audio_recorder_volume_2);
				break;
			case 3:
				view.setImageResource(R.drawable.audio_recorder_volume_3);
				break;
			case 4:
				view.setImageResource(R.drawable.audio_recorder_volume_4);
				break;
			case 5:
				view.setImageResource(R.drawable.audio_recorder_volume_5);
				break;
			default:
				view.setImageResource(R.drawable.audio_recorder_volume_5);
				break;
			}
			mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
			/*
			 * if (db > 1) { vuSize = (int) (20 * Math.log10(db)); Log.i("mic_",
			 * "麦克风的音量的大小:" + vuSize); } else Log.i("mic_", "麦克风的音量的大小:" + 0);
			 */
		}
	}

}
分享到:
评论

相关推荐

    android获取音量分贝值

    尽管这不是直接测量音量的方法,但在特定情况下,可以作为辅助数据来源。 总之,获取Android设备的音量分贝值需要音频输入、数据处理和数学计算。通过使用`MediaRecorder`或`AudioRecord`捕获音频数据,进行FFT转换...

    Android中实时获取音量分贝值详解

    总的来说,实时获取音量分贝值涉及对声音测量单位的理解、Android API的使用以及适当的计算方法。开发者需要根据应用的具体需求选择合适的方法来获取和处理声音数据,确保结果的准确性和实用性。

    Android测试周围环境分贝的功能源码.zip

    在测试环境分贝的场景中,我们需要使用`MediaRecorder`来记录麦克风捕获的声音,并将其转换为可测量的分贝值。设置`MediaRecorder`的音频源为`MediaRecorder.AudioSource.MIC`,可以确保我们从设备的麦克风获取数据...

    Android 测试周围环境分贝的功能源码.rar

    在Android开发中,有时我们需要为应用程序添加特殊功能,例如检测并显示周围环境的音量,也就是我们常说的分贝(dB)水平。这个"Android测试周围环境分贝的功能源码"是一个示例项目,用于帮助开发者理解如何在...

    Android 测试周围环境分贝的功能源码.zip源码资源下载

    `AudioRecord`类用于实时读取音频流,更适合于实时监测环境音量。在本例中,我们可能使用`AudioRecord`来不断读取音频数据,计算分贝值。需要设定音频源、采样率、通道数和音频格式等参数,并创建`AudioRecord`实例...

    android 声波图

    例如,音频源通常选择`MediaRecorder.AudioSource.MIC`,采样率可以为44100Hz,通道数一般为1(单声道)或2(立体声),音频格式多为`AudioFormat.ENCODING_PCM_16BIT`。 3. **初始化AudioRecord实例**: - 使用...

    安卓Android源码——测试周围环境分贝的功能源码.zip

    在安卓(Android)平台上开发应用程序时,有时我们需要获取设备周围的环境音量,这通常涉及到音频输入和信号处理。本资源提供了实现这一功能的源码,允许开发者创建一个能够测试环境分贝(声压级)的应用。以下是这...

Global site tag (gtag.js) - Google Analytics