Android AMR-WB 编码问题
Android AMR-WB encoding issue
我正在尝试使用 Android Oreo 的 AMR-WB 编码功能,使用 AudioRecorder 对实时麦克风捕获 PCM 进行编码。编码工作无一例外,但编码后的语音数据似乎并不完美。代码如下所示:
我的 AudioRecord 设置:
int audioSource = MediaRecorder.AudioSource.MIC;
int sampleRateInHz = 8000;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
AudioRecord ar = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSize);
MediaCodec 设置:
MediaCodec mc = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
MediaFormat mf = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AMR_WB, 4000, 1);
mf.setInteger(MediaFormat.KEY_BIT_RATE, 6600);
mc.configure(mf, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mc.start();
录音循环:
int srcLength = ar.read(buffer, 0, bufferSize); // reads 640 bytes
int ibufferId = mc.dequeueInputBuffer(-1);
ByteBuffer ibuffer = mc.getInputBuffer(ibufferId);
ibuffer.position();
ibuffer.put(buffer, 0, srcLength);
mc.queueInputBuffer(ibufferId, 0, srcLength, 0, 0);
int obufferId = mc.dequeueOutputBuffer(bufferInfo, -1);
if (obufferId == INFO_OUTPUT_FORMAT_CHANGED) {
obufferId = mc.dequeueOutputBuffer(bufferInfo, -1);
}
ByteBuffer obuffer = mc.getOutputBuffer(obufferId); // has 18 bytes
mc.releaseOutputBuffer(obufferId, false);
如果我将输出字节 (obuffer
) 写入文件并尝试使用 VLC 播放器播放它,它播放音频的速度比正常情况快。
这个问题有什么可能的解决方案吗?
我自己找到了答案。对于清晰的 AMR 音频,源 PCM 采样率必须为 16000。我不知道为什么会这样。
我正在尝试使用 Android Oreo 的 AMR-WB 编码功能,使用 AudioRecorder 对实时麦克风捕获 PCM 进行编码。编码工作无一例外,但编码后的语音数据似乎并不完美。代码如下所示:
我的 AudioRecord 设置:
int audioSource = MediaRecorder.AudioSource.MIC;
int sampleRateInHz = 8000;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
AudioRecord ar = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSize);
MediaCodec 设置:
MediaCodec mc = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
MediaFormat mf = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AMR_WB, 4000, 1);
mf.setInteger(MediaFormat.KEY_BIT_RATE, 6600);
mc.configure(mf, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mc.start();
录音循环:
int srcLength = ar.read(buffer, 0, bufferSize); // reads 640 bytes
int ibufferId = mc.dequeueInputBuffer(-1);
ByteBuffer ibuffer = mc.getInputBuffer(ibufferId);
ibuffer.position();
ibuffer.put(buffer, 0, srcLength);
mc.queueInputBuffer(ibufferId, 0, srcLength, 0, 0);
int obufferId = mc.dequeueOutputBuffer(bufferInfo, -1);
if (obufferId == INFO_OUTPUT_FORMAT_CHANGED) {
obufferId = mc.dequeueOutputBuffer(bufferInfo, -1);
}
ByteBuffer obuffer = mc.getOutputBuffer(obufferId); // has 18 bytes
mc.releaseOutputBuffer(obufferId, false);
如果我将输出字节 (obuffer
) 写入文件并尝试使用 VLC 播放器播放它,它播放音频的速度比正常情况快。
这个问题有什么可能的解决方案吗?
我自己找到了答案。对于清晰的 AMR 音频,源 PCM 采样率必须为 16000。我不知道为什么会这样。