`
水木清华77
  • 浏览: 36243 次
  • 性别: 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 AudioRecord和MediaRecorder录音并实现了实时获取音量大小

    本文将深入探讨如何使用`AudioRecord`和`MediaRecorder`类进行录音,并实现实时获取音量大小的功能。 首先,`AudioRecord`是Android提供的一个低级API,允许开发者直接访问音频硬件来录制声音。它提供了高度的...

    Android 获取麦克风的音量(分贝)

    为了监听麦克风的音量,我们首先需要实例化`MediaRecorder`,然后设置音频源为`MediaRecorder.AudioSource.MIC`: ```java MediaRecorder mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource...

    android录音实时监控音量大小

    实时监控音量大小并将其动态展示在界面上,不仅可以提升用户体验,还可以用于各种应用场合,比如音乐播放器、语音识别或者通话质量检测等。以下是对这个话题的详细阐述: 一、Android录音基础 Android系统提供了...

    录音时根据音量大小实现心电图的效果

    本话题将深入探讨如何使用`MediaRecorder` API在录音过程中根据音量大小实时生成类似心电图(ECG)的效果。心电图是一种视觉化声音波动的方式,通过这种方式,我们可以直观地看到声音的动态变化。 首先,我们要理解...

    Android-VoiceLine一个可以根据麦克风音量大小显示一些波形效果的控件

    Android平台提供了`MediaRecorder`类用于录音,而`VoiceLine`控件可能需要利用`AudioRecord`类来获取音频流的实时数据。通过对音频数据的振幅进行分析,`VoiceLine`可以计算出相应的波形高度,进而更新界面的绘制。 ...

    MediaRecorder音视频实时采集

    "Android音视频实时采集MediaRecorder使用指南" 一、MediaRecorder简介 MediaRecorder是Android系统中用于音视频采集和录制的类,提供了一个通用的音视频录制解决方案。通过MediaRecorder,可以实现音频和视频的...

    mediarecorder获取视频数据

    在Android开发中,`MediaRecorder` 是一个非常重要的类,用于录制音频、视频或同时录制。这个类使得开发者能够直接处理编码后的数据,而无需直接操作SD卡,从而简化了视频录制过程。在这个主题中,我们将深入探讨...

    Android 用MediaRecorder录像源码

    在Android平台上,MediaRecorder是一个非常重要的类,它用于录制音频、视频或同时录制音频和视频。这个类提供了从数据源到输出文件的媒体流录制功能。在这个“Android 用MediaRecorder录像源码”主题中,我们将深入...

    MediaRecorder类介绍1

    ### MediaRecorder类详解 #### 一、概述 `MediaRecorder`类是Android系统中用于音频和视频录制的核心组件之一。该类提供了一系列的功能接口来帮助开发者实现多媒体录制的应用场景。根据给定的部分内容,我们可以...

    MediaRecorder录制视频和语音

    - **设置文件大小限制**:`mediaRecorder.setMaxFileSize(long maxFileSize)`可以限制录制文件的大小。 ### 4. 注意事项 - 在开始录制前,确保所有必要的参数都已经设置好。 - 录制过程中不要进行过多的操作,以免...

    本示例演示使用 MediaRecorder 录音

    在Android平台上,MediaRecorder是一个非常重要的类,它用于录制音频、视频或同时录制音频和视频。这个类提供了方便的方法来设置各种录音参数,并启动、停止和重置录音过程。在这个示例中,我们将深入探讨如何使用...

    MediaRecorder录制视频.rar

    在Android平台上,MediaRecorder是一个非常重要的工具类,用于录制音频、视频或同时录制音频和视频。这个类提供了从各种输入源(如摄像头)捕获多媒体数据,并将其编码为适合存储或传输的格式的功能。在本例中,...

    安卓录音软件(MediaRecorder)

    在Android平台上,MediaRecorder是一个非常重要的类,它用于录制各种媒体源,如音频、视频等。本项目基于MediaRecorder,专注于实现一个简单的安卓录音软件,是学习和掌握Android音频录制功能的良好实践。以下是对...

    MediaRecorder 录音,仿微信录音界面效果

    在仿微信录音效果时,考虑到存储和传输的需求,可以适当权衡音质和文件大小。 **3. 用户界面设计:** 微信的录音界面通常包含开始录音按钮、暂停/继续按钮、停止按钮以及录音时间显示。这些元素可以通过XML布局文件...

    MediaRecorder获取H264数据

    在Android开发中,`MediaRecorder` 是一个非常重要的类,用于录制音频、视频或同时录制。在本场景中,我们关注的是如何通过 `MediaRecorder` 获取到H264编码的视频数据。H264,又称AVC(Advanced Video Coding),是...

    Android利用MediaRecorder录音

    同时,可以使用AudioAttributes进行音频属性的高级控制,例如调整音量、设置音频使用场景等。 总的来说,Android的MediaRecorder为开发者提供了强大的录音功能,通过合理配置和正确使用,可以实现高质量的音频录制...

    Android MediaRecorder 录制视频 socket发送

    这些参数会影响视频的质量和文件大小。 - **设置音频参数**:如果需要录制音频,需要设置音频源、编码器、采样率等。如果不录制音频,可以不设置音频源。 3. **Socket通信**: - **创建ServerSocket/Socket**:在...

    MediaRecorder的完整demo

    在Android开发中,`MediaRecorder` 是一个非常重要的类,用于录制音频、视频或同时录制这两者。这个类提供了一种简单的方法来设置各种录音参数,并启动和停止录制。在这个"MediaRecorder的完整demo"中,我们将深入...

    Android MediaRecorder Demo1

    在Android开发中,`MediaRecorder` 是一个非常重要的类,用于录制音频、视频或混合媒体。这个`Android MediaRecorder Demo1` 是一个基础的录音应用示例,旨在帮助初学者了解如何使用`MediaRecorder` API。如果你是...

    MediaRecorder视频录制

    在Android平台上,MediaRecorder是一个非常重要的工具类,用于录制音频、视频或同时录制音频和视频。这个"MediaRecorder视频录制"项目,显然专注于利用MediaRecorder实现后台视频录制功能。在Android Studio环境下,...

Global site tag (gtag.js) - Google Analytics