2008-11-08 5 views
1

Я пытаюсь создать звуковой фильтр с помощью API JavaSound для чтения и записи аудиофайлов. В настоящее время мой код структурирован следующим образом:Запись 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() принимает входной поток. Есть идеи?

ответ

1

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

Есть, однако, много аудиоформатов, которые могут быть легко переданы. Многие из них имеют открытые библиотеки для java, поэтому, если вы хотите добавить внешнюю библиотеку, этого не должно быть так сложно.

2

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

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

0

Можно решить проблему, если вы повторно реализуете метод AudioSystem.write. Он не работает с форматом потока и WAVE. Вы должны читать данные из AudioInputStream, кэшировать его в массиве байтов, обрабатывать массив и записывать в волновой файл. Я бы рекомендовал вам проверить классы из примера: How to record audio to byte array

Смежные вопросы