当您将 byte[] 放入队列时,您需要创建一个新的缓冲区。否则下一次录制将覆盖相同的缓冲区。只需移动初始化bData
进入循环:
Queue<byte[]> qArray = new LinkedList<byte[]>();
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRecording) {
bData = new byte[BufferElements];
recorder.read(bData, 0, BufferElements);
qArray.add(bData);
if (AudioRecord.ERROR_INVALID_OPERATION != 0) {
SendAudio();
}
}
}
}, "AudioRecorder Thread");
recordingThread.start();
您还应该添加逻辑来限制队列的大小。如果队列溢出,您仍然会丢失数据,但至少不会因内存不足错误而崩溃。
EDIT这是记录循环的修改版本,可以进行适当的错误检查。它使用一个Queue<ByteBuffer>
代替Queue<byte[]>
:
public void run() {
bData = ByteBuffer.allocate(BufferElements);
while (isRecording && !isInterrupted()) {
int result = recorder.read(bData, 0, BufferElements);
if (result > 0) {
qArray.add(bData);
SendAudio();
bData = ByteBuffer.allocate(BufferElements);
} else if (result == AudioRecord.ERROR_INVALID_OPERATION) {
Log.e("Recording", "Invalid operation error");
break;
} else if (result == AudioRecord.ERROR_BAD_VALUE) {
Log.e("Recording", "Bad value error");
break;
} else if (result == AudioRecord.ERROR) {
Log.e("Recording", "Unknown error");
break;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
break;
}
}
}
当然,你需要在某个地方打电话recorder.startRecording()
否则你将得不到任何数据。