Преобразование 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