Я работаю над небольшим сценарием Java, чтобы перебирать файлы .wav в папке с именем «audiofiles» и объединять каждый отдельно с другим аудиофайлом (в данном случае с именем «тишина_2sec.wav»). Пока что у меня есть: -
import java.io.File;
import java.util.*;
import java.io.*;
import javax.sound.sampled.*;
public class silapp_2b{
public static void main(String[]args){
String wavFile2 = "silence_2sec.wav";
// get list of file names from audio directory
File audDir = new File("audiofiles");
//define a list to contain the audio files names and path
File[] filesList = audDir.listFiles();
// assign contents of each wav file from filesList to a string
try {
for(File f : filesList){
if (f.isFile()){
AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(f.getName()));
AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(wavFile2));
AudioInputStream appendedFiles =
new AudioInputStream(
new SequenceInputStream(clip1, clip2),
clip1.getFormat(),
clip1.getFrameLength() + clip2.getFrameLength());
AudioSystem.write(appendedFiles,
AudioFileFormat.Type.WAVE,
new File("output" + "(f.getName()).wav"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Это компилируется, но при выполнении возвращает следующую ошибку: -
java.io.FileNotFoundException: glitch2.wav (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at com.sun.media.sound.WaveFloatFileReader.getAudioInputStream(WaveFloatFileReader.java:164)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1181)
at silapp_2b.main(silapp_2b.java:32)
Какие-либо предложения?
вместо этого используйте f.getAbsolutePath(), попробуйте это.




Ошибка
AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(f.getName()));
Это пытается создать файл с заданным именем файла и ищет его в текущем каталоге.
Вы должны использовать File.getAbsolutePath (), чтобы получить полный абсолютный путь к файлу
AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(f.getAbsolutePath()));
или проще
AudioInputStream clip1 = AudioSystem.getAudioInputStream(f);
Та же проблема с wavFile2
Я подозреваю, что у вас будет такая же проблема со вторым файлом:
AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(wavFile2));
Здесь вам также нужно будет указать абсолютный путь. Если он также есть в audDir, выполните
File wavFile2 = new File(audDir.getAbsolutePath() + "/silence_2sec.wav");
AudioInputStream clip2 = AudioSystem.getAudioInputStream(wavFile2);
Спасибо за это. getAbsolutePath вводит файл из каталога аудио - другой файл (wavFile2) уже находится в каталоге программы, так что все работает нормально. Однако цикл for не выполняет итерацию по всем файлам в каталоге, и я не могу найти для этого причину.
@Diddlepara у вас есть вложенные каталоги? как вы его закодировали, он должен пройти через все файлы, но не в каталоги
нет - только один каталог с именем «audiofiles», помещенный в каталог программы. Идея состоит в том, что я могу поместить несколько файлов в этот каталог, запустить короткую программу на Java, и она выдаст серию аудиофайлов, к каждому из которых присоединен файл "silent_2sec.wav".
Все ли файлы находятся в filesList сразу после сборки? возможно, if (f.isFile()) фильтрует некоторые файлы, которые вы хотите сохранить по какой-то причине. Это может быть совсем другой вопрос. Примите мой ответ, если он решил вашу первоначальную проблему.
Ваш ответ определенно решил исходный вопрос, и я приму его. Похоже, что цикл for - это отдельная проблема
@Diddlepara Спасибо. Я предлагаю вам прямо новый вопрос, убедитесь, что вы указали древовидность папок и System.out после создания списка файлов.
Обратите внимание: поскольку вы перебираете аудиофайлы, вам не нужно создавать новый объект
File, вы можете просто заменитьnew File(f.getName())наf.