FFmpeg生成缩略图时仅特定视频释放pBuffer触发av_free异常
问题根因
你的代码存在3处逻辑缺陷,刚好触发了该问题视频的特性,导致堆结构损坏,最终出现pBuffer释放异常,和视频文件本身无关:
- 多余调用
av_new_packet:av_packet_alloc仅会初始化AVPacket结构体本身,其内部的数据缓存区由av_read_frame自动分配和管理,你提前调用av_new_packet(packet, width * height)手动分配缓存区,后续av_read_frame会直接覆盖该缓存区指针,不仅造成内存泄漏,若该视频的宽高为异常值(超大/为0),该调用会直接破坏进程堆结构,后续释放pBuffer时就会触发堆异常。 - 未校验
av_image_get_buffer_size返回值:如果视频的宽高参数异常,该函数会返回负数,直接传入av_malloc会被转换为无符号超大值,要么分配无效内存,要么进一步破坏堆结构。 - 关键帧处理完直接break时未执行
av_packet_unref:当前处理的关键帧对应packet未释放引用,虽不是直接触发pBuffer释放失败的原因,但属于常驻内存泄漏。
修复方案
- 删除
av_new_packet(packet, width * height);这一行完全多余的代码。 - 增加
av_image_get_buffer_size返回值校验,只有返回值大于0时才执行后续内存分配和处理逻辑:
numBytes = av_image_get_buffer_size(AV_PIX_FMT_RGB24, width, height, 1); if (numBytes <= 0) { break; } pBuffer = (uint8_t *)av_malloc(numBytes);
- 处理完关键帧break前,先执行
av_packet_unref(packet)释放当前packet的引用。
内容的提问来源于stack exchange,提问作者cool
相关产品推荐
相关产品推荐

