使用h264_cuvid解码时FFmpeg/libav C代码内存泄漏问题咨询
FFmpeg h264_cuvid解码器内存泄漏问题解决方案
问题根因分析
1. 硬解码器缓存未释放
h264_cuvid作为NVIDIA硬件解码器,内部会持有一部分帧缓存用于硬件解码。你当前的解码逻辑仅在读取完文件所有packet后直接退出,没有给解码器发送NULL空包触发解码器释放所有内部持有的缓存资源,这部分会被valgrind统计为未释放内存,是硬件解码器特有的必要操作,软件解码器(如默认h264解码器)通常不需要额外处理也能自动释放。
2. NVIDIA驱动静态资源误报
NVIDIA CUDA驱动会在进程运行时预分配全局静态资源,这部分资源由驱动底层管理,进程退出时系统会自动回收,不属于应用层内存泄漏,valgrind会将其统计为still reachable,属于正常情况,你看到的1923个错误也大多是驱动层的未初始化内存访问告警,不属于业务代码问题。
修复步骤
补充解码器刷缓存逻辑
在主循环读取完所有文件数据后,新增刷解码器缓存的逻辑,主动释放硬解码器内部持有的资源:
// 原主循环结束后、释放frame和packet前添加以下代码 for (unsigned int i = 0; i < input1->container->nb_streams; i++) { if (!input1->codec[i]) continue; int ret = avcodec_send_packet(input1->codec[i], NULL); while (ret >= 0) { ret = avcodec_receive_frame(input1->codec[i], frame); if (ret == AVERROR_EOF || ret < 0) break; av_frame_unref(frame); } }
代码其他优化建议
你当前的decode_frame函数中,成功拿到帧后直接返回,没有自动重置帧的引用计数,建议在主函数每次处理完帧后主动调用av_frame_unref(frame),避免极端场景下的引用计数泄漏。
内容的提问来源于stack exchange,提问作者Guiso
相关产品推荐
相关产品推荐

