我正在创建一个应用程序,用户必须能够在其中录制语音并收听此录音。但是在听完之后,用户必须能够继续录制,从而将所有录音合并到一个文件中(所有这些都附加到第一个文件中)。
我从搜索一些 SO 答案中注意到,当它们以 WAV 格式录制时,合并两个音频文件是最容易的(如果其他格式也可以的话)。于是找了个WAV格式录音的方法,找到了ExtAudioRecorder类。
使用这个类,我成功地录制了具有良好音频质量的 .amr 文件(这是一种压缩格式)。但是,当我尝试以 .wav 格式录制时,我得到了我在录制时所说的内容的断断续续的版本(听起来录音机/播放器正在跳过部分),就像这个问题中描述的那样。
当应用程序正在录制并且我按下停止按钮时,应用程序需要一些时间才能响应(仅当录制为 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 类与原来的.
我正在寻找以下问题之一的答案(重点放在第一个问题上):
- 我怎样才能让我的应用程序在没有波涛汹涌/UI 冻结的情况下进行录制?
- 如何将两个压缩的 .amr 文件合并为一个?
- 有没有其他方法可以做我想要实现的目标(在第一段中描述),我应该如何去做?