Created
January 26, 2015 13:35
-
-
Save easternHong/b3ecadd63a5e7b6baec0 to your computer and use it in GitHub Desktop.
实时输出mic音量
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package com.hunt.androidtext; | |
| import android.media.AudioFormat; | |
| import android.media.AudioRecord; | |
| import android.media.MediaRecorder; | |
| import android.os.Handler; | |
| import android.os.Message; | |
| import android.util.Log; | |
| /** | |
| * Created by hunt on 2015/1/26. | |
| */ | |
| public class RecordThread { | |
| private static final String TAG = "AudioRecord"; | |
| static final int SAMPLE_RATE_IN_HZ = 8000; | |
| static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ, | |
| AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT); | |
| AudioRecord mAudioRecord; | |
| boolean isGetVoiceRun; | |
| Object mLock; | |
| public RecordThread() { | |
| mLock = new Object(); | |
| } | |
| public void getNoiseLevel(final Handler handler) { | |
| if (isGetVoiceRun) { | |
| Log.e(TAG, "还在录着呢"); | |
| return; | |
| } | |
| mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, | |
| SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT, | |
| AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE); | |
| if (mAudioRecord == null) { | |
| Log.e("sound", "mAudioRecord初始化失败"); | |
| } | |
| isGetVoiceRun = true; | |
| new Thread(new Runnable() { | |
| @Override | |
| public void run() { | |
| mAudioRecord.startRecording(); | |
| short[] buffer = new short[BUFFER_SIZE]; | |
| while (isGetVoiceRun) { | |
| //r是实际读取的数据长度,一般而言r会小于buffersize | |
| int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE); | |
| long v = 0; | |
| // 将 buffer 内容取出,进行平方和运算 | |
| for (int i = 0; i < buffer.length; i++) { | |
| v += buffer[i] * buffer[i]; | |
| } | |
| // 平方和除以数据总长度,得到音量大小。 | |
| double mean = v / (double) r; | |
| double volume = 10 * Math.log10(mean); | |
| Log.d(TAG, "分贝值:" + volume); | |
| // 大概一秒十次 | |
| Message msg = handler.obtainMessage(); | |
| msg.what = 0; | |
| msg.arg1 = (int) (volume * 100); | |
| handler.removeCallbacksAndMessages(null); | |
| handler.sendMessage(msg); | |
| synchronized (mLock) { | |
| try { | |
| mLock.wait(100); | |
| } catch (InterruptedException e) { | |
| e.printStackTrace(); | |
| } | |
| } | |
| } | |
| mAudioRecord.stop(); | |
| mAudioRecord.release(); | |
| mAudioRecord = null; | |
| } | |
| }).start(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment