JAVA - итерация по папке с аудиофайлами, присоединение к каждому аудиофайлу

Я работаю над небольшим сценарием 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)

Какие-либо предложения?

Обратите внимание: поскольку вы перебираете аудиофайлы, вам не нужно создавать новый объект File, вы можете просто заменить new File(f.getName()) на f.

Arnaud 16.03.2018 14:17

вместо этого используйте f.getAbsolutePath(), попробуйте это.

Chol Nhial 16.03.2018 14:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка

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 19.03.2018 15:36

@Diddlepara у вас есть вложенные каталоги? как вы его закодировали, он должен пройти через все файлы, но не в каталоги

Bentaye 19.03.2018 15:44

нет - только один каталог с именем «audiofiles», помещенный в каталог программы. Идея состоит в том, что я могу поместить несколько файлов в этот каталог, запустить короткую программу на Java, и она выдаст серию аудиофайлов, к каждому из которых присоединен файл "silent_2sec.wav".

Diddlepara 19.03.2018 16:07

Все ли файлы находятся в filesList сразу после сборки? возможно, if (f.isFile()) фильтрует некоторые файлы, которые вы хотите сохранить по какой-то причине. Это может быть совсем другой вопрос. Примите мой ответ, если он решил вашу первоначальную проблему.

Bentaye 19.03.2018 16:13

Ваш ответ определенно решил исходный вопрос, и я приму его. Похоже, что цикл for - это отдельная проблема

Diddlepara 19.03.2018 16:21

@Diddlepara Спасибо. Я предлагаю вам прямо новый вопрос, убедитесь, что вы указали древовидность папок и System.out после создания списка файлов.

Bentaye 19.03.2018 16:25

Другие вопросы по теме