Android 使用AudioRecord.read并始终获取最大振幅的缓冲区

Android 使用AudioRecord.read并始终获取最大振幅的缓冲区,android,Android,我正在尝试录制音频并检测静音,以停止录制并写入文件。以下是此处已有的代码片段: 公共类RecordAudio扩展异步任务{ @凌驾 受保护的Void doInBackground(Void…arg0){ Log.w(标签“doInBackground”); 试一试{ 字符串文件名=getTempFilename(); 试一试{ os=新文件输出流(文件名); }catch(filenotfounde异常){ e、 printStackTrace(); } bufferSize=AudioReco

我正在尝试录制音频并检测静音,以停止录制并写入文件。以下是此处已有的代码片段:

公共类RecordAudio扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…arg0){
Log.w(标签“doInBackground”);
试一试{
字符串文件名=getTempFilename();
试一试{
os=新文件输出流(文件名);
}catch(filenotfounde异常){
e、 printStackTrace();
}
bufferSize=AudioRecord.getMinBufferSize(频率,
信道配置、音频编码);
AudioRecord AudioRecord=新的录音(MediaRecorder.AudioSource.MIC,频率,
信道配置、音频编码、缓冲区大小);
short[]buffer=新的short[bufferSize];
录音。开始录制();
while(启动){
int bufferReadResult=audioRecord.read(buffer,0,bufferSize);
if(AudioRecord.ERROR\u无效\u操作!=bufferReadResult){
//检查信号
//设门槛
int foundPeak=搜索阈值(缓冲区,阈值);
如果(foundPeak>-1){//found信号
//记录信号
字节[]byteBuffer=ShortToByte(缓冲区、缓冲区读取结果);
试一试{
写操作系统(byteBuffer);
}捕获(IOE异常){
e、 printStackTrace();
}
}否则{//数一数时间
//不要保存信号
Log.d(标签“沉默…”);
}
}否则{
Toast.makeText(getBaseContext(),“Error!!!!”,Toast.LENGTH\u SHORT.show();
}
}
录音。停止();
//关闭文件
试一试{
os.close();
}捕获(IOE异常){
e、 printStackTrace();
}
copyWaveFile(getTempFilename(),getFilename());
deleteTempFile();
}捕获(可丢弃的t){
t、 printStackTrace();
Log.e(“录音”,“录音失败”);
}
返回null;
}
字节[]短到字节(短[]输入,int元素){
int短索引,字节索引;
int iterations=elements;//input.length;
byte[]buffer=新字节[iterations*2];
短索引=字节索引=0;
对于(/*NOP*/;short_index!=迭代;/*NOP*/)
{
缓冲区[字节索引]=(字节)(输入[短索引]&0x00FF);
缓冲区[字节索引+1]=(字节)((输入[短索引]&0xFF00)>>8);
++短索引;字节索引+=2;
}
返回缓冲区;
}
整数搜索阈值(短[]arr,短thr){
int peakIndex;
int arrLen=arr.length;

对于(peakIndex=0;peakIndex=thr)| |(arr[peakIndex]实际上,缓冲区中32000或-32000附近的值表示静默,当检测到信号时,值趋于零。因此,我将searchThreshold函数内的条件反转如下,实现了我所寻找的

    int searchThreshold(short[]arr,short thr_upper, short thr_lower){
        int peakIndex;
        int arrLen=arr.length;
        for (peakIndex=0;peakIndex<arrLen;peakIndex++){

            if ((arr[peakIndex] <= thr_upper) && (arr[peakIndex] >= thr_lower )){

                return peakIndex;
            }
        }
        return -1; //not found
    }
int searchThreshold(短[]arr,短thr_上,短thr_下){
int peakIndex;
int arrLen=arr.length;
对于(peakIndex=0;peakIndex)
    int searchThreshold(short[]arr,short thr_upper, short thr_lower){
        int peakIndex;
        int arrLen=arr.length;
        for (peakIndex=0;peakIndex<arrLen;peakIndex++){

            if ((arr[peakIndex] <= thr_upper) && (arr[peakIndex] >= thr_lower )){

                return peakIndex;
            }
        }
        return -1; //not found
    }