FFmpeg 解码内存泄漏汇总,sws_getContext函数无法释放问题
使用FFmpeg库做的项目,调试项目的时候发现,连续解视频进行播放,会有明显内存增加问题。连续工作10个小时后就会
被linux 内核kill掉。

通过逐步注掉代码和网上查阅资料。最后发现内存泄漏有一些几个地方:
一、av_read_frame的问题
从网上查阅大神们的经验,主要是av_read_frame有内存泄漏风险。
av_read_frame 每次循环后必须执行av_packet_unref(pkt)进行释放。
如循环内退出需要释放,不成立while外也需要释放。
最后需要执行av_packet_free,av_free再进行释放packet的外壳。
while (av_read_frame(pa->fmt_ctx, pkt) >= 0)
{
int64_t dts;
if(pkt->stream_index != pa->videoStream)
{
av_packet_unref(pkt);
continue;
}
av_packet_unref(pkt);
}
av_packet_unref(pkt);
if(pa->packet != NULL)
{
av_packet_unref(pa->packet);
}
av_packet_free(&pa->packet);
av_free(pa->packet);
二、AVFrame* 结构体的释放
AVFrame结构体需要
1、先执行av_frame_unref()释放内部
2、调用av_frame_free(&pa->srcFrame);释放外壳
三、注意释放顺序
内存释放要按顺序进行释放。以防释放掉外壳后,内部就不能进行释放了。
如下面是释放上下文的顺序。
sws_freeContext(pSwsContext);
av_frame_free(&pAVFrame);
avcodec_close(pAVCodecContext);
avformat_close_input(&pAVFormatContext);
四、sws_getContext函数无法释放问题
经过反复查找,发现sws_getContext函数调用后存在内存泄漏问题。非常奇怪的是
程序中已调用了sws_freeContext(pa->sws_ctx)进行释放,内存依然泄漏。
后发现有类型函数 sws_getCachedContext(),替换后发现内存不再泄漏!!!!
sws_getCachedContext
/**
* Check if context can be reused, otherwise reallocate a new one.
*
* If context is NULL, just calls sws_getContext() to get a new
* context. Otherwise, checks if the parameters are the ones already
* saved in context. If that is the case, returns the current
* context. Otherwise, frees context and gets a new context with
* the new parameters.
*
* Be warned that srcFilter and dstFilter are not checked, they
* are assumed to remain the same.
*/
struct SwsContext *sws_getCachedContext(struct SwsContext *context,
int srcW, int srcH, enum AVPixelFormat srcFormat,
int dstW, int dstH, enum AVPixelFormat dstFormat,
int flags, SwsFilter *srcFilter,
SwsFilter *dstFilter, const double *param); /*参数说明*/
int srcW, /* 输入图像的宽度 */
int srcH, /* 输入图像的宽度 */
enum AVPixelFormat srcFormat, /* 输入图像的像素格式 */
int dstW, /* 输出图像的宽度 */
int dstH, /* 输出图像的高度 */
enum AVPixelFormat dstFormat, /* 输出图像的像素格式 */
int flags,/* 选择缩放算法(只有当输入输出图像大小不同时有效),一般选择SWS_FAST_BILINEAR */
SwsFilter *srcFilter, /* 输入图像的滤波器信息, 若不需要传NULL */
SwsFilter *dstFilter, /* 输出图像的滤波器信息, 若不需要传NULL */
const double *param /* 特定缩放算法需要的参数(?),默认为NULL */
参考资料:
https://blog.csdn.net/xiuxiuxiua/article/details/120370302
FFmpeg视频转换sws_getCachedContext|入门笔记 (rumenz.com)
FFmpeg 解码内存泄漏汇总,sws_getContext函数无法释放问题的更多相关文章
- 【视频开发】关于FFMPEG中内存泄漏的问题之av_bitstream_filter_filter
How may I free pkt in an ffmpeg write frame method Rate this: See more: C++ ffmpeg Greetings I' ...
- Android 内存泄漏总结
内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收 ...
- Android 内存泄漏总结(转)
Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却 ...
- Java中关于内存泄漏出现的原因以及如何避免内存泄漏
转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...
- [转载]浅谈C/C++内存泄漏及其检测工具
http://dev.yesky.com/147/2356147_3.shtml 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如Sm ...
- C/C++内存泄漏及检测 转
C/C++内存泄漏及检测 2011-02-20 17:51 by 吴秦, 30189 阅读, 13 评论, 收藏, 编辑 “该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏, ...
- (转)从内存管 理、内存泄漏、内存回收探讨C++内存管理
http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟 ...
- VC使用CRT调试功能来检测内存泄漏
信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话.在 C/C+ ...
- 老李分享:Android性能优化之内存泄漏1
老李分享:Android性能优化之内存泄漏 前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我 ...
随机推荐
- 2022年最新编辑Linux基础知识总结
文章目录 1.Linux的目录结构 2.远程操作Linux和上传文件到Linux 3.文本编辑 4.快捷键 5.登录.注销.关机.重启 6.用户管理 6.1 .新用户注册 6.2.使用新用户登录 6. ...
- C语言------结构体和共用体
仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2 .实训目的及要求 3.源代码及运行截图 4 .小结 1 .实训名称 实训8:结 ...
- Docker在windows系统以及Linux系统的安装
Docker简介和安装 Docker是什么 Docker 是一个应用打包.分发.部署的工具 你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要, 而普通虚拟机则是一个完 ...
- CSP-S游记
第三次考csp-s了,希望这次不要二等 Day ?(初赛) 之前校内模拟赛平均下来都在班级中游,所以不求高分但是觉得过没问题(事实好像确实如此 先开题,选择题很水秒了(devinNB猜到了考Linux ...
- Oracle性能优化之运行参数设置
Oracle参数调整建议值 sessions=2150 processes=2000 open_cursors=5120 db_file_multiblock_read_count=64 log_bu ...
- PLC攻击(一):应用层攻击
转载请注明出处:信安科研人please subscribe my official wechat :信安科研人获取更多安全资讯 参考文献: A Stealth Program Injection ...
- Spring Security(4)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 前面的方法中,除了login()方法能成功,另外两个都失败,并不是因为代码问题,而是Spring Security默认是通过Web页面来实现页面 ...
- Linux面试题2:网络IO模型 & IO多路复用
网络IO 先确定一下范围,我们讨论的都是网络IO,现阶段计算机早已经从CPU密集型转换成网络IO密集型,所以网络io的类型对于服务响应而言更重要. 五种IO模型 依据Unix的IO分类,网络IO分为五 ...
- Lakehouse架构指南
你曾经是否有构建一个开源数据湖来存储数据以进行分析需求? 数据湖包括哪些组件和功能? 不了解 Lakehouse 和 数据仓库 之间的区别? 或者只是想管理数百到数千个文件并拥有更多类似数据库的功能但 ...
- Springboot 整合 SpringCache 使用 Redis 作为缓存
一直以来对缓存都是一知半解,从没有正经的接触并使用一次,今天腾出时间研究一下缓存技术,开发环境为OpenJDK17与SpringBoot2.7.5 SpringCache基础概念 接口介绍 首先看看S ...