生のオーディオ フレームをキャプチャするオーディオ レコーダー クラスがあります。これは、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);
}
それは正常に動作し、私の問題を解決します。これらの電話には、オーディオ レコーダー バッファの初期化を遅らせるハードウェア レベルの問題があるようです。そのため、最初の読み取りは遅延時間の後に開始する必要があります。問題を解決する方法や修正方法はありますか?