以下のコードで作成したバッファがそれぞれaudioData
short[]
で満たされるのはなぜですか0
samplesIn += mRecordInstance.read(audioData, samplesIn, bufferSize - samplesIn);
?
バッファーのサイズ ( audioData.length
) は NOT ZERO です。これは、バッファーが空ではなく、ゼロで埋められていることを意味します。
に変更してみまし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();
}