编码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
相关产品推荐
相关产品推荐

