You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编码MediaCodec的BufferInfo.presentationTimeUs为何有时会下降?

问题

将Android应用中G.711音频编码为AAC时,已确保输入时间戳lPresentationTime单调递增,但某设备上输出的bufferInfo.presentationTimeUs出现了下降情况,示例日志如下:

decreased to (micro-s): 62156000 from 62278000
decreased to (micro-s): 62157000 from 62279000
decreased to (micro-s): 95213500 from 95335500

相关输入配置与处理代码:

MediaFormat mfAACEncoder = new MediaFormat();
mfAACEncoder.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
mfAACEncoder.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
mfAACEncoder.setInteger(android.media.MediaFormat.KEY_SAMPLE_RATE, iClockRateAudio);
mfAACEncoder.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1024 * 4);//AAC-HE 64kbps
mfAACEncoder.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);//AAC-HE 64kbps
mfAACEncoder.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);  

MediaCodec _mcAACEncoder = MediaCodec.createEncoderByType("audio/mp4a-latm");
_mcAACEncoder.configure(mfAACEncoder, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
_mcAACEncoder.start();
...
int inputBufferIndex = _mcAACEncoder.dequeueInputBuffer(0);
ByteBuffer bbInputBuffer = _inputBuffersAACEncoder[inputBufferIndex];
bbInputBuffer.clear();
bbInputBuffer.put(byteArrayData);
_mcAACEncoder.queueInputBuffer(
        inputBufferIndex,
        0, 
        byteArrayData.length,
        lPresentationTime,
        0);

输出处理代码:

int outputBufferIndex = _mcAACEncoder.dequeueOutputBuffer(bufferInfo, 0);
ByteBuffer bboutputBuffer = _outputBufferAACEncoder[outputBufferIndex];
logLongD("debug", "Presentation time (micro-s): " + bufferInfo.presentationTimeUs)

请问该现象的可能原因是什么?


可能原因分析
  • 厂商定制的MediaCodec实现缺陷:不同Android厂商对MediaCodec底层实现有定制空间,部分厂商的AAC编码器在处理G.711输入的场景下,时间戳映射逻辑存在bug,导致输出帧的时间戳出现回退。
  • 编码器帧缓存的时间戳映射错误:AAC编码器会缓存若干输入帧做编码优化(比如LC Profile的帧间预测),当缓存帧批量输出时,若内部未按输入帧的时间戳顺序正确赋值,就会出现部分帧时间戳下降的情况。
  • 时间戳的精度或单位问题:需确认输入时间戳lPresentationTime是否严格以微秒为单位(MediaCodec要求的标准单位)。若时间戳计算存在精度丢失,或传递中被意外转换,可能导致编码器处理时出现时间戳异常。
  • 编码器错误恢复机制触发:当编码器遇到输入帧格式异常、内存波动等情况时,可能触发内部错误恢复逻辑,重置时间戳计数,进而导致后续输出帧的时间戳回退。
  • 多线程时序偏差:若输入帧入队和输出帧出队在不同线程执行,线程调度的延迟可能导致日志打印的顺序并非编码器实际输出顺序,看起来像是时间戳下降,实际输出顺序是正确的。

内容的提问来源于stack exchange,提问作者Hong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:55:40