我有一个录音机类来捕捉原始音频帧。它适用于所有其他手机,除了三星s3 sprit版本。(它适用于其他三星s3手机)。我已经找到了解决这个问题。问题似乎很奇怪,所以这个解决方案可以帮助一个人节省时间。
我的录音机代码是
// record init
audioRecorder.setRecordPositionUpdateListener(updateListener);
audioRecorder.setPositionNotificationPeriod(framePeriod);
if(audioRecorder.getState() == AudioRecord.STATE_INITIALIZED ){
//Buffer for audio record
buffer = new byte[framePeriod*bSamples/8*nChannels];
audioRecorder.startRecording();
audioRecorder.read(buffer, 0, buffer.length)
}
和我的RecordPositionUpdate列表器
public void onPeriodicNotification(AudioRecord recorder)
{
int data_Len = audioRecorder.read(buffer, 0, buffer.length); // Fill buffer
Log.d(TAG,"Recieved audio buffer of length "+data_Len);
}
如果是samsung s3 sprint,我可以看到第一个读取本身给出了“ERROR_INVALID_OPERATION”。因此,以下更改有助于解决问题
// record init
audioRecorder.setRecordPositionUpdateListener(updateListener);
audioRecorder.setPositionNotificationPeriod(framePeriod);
if(audioRecorder.getState() == AudioRecord.STATE_INITIALIZED ){
//Buffer for audio record
buffer = new byte[framePeriod*bSamples/8*nChannels];
audioRecorder.startRecording();
//Fix for recording issue with Samsung s3 Sprint phones.Doing a delayed first read
private final int audioRecorderSettleTime = 1500;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int bytesReceived = audioRecorder.read(buffer, 0, buffer.length);
Log.d(TAG,"Delayed first read: bytes recieved "+ bytesReceived);
}
}, audioRecorderSettleTime);
}
它工作正常并解决我的问题。看起来这些手机有硬件级别问题,延迟了录音机缓冲区初始化。所以第一次读取应该在延迟时间之后开始。 有什么方法可以解决这个问题吗?