JavaSound запись в аудио файл с потоком - PullRequest
2 голосов
/ 08 ноября 2008

Я пытаюсь создать аудиофильтр, используя API JavaSound для чтения и записи аудио файлов. В настоящее время мой код структурирован следующим образом:

        ByteArrayOutputStream b_out = new ByteArrayOutputStream();

        // Read a frame from the file.
        while (audioInputStream.read(audioBytes) != -1) {   
            //Do stuff here....
            b_out.write(outputvalue);
        }   

        // Hook output stream to output file
        ByteArrayInputStream b_in   = new ByteArrayInputStream(b_out.toByteArray());
        AudioInputStream     ais    = new AudioInputStream(b_in, format, length);
        AudioSystem.write(ais, inFileFormat.getType(), outputFile);

Это читает входной файл как поток, обрабатывает его и записывает его в bytearrayoutputstream, но ожидает записи всего файла перед записью на диск. В идеале я бы хотел записать каждый образец на диск по мере его обработки. Я пробовал несколько комбинаций потоковых конструкций, но не могу найти способ сделать это, так как AudioSystem.write () принимает входной поток. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 27 декабря 2008

Каспердж ответ правильный. Вы, вероятно, работаете с файлами WAV. Посмотрите на это для макета волнового файла. Обратите внимание, что размер всего файла WAV закодирован в его заголовке.

Я не знаю, применимо ли это в вашем случае, но для обработки образцов WAV, как вы описали, вы можете использовать «обычный» не аудио-выходной поток Java. Вы можете использовать FileOutputStream, например, чтобы записать их во временный файл, и после обработки вы можете преобразовать временный файл в действительный файл WAV.

1 голос
/ 08 ноября 2008

В некоторых аудиоформатах требуются метаданные, описывающие длину потока (или количество порций) в заголовке, что делает невозможным запись данных до того, как будет представлен весь набор данных. Я подозреваю, что звуковой API Java для обработки всех форматов с одним и тем же API должен был навязать это ограничение специально.

Однако существует множество аудиоформатов, которые можно легко транслировать. У многих из них есть реализации открытой библиотеки для Java, поэтому, если вы хотите добавить внешнюю библиотеку, это не должно быть так сложно.

0 голосов
/ 28 августа 2016

Возможно решить проблему, если переопределить метод AudioSystem.write. Он не работает с потоком и форматом WAVE. Вы должны прочитать данные из AudioInputStream, кэшировать их в байтовом массиве, обработать массив и записать в волновой файл. Я бы порекомендовал вам проверить классы из примера: Как записать аудио в байтовый массив

...