我正在尝试从AudioRecord录制4秒的集合,处理它们,然后重新录制等等。我以44100样本/秒的速度录制,你可以在下面的代码中看到。我必须提到我记录,或者至少我应该记录19Khz的脉冲组。
int frequency = 44100;
int blockSize = 44100;
int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
final int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration,
audioEncoding, blockSize * 8); // if I multiply blockSize by 4 it will only give 88200 buffer size
// start recording until explicitly stopped
while ( <stopCondition> ) {
recData = new ByteArrayOutputStream();
dos = new DataOutputStream(recData);
short[] buffer = new short[blockSize * 4]; // Save the raw PCM
// timePassed = false;
// timer.cancel();
// timer.start();
audioRecord.startRecording();
// while (!timePassed) {
int bufferReadResult = audioRecord.read(buffer, 0, blockSize * 4);
for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
try {
dos.writeShort(buffer[i]);
// buffer[i] = 0;
} catch (IOException e) {
e.printStackTrace();
}
}
// }
audioRecord.stop();
try {
dos.flush();
dos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
... process the recorded data
从代码中可以看到(注释)我尝试使用countDownTimer,它在4秒后停止录制。它一次只读取audioRecord 1秒(blockSize没有乘以4),但我不确切知道缓冲区是否被覆盖,因为偏移量为0 - 我认为它确实存在,但我仍然不确定:)使用这种方法它没有记录4秒钟内播放的脉冲数 - 播放了16个脉冲,只记录了2-3个。
我试过没有计时器并从audioRecord读取blockSize * 4 = 44100(= 1s)* 4 = 4s,但是在Audacity我看到只记录了1秒 - 代码中的某个地方,这里没有显示,我写了将数据记录到文件中以检查输出。再次记录的脉冲数量不合适,但这很明显,因为我只有1秒的记录数据。
是否有更好的方法可以连续录制X秒并处理它们?或者,如果我的方法比我做错了?
谢谢。
答案 0 :(得分:0)
尝试下面的代码。
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
startRecording();
}
}, 4000);
startRecording Method
private void startRecording() {
myFilename = getFilename();
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(output_formats[currentFormat]);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(getFilename());
recorder.setOnErrorListener(errorListener);
recorder.setOnInfoListener(infoListener);
try {
recorder.prepare();
recorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
<强>的getFileName 强>
private String getFilename() {
String filepath = Environment.getExternalStorageDirectory().getPath();
File file = new File(filepath, AUDIO_RECORDER_FOLDER);
SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MMM-yyyy hh-mm-ss");
String currentDateandTime = sdfDate.format(new Date());
if (!file.exists()) {
file.mkdirs();
}
return (file.getAbsolutePath() + "/" + currentDateandTime + file_exts[currentFormat]);
}
这将在4秒后开始新的录音,getFilename将为你的录音命名为currentDate和time。
希望你看起来和我从你的问题中理解的一样,如果我想念你,那么请纠正我。