我有一个录音机类来捕获原始音频帧。它适用于除三星 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);
}
它工作正常并解决了我的问题。似乎这些手机有硬件级别问题,延迟了录音机缓冲区初始化。所以第一次读取应该在延迟时间之后开始。有什么办法或解决办法来解决这个问题吗?