1

生のオーディオ フレームをキャプチャするオーディオ レコーダー クラスがあります。これは、samsung s3 sprit バージョンを除く他のすべての電話で動作します (他の samsung 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