Что я должен использовать в Android при портировании кода C ++, написанный с libsndfile?

StackOverflow https://stackoverflow.com/questions/4047251

Вопрос

Я портирую небольшую (<10 классов) проекта C ++ в Java. Проект манипулирует звуковые файлы, а в C ++ это использует libsndfile.. Отказ Код включает в себя такие вещи, как:

const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, &currentAudioBuffer[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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top