我正在制作一个程序,以音频形式记录抽认卡,然后将它们编译成一组,这样我就可以在通勤时收听。
我试图在卡片的正面和背面之间添加一点沉默,让自己有时间思考。为此,我录制了大约 3 秒没有声音的音频,然后我计划将其连接多次以提供所需的静音量。当我尝试这样做时,我发现我实际上并没有添加任何新声音。
这是我这样做的一种简化方式:
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.File;
import java.io.SequenceInputStream;
public class AudioConcatenaterMultiple {
public static void main(String[] args) {
String wavFile = "RecordAudio.wav";
int concatenateTimes = 5;
try {
AudioInputStream clip = AudioSystem.getAudioInputStream(new File(wavFile));
double clipDuration = getAudioLength(clip);
System.out.println("Clip duration: " + clipDuration);
System.out.println("Target duration: " + clipDuration * (concatenateTimes + 1));
AudioInputStream appendedFiles = clip;
for (int i = 0; i < concatenateTimes; i++) {
appendedFiles = concatenate(appendedFiles, clip);
}
double appendedDuration = getAudioLength(appendedFiles);
System.out.println("Appended duration: " + appendedDuration);
AudioSystem.write(appendedFiles,
AudioFileFormat.Type.WAVE,
new File("wavAppended.wav"));
} catch (Exception e) {
e.printStackTrace();
}
}
private static double getAudioLength(AudioInputStream clip) {
AudioFormat format = clip.getFormat();
long frames = clip.getFrameLength();
return (frames+0.0) / format.getFrameRate();
}
private static AudioInputStream concatenate(AudioInputStream clip1, AudioInputStream clip2) {
return new AudioInputStream(
new SequenceInputStream(clip1, clip2),
clip1.getFormat(),
clip1.getFrameLength() + clip2.getFrameLength());
}
}
我注意到如果我把它放在 for 循环的开头
clip = AudioSystem.getAudioInputStream(new File(wavFile));
然后它工作。
为什么每次都需要一个新的输入流?有一个更好的方法吗?就是感觉没那么干净。
谢谢