Android MediaCodec AVC/H264编码器输出缓冲区始终为1MB问题排查
问题原因及解决方法
你遇到的bufsize始终为1MB的问题,核心原因是**AMediaCodec_getOutputBuffer返回的bufsize是编码器预分配的输出缓冲区总容量,而非当前编码帧的实际数据长度**。
具体解释:
- QCOM的
OMX.qcom.video.encoder.avc硬件编码器会预先分配固定大小的输出缓冲区(通常为1MB),这个容量是为了容纳编码过程中可能产生的最大帧数据(比如体积较大的I帧),和你设置的比特率、帧率参数无关,所以修改这些参数不会改变缓冲区的总容量。 - 真正的编码后有效数据长度,需要从
AMediaCodec_dequeueOutputBuffer返回的AMediaCodecBufferInfo结构体中的size字段获取,而不是AMediaCodec_getOutputBuffer输出的bufsize。
正确的处理代码示例:
AMediaCodecBufferInfo info; // 出队输出缓冲区时获取BufferInfo ssize_t status = AMediaCodec_dequeueOutputBuffer(avc_encoder_, &info, 10000); if (status >= 0) { // 获取缓冲区指针,这里可以传入NULL,因为实际长度由info.size决定 uint8_t* buf = AMediaCodec_getOutputBuffer(avc_encoder_, status, NULL); if (info.size > 0) { // 仅处理buf中前info.size字节的有效数据 // 例如写入文件、发送网络等操作 } // 释放缓冲区 AMediaCodec_releaseOutputBuffer(avc_encoder_, status, false); }
注意事项:
- 当
info.size为0时,通常表示编码器输出的是配置信息(比如SPS/PPS),这部分数据也需要妥善处理,否则后续解码会失败。 - 不要直接使用
bufsize作为有效数据长度,否则会包含大量缓冲区末尾的无效填充数据,导致输出文件体积异常或解码错误。
内容的提问来源于stack exchange,提问作者Sumanth Murali
相关产品推荐
相关产品推荐

