为什么audioData
short[]
我在下面的代码中创建的缓冲区填充了0
每个
samplesIn += mRecordInstance.read(audioData, samplesIn, bufferSize - samplesIn);
?
缓冲区 ( audioData.length
) 的大小不是零,这意味着缓冲区不是空的,它只是用零填充。
我尝试将其更改FREQUENCY
为8000
-> 没有更改。
我正在实现 Echoprint 库 -如果您需要,请参阅此以获取更多信息。
audioData
来自 LogCat 的缓冲区被零填充的证明:
// ...
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();
}