Преобразование PCM-16 в AMR с использованием AmrInputStream

Я делаю преобразование из PCM-16 в AMR, используя AmrInputStream. Подробности для AmrInputStream можно найти здесь http://hi-android.info/src/android/media/AmrInputStream.java.html

Я довольно новичок в программировании, пока речь идет об использовании JNI и тому подобное, я понятия не имею, что такое JNI, и я не думаю, что это необходимо для этой дискуссии. AmrInputStream выше также, по-видимому, не найден в SDK или NDK, но я смог его использовать.

Я искал в Интернете, как использовать поток, но не нашел примеров. В конце я экспериментировал и нашел, что он похож на любой InputStream. Вот фрагмент кода

InputStream inStream; inStream = new FileInputStream("abc.wav"); AmrInputStream aStream = new AmrInputStream(inStream); File file = new File("xyz.amr"); file.createNewFile(); OutputStream out = new FileOutputStream(file); byte[] x = new byte[1024]; int len; while ((len=aStream.read(x)) > 0) { out.write(x,0,len); } out.close(); 

Я протестировал это, и он сработал (требуется добавить тэг #! AMR \ n в выходной файл для воспроизведения.) (Edit: Тег AMR должен быть #! AMR \ n).

Мой вопрос связан с тем, что мне удалось добиться этого, чтобы он работал в файле PCM-16 с частотой 8000 Гц. Любая (более высокая) частота, используемая для исходного файла PCM-16, приводит к выводу (без дискретизации). В файле AmrInputStream.java есть переменная SAMPLES_PER_FRAME, с которой я попытался сыграть, но, похоже, она ничего не влияет.

Любые советы или связанные с ними обсуждения приветствуются!

SAMPLES_PER_FRAME – это блок данных, который amrencoder действует за один раз (который отображается до 20 мс аудио).

Из подписей функций amr encoder (внизу http://hi-android.info/src/android/media/AmrInputStream.java.html )

 private static native int GsmAmrEncoderNew(); private static native void GsmAmrEncoderInitialize(int gae); private static native int GsmAmrEncoderEncode(int gae, byte[] pcm, int pcmOffset, byte[] amr, int amrOffset) throws IOException; private static native void GsmAmrEncoderCleanup(int gae); private static native void GsmAmrEncoderDelete(int gae); 

Кажется, что нет способа передать образец в кодировщик. (Gae – собственная дескриптор) частота дискретизации жестко запрограммирована на 8k по крайней мере с помощью этого api

Intereting Posts
Привязка данных Android – «Идентификатор ресурса не найден для атрибута» Расширение MediaController для Android Как получить Entity на сервлет с помощью MultipartEntity? Как фиксировать ключевые события внутри службы? Получить категорию любого приложения программно в Android? Создание приложения для камеры Android с использованием API-интерфейса Camera, который будет работать на всех устройствах Как проверить, установлено ли мое приложение по умолчанию или нет в android? Где разместить существующую базу данных в проекте студии android Совместное использование пользовательского AccountAuthenticator между приложениями Как рисовать часть растрового изображения через Canvas DrawBitmap Как установить переменную в соответствии с ароматами градиента Как заставить показывать и скрывать виртуальную клавиатуру, если аппаратная клавиатура недоступна? Работает ли Android JobScheduler или GCM JobScheduler после задания обновления? Цвет фона в ImageButton Сервер ADB не подтвердил