我需要将音频文件从 PCM 转换为 AMR,并尝试使用 Android API 16+ 中的 MediaCodec 进行转换。我在调用它的 queueInputBuffer 时遇到了 IllegalStateException:
07-16 19:40:55.519: E/AndroidRuntime(19227): FATAL EXCEPTION: main
07-16 19:40:55.519: E/AndroidRuntime(19227): java.lang.IllegalStateException
07-16 19:40:55.519: E/AndroidRuntime(19227): at android.media.MediaCodec.queueInputBuffer(Native Method)
这是我的代码:
private static MediaCodec mediaCodec;
private static void initMediaCodec() {
mediaCodec = MediaCodec.createEncoderByType("audio/3gpp");
MediaFormat mediaFormat = MediaFormat.createAudioFormat("audio/3gpp", 8000, 1);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 12800);
mediaFormat.setInteger(MediaFormat.KEY_SAMPLE_RATE, 8000);
mediaFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();
}
<...>
initMediaCodec();
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(fileBuffer); //fileBuffer is ByteBuffer from my input audio file
mediaCodec.queueInputBuffer(inputBufferIndex, 0, fileBuffer.capacity(), 0, 0);
}
<...>
我提到 inputBuffers 有 4 个元素,容量为 320,我的音频文件缓冲区可能容量为 96000+。
任何帮助将不胜感激。谢谢!