问题
Why is the audioData
short[]
buffer I create in the code below filled with 0
upon each
samplesIn += mRecordInstance.read(audioData, samplesIn, bufferSize - samplesIn);
?
The size of the buffer (audioData.length
) is NOT ZERO which means that the buffer is NOT EMPTY, it's just filled with zeros.
I've tried changing the FREQUENCY
to 8000
-> no change.
I'm implementing the Echoprint library - please refer to this for more information on this should you require it.
Proof from LogCat that the audioData
buffer is filled with zeros:
// ...
public final static int LISTENING_PASS_TIME = 20;
// cap to 30 seconds max, 10 seconds min.
public final static int MAX_LISTENING_PASS_TIME = 30;
public final static int MIN_LISTENING_PASS_TIME = 10;
private final int FREQUENCY = 11025;
private final int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
private final int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private Thread thread;
private volatile boolean isRunning = false;
AudioRecord mRecordInstance = null;
private short audioData[];
private int bufferSize;
private int secondsToRecord;
private volatile boolean continuous;
public void stop() {
this.continuous = false;
if (mRecordInstance != null)
mRecordInstance.stop();
}
public void run() {
this.isRunning = true;
try {
// create the audio buffer & get the minimum buffer size
int minBufferSize = AudioRecord.getMinBufferSize(FREQUENCY,
CHANNEL, ENCODING);
Log.d("Fingerprinter", "minBufferSize: " + minBufferSize);
// and the actual buffer size for the audio to record frequency *
// seconds to record.
bufferSize = Math.max(minBufferSize, this.FREQUENCY
* this.secondsToRecord);
Log.d("Fingerprinter", "bufferSize: " + bufferSize);
audioData = new short[bufferSize];
// start recorder
mRecordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC,
FREQUENCY, CHANNEL, ENCODING, minBufferSize);
// start recording
willStartListening();
mRecordInstance.startRecording();
boolean firstRun = true;
do {
try {
willStartListeningPass();
long time = System.currentTimeMillis();
// fill audio buffer with mic data.
int samplesIn = 0;
do {
samplesIn += mRecordInstance.read(audioData, samplesIn,
bufferSize - samplesIn);
if (mRecordInstance.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED)
break;
} while (samplesIn < bufferSize);
Log.d("Fingerprinter",
"Audio recorded: "
+ (System.currentTimeMillis() - time)
+ " millis");
// see if the process was stopped.
if (mRecordInstance.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED
|| (!firstRun && !this.continuous))
break;
// debugging: print audioData short[]
Log.d("Fingerprinter", "Audio Data Content:");
// String audioDataContent = "";
for (int i = 100; i < 110; i++) {
// audioDataContent = i + ":" + audioData[i];
Log.d("Fingerprinter", i + ":" + audioData[i]);
}
Log.d("Fingerprinter", "samplesIn: " + samplesIn);
firstRun = false;
didFinishListeningPass();
} catch (Exception e) {
e.printStackTrace();
Log.e("Fingerprinter", e.getLocalizedMessage());
didFailWithException(e);
}
} while (this.continuous);
} catch (Exception e) {
e.printStackTrace();
Log.e("Fingerprinter", e.getLocalizedMessage());
didFailWithException(e);
}
if (mRecordInstance != null) {
mRecordInstance.stop();
mRecordInstance.release();
mRecordInstance = null;
}
this.isRunning = false;
didFinishListening();
}
回答1:
I found that I did in fact record some data - it was just the section I chose to display that only recorded zeros
. I prove this by summarizing all entries into the audioData
array and dividing it by the number of entries into the array. The result was -3.455619047619048
.
来源:https://stackoverflow.com/questions/15245699/audiorecord-buffer-filled-with-zeros