Я переношу небольшой (‹10 классов) проект C++ на Java. Проект манипулирует звуковыми файлами, и в C++ это делается с помощью libsndfile. Код включает в себя такие вещи, как:
const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, ¤tAudioBuffer[WINDOW_SIZE * channels], SEGMENTATION_LENGTH );
В Java, как лучше всего манипулировать звуковыми файлами на низком уровне? Я говорю о таких вещах, как нормализация, добавление эха и т. д.
Отчет о проделанной работе
Немного покопавшись, я нашел javax.sound.sampled, который, похоже, подойдет.
Редактировать 2 При ближайшем рассмотрении это не будет работать (или, по крайней мере, непригодно для использования), так как оно основано на пакете com.sun.sound
.
Редактировать 3 После еще большей проверки и экспериментов пакеты com.sun.sound
и sun.misc
выпущены под GNU GPLv2, и я загрузил их в свой проект. Переименовав javax.sound.sampled
в imp.javax.sound.sampled
, проект компилируется, и я могу создавать объекты AudioFileFormat
без каких-либо исключений. У меня еще не было возможности много поиграть, но я буду держать вас в курсе.
Редактировать 4 Хорошо, некоторые вещи работают с javax.sound.sampled, другие нет. Например, такие вызовы, как:
AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile));
не работает, однако я могу обойти это, выполнив:
WaveFileReader wfr = new WaveFileReader();
AudioInputStream stream = wfr.getAudioInputStream(waveFile);
В общем, вызовы таких вещей, как AudioSystem.getAudioFileTypes()
, возвращают пустые списки. Я могу копаться в пакетах и видеть, что это как-то связано с провайдерами, но я не знаю, как это исправить. Получив мой объект stream
, он правильно сообщает о своей кодировке и т. д., что обнадеживает.
На данный момент моей большой проблемой является создание объекта Clip. Это должно быть создано с помощью объекта Line, который обычно поступает из AudioSystem. Кто-нибудь может придумать способ обойти это?