我正在尝试从MIC读取数据并处理它并将其存储在文件中。但是我没有从MIC获得任何数据,缓冲区全是零。
int MIN_BUF = AudioRecord.getMinBufferSize(8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioRecord recorder = new AudioRecord(
MediaRecorder.AudioSource.MIC, 8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, MIN_BUF);
byte[] pcm_in = new byte[320];
recorder.startRecording();
while(record)
{
int bytes_read = recorder.read(pcm_in, 0, pcm_in.length);
switch(bytes_read)
{
case AudioRecord.ERROR_INVALID_OPERATION:
case AudioRecord.ERROR_BAD_VALUE:
Log.i("Microphone", "Error in reading the data");
break;
default:
print(pcm_in);
break;
}
}
recorder.stop();
recorder.release();
但是在打印(pcm)中,当我逐字节打印时,我得到全零。有些帖子在stackoverflow中有类似的问题,但我的问题没有解决。
请帮我解决这个问题。
谢谢&问候,
SSuman185
答案 0 :(得分:0)
print(pcm_in)将显示实际数据。你需要将pcm_in数据循环到pcm直到你停止录制。
意味着您的变量记录是一个布尔权限。你会用另一种方法把它弄错。所以直到你做错了记录.read(pcm_in,0,pcm_in.length)操作将从你的麦克风获取数据并将其放入pcm_in(所以你需要确保pcm_in的大小等于pcm)。 bytes_read将是此操作中读取的字节大小。所以你可以在一个可以读取整个pcm_in数据的循环中将pcm_in字节复制到pcm。
例如:
bytes_read = recorder.read(pcm_in, 0, pcm_in.length);
for(int i=0; i<bytes_read ;i++){
pcm[i] = pcm_in[i];
}
但这是一种奇怪的用法。我认为你的pcm应该与你需要加载的文件一样大。并确保你将pcm_in添加到它,而不是覆盖。我想这就是你想要的。