我有一個應用程序,它可以記錄麥克風的音頻,然後對音頻進行一些後期處理,因此我必須使用AudioRecord
類而不是標準MediaRecorder
。我的記錄代碼是這樣的:在Android 2.2中錄製麥克風時出現奇怪的失真
DataOutputStream dataOutputStreamInstance = new DataOutputStream(bufferedStreamInstance);
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int bufferSize = AudioRecord.getMinBufferSize((int)sampleRate, channelConfiguration, DEFAULT_AUDIO_ENCODING) * 2;
short[] microphoneBuffer = new short[bufferSize];
float[] processingBuffer = new float[bufferSize];
short[] outputBuffer = new short[bufferSize];
AudioRecord microphoneRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
microphoneRecorder.startRecording();
while(isRecording) {
synchronized(mutex) { ... check for pause condition, wait, etc. ... }
int numSamplesRead = microphoneRecorder.read(microphoneBuffer, 0, bufferSize);
// Convert 16-bit short data to floating point
getFloatingPointBufferFromPcmData(microphoneBuffer, processingBuffer, bufferSize);
doProcessingStuff(processingBuffer, bufferSize);
if(numSamplesRead == AudioRecord.ERROR_INVALID_OPERATION) {
throw new IllegalStateException("read() returned AudioRecord.ERROR_INVALID_OPERATION");
}
else if(numSamplesRead == AudioRecord.ERROR_BAD_VALUE) {
throw new IllegalStateException("read() returned AudioRecord.ERROR_BAD_VALUE");
}
try {
// Dump the output to the target file in 16-bit short format
getShortPcmBufferFromFloatingPointData(processingBuffer, outputBuffer, bufferSize);
for(int bufferIndex = 0; bufferIndex < numSamplesRead; bufferIndex++) {
dataOutputStreamInstance.writeShort(outputBuffer[bufferIndex]);
}
}
catch(Exception e) {
Log.e("MyApp", "Error while writing audio data to file: " + e.getMessage());
e.getStackTrace();
}
}
microphoneRecorder.stop();
上面的代碼工作正常,我實際上可以從設備錄製音頻,我聽到我的聲音和這樣。問題是,幾秒鐘後,一個非常奇怪的失真模式開始出現,直到整個信號被淹沒。下面是一個沉默的記錄,我通過把一些帶過話筒做的截圖,讓應用程序記錄一分鐘左右:
原始波形文件可以是downloaded here。
由於我的效果處理代碼,問題肯定是而不是,因爲我試過評論它並在兩種情況下都得到相同的結果。我在網上搜尋了其他可能遇到類似問題的代碼或人員,但沒有發現任何內容。
我實際上確實建議沿着這些線可能是問題;) – 2010-10-15 14:04:01
是的,這是真的。 :)但是,該錯誤是在轉換軟件,而不是我的Android代碼。不過,我確實讚揚了你的回答,因爲這讓我看到了正確的方向。 – 2010-10-15 14:18:21