#留作记录后续参考、欢迎对自动录音有更好的想法的大佬一起讨论!
继参考了很多采集环境音量大小的博客,最后采用这位博主的计算方式,采集出来的音量很稳定
关于Android、ios录音时音量大小的计算
##点击“开始”按钮,开始录制
public void startRecord() {
flag = false;
Log.d("AudioRecorder","======开始录音=====");
new Thread(new Runnable() {
@Override
public void run() {
testVoice();
}
}).start();
}
注:前面已经进行了AudioRecorder的初始化,来源麦克风、单声道、频率16000HZ
##当环境音量超过自定义阈值时,开始写入文件
public void testVoice(){
//short[] buffer = new short[bufferSize];
byte[] buffer = new byte[bufferSizeInBytes];
//开启录音
audioRecord.startRecording();
while (status != Status.STATUS_STOP) {
//当用户没有点暂停和停止的时候,就一直检测外界声音大小
//启动录音后,要先read buffer,才会通知激活 listener
if(buffer != null && buffer.length > 0)
{
int len = audioRecord.read(buffer, 0, buffer.length);
if(len > 0)
{
data = new byte[len];
//将录音数据存到data数组中
System.arraycopy(buffer, 0, data, 0, len);
double realVolume = calculateVolume(data);
Log.v("realvolume", "测试当前环境音量==" + realVolume );
//环境中有声音
if(realVolume > 8.0)
{
status =Status.STATUS_START;
Log.i("=====================", "=====================start");
writeDataToFile();
}
//环境中没声音
else if(8.0 >= realVolume && realVolume >= 0)
{
status = Status.STATUS_PAUSE;
Log.i("=====================", "=====================pause");
}
//当返回的值无效
else if(isNaN(realVolume ))
{
Log.i("=====================", "=====================other");
break;
}
}else {
break;
}
} else {
break;
}
}
}
##将录音写入文件,pcm格式
public void writeDataToFile(){
byte fileData[] = new byte[data.length];
if(data != null) {
System.arraycopy(data, 0, fileData, 0, data.length);
RandomAccessFile mRandomAccessFile = null;
try {
mRandomAccessFile = new RandomAccessFile(new File(FileUtils.getPcmFileAbsolutePath(fileName)), rw);
//跳到最后一字节,追加内容
mRandomAccessFile.seek(mRandomAccessFile.length());
//long m = mRandomAccessFile.length();
mRandomAccessFile.write(fileData, 0, fileData.length);
//停止录制
if(status == Status.STATUS_STOP && mRandomAccessFile != null) {
// 关闭写入流
mRandomAccessFile.close();
}else {
return;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
##用户点击“停止”按钮,停止环境音量的检测,文件流关闭
public void stopRecord() {
Log.d("AudioRecorder","====停止录音====");
{
status = Status.STATUS_STOP;
if(!flag)
//如果AudioRecord没有被关闭
{
audioRecord.stop();
}
release();
}
}