获取麦克风音量
来源:互联网 发布:网络电视和数字电视 编辑:程序博客网 时间:2024/04/27 15:00
public class AudioRecorder
{
static final int FREQUENCY = 8000;
static final int CHANNEL_CONFIGURATION = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static final int AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
int audioBufferSize;
public static final int AUDIO_BUF_SIZE = 11;
int recBufSize;
AudioRecord audioRecord;
Thread recordorThread;
volatile boolean isRecording; //可用于暂停
private Handler handler;
Thread encodeThread;
// private Speex speex = new Speex();
public AudioRecorder(Handler handler)
{
this.handler = handler;
audioBufferSize = AudioRecord.getMinBufferSize(FREQUENCY, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
recBufSize = AudioRecord.getMinBufferSize(FREQUENCY, CHANNEL_CONFIGURATION, AUDIO_ENCODING);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, CHANNEL_CONFIGURATION, AUDIO_ENCODING, recBufSize);
}
public void startRecord()
{
if(!isRecording)
{
isRecording = true;
audioRecord.startRecording();
recordorThread = new RecordorThread();
recordorThread.start();
}
}
public void stopRecord()
{
isRecording = false;
audioRecord.stop();
}
public boolean isRecording()
{
return isRecording;
}
//用于暂停
public void setRecording(boolean isRecording)
{
this.isRecording = isRecording;
}
class RecordorThread extends Thread
{
public void run()
{
// 用于读取的 buffer
byte[] tempBuffer = new byte[audioBufferSize];
int bufferReadResult = 0;
int count = 0;
while (isRecording)
{
bufferReadResult = audioRecord.read(tempBuffer, 0, audioBufferSize);
int v = 0;
// 将 buffer 内容取出,进行平方和运算
for (int i = 0; i < tempBuffer.length; i++)
{
// 这里没有做运算的优化,为了更加清晰的展示代码
v += tempBuffer[i] * tempBuffer[i];
}
// 平方和除以数据总长度,得到音量大小。可以获取白噪声值,然后对实际采样进行标准化。
// 如果想利用这个数值进行操作,建议用 sendMessage 将其抛出,在 Handler 里进行处理。
//振幅
Log.d("gc", " ****************** volume = "+String.valueOf(v / (float) bufferReadResult));
//分贝(好像有问题)
double dB = 10*Math.log10(v/(double)bufferReadResult);
Log.d("gc", " ------------------ dB = " + dB);
count++;
if (bufferReadResult > 0 && count > 5)
{
int ss = v / bufferReadResult*2;
Message msg = handler.obtainMessage();
msg.what = AUDIO_BUF_SIZE;
msg.arg1 = ss;
handler.sendMessage(msg);
count = 0;
}
// byte[] packagebyte = new byte[bufferReadResult];
// System.arraycopy(tempBuffer, 0, packagebyte, 0, bufferReadResult);
}
}
}
}
{
static final int FREQUENCY = 8000;
static final int CHANNEL_CONFIGURATION = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static final int AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
int audioBufferSize;
public static final int AUDIO_BUF_SIZE = 11;
int recBufSize;
AudioRecord audioRecord;
Thread recordorThread;
volatile boolean isRecording; //可用于暂停
private Handler handler;
Thread encodeThread;
// private Speex speex = new Speex();
public AudioRecorder(Handler handler)
{
this.handler = handler;
audioBufferSize = AudioRecord.getMinBufferSize(FREQUENCY, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
recBufSize = AudioRecord.getMinBufferSize(FREQUENCY, CHANNEL_CONFIGURATION, AUDIO_ENCODING);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, CHANNEL_CONFIGURATION, AUDIO_ENCODING, recBufSize);
}
public void startRecord()
{
if(!isRecording)
{
isRecording = true;
audioRecord.startRecording();
recordorThread = new RecordorThread();
recordorThread.start();
}
}
public void stopRecord()
{
isRecording = false;
audioRecord.stop();
}
public boolean isRecording()
{
return isRecording;
}
//用于暂停
public void setRecording(boolean isRecording)
{
this.isRecording = isRecording;
}
class RecordorThread extends Thread
{
public void run()
{
// 用于读取的 buffer
byte[] tempBuffer = new byte[audioBufferSize];
int bufferReadResult = 0;
int count = 0;
while (isRecording)
{
bufferReadResult = audioRecord.read(tempBuffer, 0, audioBufferSize);
int v = 0;
// 将 buffer 内容取出,进行平方和运算
for (int i = 0; i < tempBuffer.length; i++)
{
// 这里没有做运算的优化,为了更加清晰的展示代码
v += tempBuffer[i] * tempBuffer[i];
}
// 平方和除以数据总长度,得到音量大小。可以获取白噪声值,然后对实际采样进行标准化。
// 如果想利用这个数值进行操作,建议用 sendMessage 将其抛出,在 Handler 里进行处理。
//振幅
Log.d("gc", " ****************** volume = "+String.valueOf(v / (float) bufferReadResult));
//分贝(好像有问题)
double dB = 10*Math.log10(v/(double)bufferReadResult);
Log.d("gc", " ------------------ dB = " + dB);
count++;
if (bufferReadResult > 0 && count > 5)
{
int ss = v / bufferReadResult*2;
Message msg = handler.obtainMessage();
msg.what = AUDIO_BUF_SIZE;
msg.arg1 = ss;
handler.sendMessage(msg);
count = 0;
}
// byte[] packagebyte = new byte[bufferReadResult];
// System.arraycopy(tempBuffer, 0, packagebyte, 0, bufferReadResult);
}
}
}
}
- 获取麦克风音量
- 利用MIXER获取麦克风录音音量
- 实时获取麦克风输入音量的代码
- 利用MIXER获取麦克风录音音量
- Android 获取麦克风的音量(分贝)
- c# Winform 获取麦克风音量 控制麦克风音量大小 (自用笔记未测试)
- Android 实时获取麦克风输入音量的代码
- Android 实时获取麦克风输入音量的代码
- Android 实时获取麦克风输入音量的代码
- Android 实时获取麦克风输入音量的代码
- Android 实时获取麦克风输入音量的代码
- Android 录音获取麦克风实时音量(转)--资料
- Android 实时获取麦克风输入音量的代码
- Android 实时获取麦克风输入音量的代码
- Android 实时获取麦克风录音的音量大小
- Android 实时获取麦克风输入音量的代码
- Android 实时获取麦克风输入音量的代码
- Android 实时获取麦克风输入音量的代码
- PL/SQL 快捷键设计以及添加快捷键 .
- org.apache.cxf.binding.soap.SoapFault: Unexpected wrapper element 出现命名空间不一致问题,解决方法
- 日期格式问题
- 反汇编 c++类
- android的屏幕适配
- 获取麦克风音量
- bat批处理文件操作
- VS2010中的调试技巧
- xml解析工具类
- ADPCM压缩算法
- 【Linux】 CPU亲和性(affinity)及与亲和性有关的两个函数 sched_setaffinity()和 sched_getaffinity()
- 定时无刷新更新树型控件(基于定时更新concentrator)
- 国旗面前
- myEclipse 生成hibernate hbm文件参数说明