我正在尝试使用for循环中的try / catch块将WAV文件连续添加在一起。我有一个现有的代码段,可以创建一个结合了两个现有文件的新文件,并且我试图将其转换为可以覆盖现有文件并使用其内容的文件。
但是,到目前为止,这是唯一正在发生的事情。给定一系列大小为 n 的WAV file [] ,最后一个条目( file [n-1] )是唯一存储的放在求和文件 x 上。我希望将数组中的所有文件一起添加到 x 中。
我的基本方法包括两部分:将前两个文件加在一起以初始化 x ( x = file [0] + file [1] ),然后将所有后续文件到 x ( x + = file [2] + ... + file [n-1] )。第一部分工作正常;我可以初始化一个新的WAV文件,该文件可以轻松合并前两个文件。循环播放时遇到问题。我似乎无法操纵文件写入以使其在 x 不只是成为 file [n-1] 的地方。
以下是可以获取两个文件并将其添加到新文件中的代码:
try {
AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File("filepath"));
AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File("filepath"));
AudioInputStream appendedFiles = new AudioInputStream(
new SequenceInputStream(clip1, clip2),
clip1.getFormat(),
clip1.getFrameLength() + clip2.getFrameLength());
AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE,
new File("newFileFilepath"));
} catch (Exception e) { e.printStackTrace(); }
这是我尝试解决问题下半部分(循环附加)的方式:
// filepaths in the array need to be initialized, these are simply placeholders.
String[] filePathClips = {"filepath1", "filepath2", "filepath3", "filepath4"};
// Subsequent appends to the first and second clips, if necessary.
for (int n = 2; n < filePathClips.length; n++) {
try {
String stitchAppend = filePathClips[n];
// clip1 represents the stored and preexisting, previously combined files.
AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File("combinedFiles"));
// clip2 is the upcoming file to be added to clip1.
AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(stitchAppend));
// appendedFiles is the AudioInputStream of the combined files.
AudioInputStream appendedFiles = new AudioInputStream(
new SequenceInputStream(clip1, clip2),
clip1.getFormat(),
clip1.getFrameLength() + clip2.getFrameLength());
// This line generates the new file, which should just write over the
// file of the same name (in this case, "combinedFiles").
AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE,
new File("combinedFiles"));
}
catch (Exception e) { e.printStackTrace(); }
}
我希望写入的文件是所有文件的总和,但是,结果文件只是在循环中添加的最后一个文件。任何对Java声音库或WAV文件管理有丰富经验的人都可以提供帮助,如果您这样做的话,我将不胜感激!感谢您阅读我的问题,并感谢我已经阅读的无数答案,这些都给了我学位。
答案 0 :(得分:0)
所以,我想通了,回想起来似乎很明显。基本上,每次覆盖文件都会引起一些问题,正如jakub_d指出的那样。解决此问题的方法是更新AudioInputStream附加文件。结果代码为:
try {
// filepaths in the array need to be initialized, these are simply placeholders.
String[] filePathClips = {"filepath1", "filepath2", "filepath3", "filepath4"};
// The first two clips are combined to created the appendedFiles AIS.
AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(filePathClips[0]));
AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(filePathClips[1]));
AudioInputStream appendedFiles = new AudioInputStream(
new SequenceInputStream(clip1, clip2),
clip1.getFormat(),
clip1.getFrameLength() + clip2.getFrameLength());
// Subsequent appends to the first and second clips, if necessary.
for (int n = 2; n < filePathClips.length; n++) {
String stitchAppend = filePathClips[n];
// clip2 is the upcoming file to be added to appendedFiles.
clip2 = AudioSystem.getAudioInputStream(new File(stitchAppend));
// appendedFiles is the AudioInputStream of the combined files.
appendedFiles = new AudioInputStream(
new SequenceInputStream(appendedFiles, clip2),
appendedFiles.getFormat(),
appendedFiles.getFrameLength() + clip2.getFrameLength());
}
// This line generates the new file.
AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE,
new File("combinedFilesFilepath"));
} catch (Exception e) { e.printStackTrace(); }