问题描述
我正在将MediaCodec
与targetSdkVersion 28
(Android 9)结合使用,将PCM流从AudioRecorder
转换为3GPP / GSM VoIP应用程序的AMR。 onInputBufferAvailable()
回调调用AudioRecord.read(bb,bb.limit())
以使PCM样本通过可用的ByteBuffer
排队到编码器,而onOutbufferAvailable()
回调接受AMR帧并将其向下传递到RTP层打包和传输。在我们测试过的各种Android 7、8和9设备上,它都能很好地运行。
但是,在运行Android 10的Samsung XCoverPro上,onOutbufferAvailable()
回调只有在有26个AMR帧可用时才被触发,而不是以前的单个帧。假设每个帧代表20毫秒的音频,这将导致超过半秒的音频延迟。所以我的问题是,当特定数量的帧(理想情况下为1到5)可用时,我对MediaCodec
音频编码器有什么控制权以使其触发onOutputBufferAvailable()
回调?
像这样创建编码器...
String mimeType = MediaFormat.MIMETYPE_AUDIO_AMR_NB;
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME,mimeType);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE,sampleRate);
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT,1);
format.setInteger(MediaFormat.KEY_BIT_RATE,bitRate);
MediaCodec encoder = MediaCodec.createEncoderByType(mimeType);
encoder.configure(format,null,MediaCodec.CONFIGURE_FLAG_ENCODE);
我已经试验了MediaFormat.KEY_MAX_INPUT_SIZE
参数,但这似乎没有任何效果,并且设置MediaFormat.KEY_LATENCY
也没有帮助(无论如何,文档说它仅适用于视频编解码器)。
有什么建议吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)