Android MediaCodec onOutputBufferAvailable-如何控制回调频率?

问题描述

我正在将MediaCodectargetSdkVersion 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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...