`
学不止
  • 浏览: 237953 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

android 获取实时麦克风声音大小

阅读更多

好久没来这里了。一直在吸取别人的东西。今天也发一个吧。获取安卓麦克风的声音大小。

直接上代码了

package com.coolsoft.app.oklight;

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

import android.media.MediaRecorder;
import android.os.Handler;
import android.util.Log;
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 = 200;// 间隔取样时间
	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));
			System.out.println("分贝值:"+db+"     "+Math.log10(ratio));
			switch (db / 4) {
			case 0:
				view.setImageBitmap(null);
				break;
			case 1:
				view.setImageResource(R.drawable.logo64);
				break;
			case 2:
				view.setImageResource(R.drawable.logo96);
				break;
			case 3:
				view.setImageResource(R.drawable.logo124);
				break;
			case 4:
				view.setImageResource(R.drawable.logo135);
				break;
			case 5:
				view.setImageResource(R.drawable.logo512);
				break;
			default:
				view.setImageResource(R.drawable.ic_launcher);
				break;
			}
			mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
			/*
			 * if (db > 1) { vuSize = (int) (20 * Math.log10(db)); Log.i("mic_",
			 * "麦克风的音量的大小:" + vuSize); } else Log.i("mic_", "麦克风的音量的大小:" + 0);
			 */
		}
	}

}

 

1
0
分享到:
评论

相关推荐

    android小工具-实时获取麦克风声音.zip

    在Android平台上,开发一款能够实时获取麦克风声音的小工具是一项技术性的工作,涉及到音频处理、权限管理以及用户界面设计等多个方面。本项目"android小工具-实时获取麦克风声音.zip"是一个专注于监听和显示麦克风...

    android实时获取麦克风声音

    在Android平台上,实时获取麦克风声音是一项常见的功能,可以用于各种应用,比如手机助听器、语音识别、音频录制或者声音分析等。本篇将详细讲解如何在Android中实现这一功能。 首先,我们需要理解Android的声音...

    android 实时获取麦克风声音

    在Android平台上,实时获取麦克风声音是一项常见的功能,尤其在社交应用如微信、QQ中,用户可以通过按住发送按钮实时录制并发送语音消息。要实现这样的功能,开发者需要理解音频采集、音频处理以及UI更新等多个方面...

    安卓获取麦克风声音大小经典满意Demo

    总之,“安卓获取麦克风声音大小经典满意Demo”是一个实用的教学示例,它涵盖了Android中获取麦克风音频数据并实时处理的关键步骤,对于理解和实现类似功能的开发者来说,是一份宝贵的参考资料。

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

    总结一下,Android获取麦克风音量并转化为分贝值,需要使用`MediaRecorder`类来获取音频样本,然后通过计算RMS值并转换为分贝。同时,别忘了处理权限问题和优化性能。在开发过程中,可以参考ATest项目中的代码进行...

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

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

    android FFT 获取音频的频率并实时显示

    在Android平台上,获取音频的频率并实时显示是一项常见的任务,特别是在音乐应用、音频分析或声音效果处理中。这里我们将深入探讨如何使用快速傅里叶变换(FFT)来实现这一功能。 快速傅里叶变换是一种计算离散...

    android录音实时监控音量大小

    Android系统并没有直接提供获取实时录音音量的方法,但可以通过监听音频流的音频数据来间接获取。一种常见的方法是利用AudioRecord类,它是直接访问音频硬件的接口。首先创建AudioRecord实例,设置音频源、采样率、...

    Android 各种音量的获取

    ### Android各种音量的获取详解 #### 一、引言 在Android开发过程中,对于音频控制的需求非常普遍,比如在开发电话应用时调整通话音量、在音乐播放器中调节播放音量等。本文将详细介绍如何通过编程方式获取Android...

    android端的声音检测程序(检测声音分贝大小).rar

    在Android平台上开发声音检测程序,主要是利用设备的麦克风来捕获环境中的音频信号,并通过特定的算法计算声音的分贝大小。以下是对这个主题的详细解析: 1. **Android SDK与麦克风访问**: Android SDK提供了访问...

    Android代码-使用MedioRecord录音根据声音大小图片显示波动.rar

    在Android平台上,开发一款应用程序,实现录音功能并根据声音大小实时显示图像波动,是一个常见的需求。这个名为"Android代码-使用MedioRecord录音根据声音大小图片显示波动.rar"的压缩包,显然包含了实现这一功能的...

    android开发随声音大小变化的自定义view

    在Android开发中,创建一个能够随声音大小变化的自定义View是一种常见的需求,尤其是在音乐播放器或者音频相关的应用中。这个自定义View可以是长方形或圆柱形,旨在模仿音频波形或音量指示器的效果。下面我们将深入...

    android自定义控件之声音大小显示

    本文将深入探讨如何创建一个自定义控件,用于根据麦克风输入的声音大小动态显示曲线图,并且该控件能响应触摸事件。我们将从以下几个方面进行讨论: 1. **麦克风数据获取** 在Android中,我们可以使用`...

    android 检测周围环境声音分贝

    在Android平台上,检测周围环境的声音分贝是通过访问设备的麦克风并进行音频处理来实现的。这涉及到Android的音频录制API和声学原理。以下是一些关键知识点: 1. **麦克风接口**:Android设备上的麦克风是捕捉声音...

    Android ijkplayer的使用解析

    在Android开发中,ijkplayer是一个广泛使用的开源媒体播放器库,它源于FFmpeg项目,提供了高效、稳定且可自定义的视频和音频播放解决方案。本文将深入解析如何在Android项目中集成并使用ijkplayer。 首先,...

    android麦克风录音源码

    4. **读取音频数据**:通过`read()`方法从麦克风获取音频数据。可以采用阻塞或非阻塞模式。通常在一个循环中读取,直到录音结束。 ```java short[] buffer = new short[bufferSize]; while (isRecording) { int ...

    Android录音的声波动画

    分贝值是一个反映声音强度的单位,适合用来表示声音的大小和变化。 5. **声波动画的实现**: 声波动画的实现可以通过在onDraw()方法中根据分贝值动态调整View的绘图参数,例如线条宽度、颜色深浅或者动画的速度。...

    android 录音与播放录音 带根据音频大小动态效果

    本文将深入探讨如何实现Android录音与播放录音,并介绍如何根据音频大小动态调整播放效果。 首先,我们需要理解Android的音频录制机制。Android提供了MediaRecorder类来处理音频和视频的录制工作。在录音之前,你...

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

    在Android开发中,实时获取音量分贝值是一项常见的需求,尤其在音频处理或声音监测的应用中。分贝(dB)是衡量声音强度的标准单位,它是一个无纲量的相对单位,通常用来描述声音相对于人类所能听到的最小声压(20微...

    录音获取声音振幅波形显示

    在"录音获取声音振幅波形显示"的场景中,我们需要关注如何录制音频,处理音频流数据,并在界面上实时绘制出声音的波动图像。 首先,我们需要初始化`MediaRecorder`对象,设置录音的参数。这包括源(通常是麦克风)...

Global site tag (gtag.js) - Google Analytics