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

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释放失败的原因,但属于常驻内存泄漏。

修复方案

  1. 删除av_new_packet(packet, width * height);这一行完全多余的代码。
  2. 增加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);
  1. 处理完关键帧break前,先执行av_packet_unref(packet)释放当前packet的引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:36:03