Я пытаюсь написать приложение Java, которое манипулирует WAV-файлами высокого разрешения.У меня проблемы с импортом аудиоданных, т.е. с преобразованием файла .wav в массив значений типа double.
При использовании стандартного подхода выдается исключение.
AudioFileFormat as = AudioSystem.getAudioFileFormat(new File("orig.wav"));
-->
javax.sound.sampled.UnsupportedAudioFileException: file is not a supported file type
ВотИнформация о формате файла в соответствии с soxi:
<code>
dB$ soxi orig.wav
soxi WARN wav: wave header missing FmtExt chunk</p>
<p>Input File : 'orig.wav'
Channels : 8
Sample Rate : 96000
Precision : 24-bit
Duration : 00:00:03.16 = 303526 samples ~ 237.13 CDDA sectors
File Size : 9.71M
Bit Rate : 24.6M
Sample Encoding: 32-bit Floating Point PCM
Кто-нибудь может предложить самый простой способ для передачи этого аудио в Java?
Я пробовал использовать несколько техник.Как указано выше, я экспериментировал с Java AudioSystem (как на Mac, так и на Windows).Я также пытался использовать класс WavFile Эндрю Гринстеда , но это также не удается (WavFileException: код сжатия 3 не поддерживается).Одним из обходных путей является преобразование звука в 16 бит с использованием sox (с флагом -b 16), но это неоптимально, так как увеличивает минимальный уровень шума.
Кстати, я заметил, что файл МОЖЕТ быть прочитанпо libsndfile.Мой лучший выбор - написать jni-оболочку вокруг libsndfile, или вы можете предложить что-нибудь более быстрое?
Обратите внимание, что мне не нужно проигрывать аудио, мне просто нужно проанализировать его, манипулировать им, а затем написатьэто в новый файл .wav.
* ОБНОВЛЕНИЕ *
Я решил эту проблему, изменив класс Эндрю Гринстеда WavFile .В его оригинальной версии читаются только файлы, закодированные как целочисленные значения («код формата 1»);мои файлы были закодированы как плавающие («код формата 3»), и это было причиной проблемы.
Я опубликую измененную версию кода Гринстеда, когда у меня будет шанс.А пока, если кто-то захочет, отправьте мне сообщение.