我正在创建一个应用,用户必须能够录制语音并收听此录音。但是在听完之后,用户必须能够继续录制,导致一个文件被合并到所有录音中(所有录音都附加到第一个)。
我注意到在搜索一些SO答案时,合并两个音频文件最简单,当它们以WAV格式录制时(如果其他格式可能也很好)。所以我搜索了一种以WAV格式录制的方法,找到了ExtAudioRecorder class。
使用这个类我成功录制了具有良好音质的.amr文件(这是一种压缩格式)。但是,当我尝试以.wav格式录制时,我得到了一个不稳定的版本,我在录制时说的(听起来像录音机/播放器正在跳过部分),非常像this question中描述的那样。 / p>
当应用程序正在录制时我按下停止按钮需要一些时间才能响应应用程序(仅当录制处于WAV /未压缩状态时),压缩录制才能完美(除合并之外)。这让我相信录制是在UI线程上完成的。
这是我的代码(在记录片段中):
private boolean createRecorder() {
try {
recorder = ExtAudioRecorder.getInstanse(false);
recorder.setOutputFile(recordingFile);
recorder.prepare();
return true;
} catch (Exception e) {
return false;
}
}
private boolean createPlayer() {
if (recordingFile != null) {
try {
player = new MediaPlayer();
player.setDataSource(recordingFile);
player.prepare();
return true;
} catch (Exception e) { }
}
return false;
}
private void recordButtonPressed() {
if (pageState == State.Recording) {
return;
} else if (pageState == State.Playing) {
this.pauseButtonPressed();
}
if (this.createRecorder()) {
recorder.start();
pageState = State.Recording;
}
}
private void pauseButtonPressed() { //works as a stop button
if (pageState == State.Recording) {
this.destroyRecorder();
pageState = State.Idle;
} else if (pageState == State.Playing) {
this.destroyPlayer();
pageState = State.Idle;
}
}
private void playButtonPressed() {
if (pageState == State.Playing) {
return;
} else if (pageState == State.Recording) {
this.pauseButtonPressed();
}
if (this.createPlayer()) {
player.start();
pageState = State.Playing;
}
}
我的ExtAudioRecorder类与the original完全相同。
我正在寻找以下问题之一的答案(强调第一个问题):