Что я должен использовать в Android при портировании кода C ++, написанный с libsndfile?
-
27-09-2019 - |
Вопрос
Я портирую небольшую (<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
Объект он делает отчет о его кодировке и т. Д. Правильно, что обнадеживает.
Моя большая проблема в данный момент создает объект клипа. Это должно быть создано с линейным объектом, который обычно придет от аудиосистемы. Может кто-нибудь думать о том, как это об этом?
Решение
libsndfile можно скомпилировать для Android с помощью нативного комплекта развития. Как только у вас есть библиотека, составленная для Android, вы должны быть в состоянии использовать JNI для доступа к нему от Java.
Другие советы
Почему бы вам не просто сохранить этот код в C ++ и вызоветь его в Java через Jni. ?
Если вы можете портировать libsndfile, используя NDK, почему бы не просто использовать NDK, чтобы портировать свой код C ++ напрямую и не беспокоиться о портировании его в Java?