1

我有一个录音机类来捕获原始音频帧。它适用于除三星 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);

}

它工作正常并解决了我的问题。似乎这些手机有硬件级别问题,延迟了录音机缓冲区初始化。所以第一次读取应该在延迟时间之后开始。有什么办法或解决办法来解决这个问题吗?

4

0 回答 0