For my app, I need to record audio from MIC on an Android phone, and send it over TCP to the other android phone, where it needs to be played.
I am using AudioReco
The problem is lying here:
bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
dataOutputStreamInstance.write(tempBuffer);
You read bufferRead
worth of bytes but you attempt to write whole buffer to the output stream.
To improve the recording process, you may consider following points:
NoiseSuppressor
(since API 16)AcousticEchoCanceler
(since API 16)Here is my setup for my previous android app:
// Calculate minimum buffer size
int minBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
// Initialize AudioRecord for getting audio from device
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize * 4);
if (API > API 16) {
if (NoiseSuppressor.isAvailable()) {
NoiseSuppressor.create(recorder.getAudioSessionId()).setEnabled(true);
}
if (AcousticEchoCanceler.isAvailable()) {
AcousticEchoCanceler.create(recorder.getAudioSessionId()).setEnabled(true);
}
}
....
byte[] tempBuffer = new byte[minBufferSize];
while (/*isRecording*/) {
bufferRead = recordInstance.read(tempBuffer, 0, minBufferSize);
dataOutputStreamInstance.write(tempBuffer, 0, bufferRead);
}