FFmpeg中调用av_read_frame函数导致的内存泄漏问题
使用FFmpeg的av_read_frame函数后,每读完一个packet,必须调用av_packet_unref函数进行内存释放,否则会导致内存释泄漏。
在vs(博主所用的ffmpeg版本是3.4.2,vs版本是vs2015)中编译运行如下代码:
#include <stdio.h>
#include <iostream>
#include <windows.h>extern "C" {
#include "libavformat/avformat.h"
}int main()
{const char *path = "video1.mp4"; //需要读取的本地媒体文件相对路径为video1.mp4av_register_all(); //初始化所有组件,只有调用了该函数,才能使用复用器和编解码器。否则,调用函数avformat_open_input会失败,无法获取媒体文件的信息avformat_network_init(); //打开网络流。这里如果只需要读取本地媒体文件,不需要用到网络功能,可以不用加上这一句AVDictionary *opts = NULL;AVFormatContext *ic = NULL;int re = avformat_open_input(&ic, path, NULL, &opts); //媒体打开函数,调用该函数可以获得路径为path的媒体文件的信息,并把这些信息保存到指针ic指向的空间中(调用该函数后会分配一个空间,让指针ic指向该空间)if (re != 0) //如果打开媒体文件失败,打印失败原因{char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf) - 1);printf("open %s failed!:%s", path, buf);}else //打开媒体文件成功{printf("open %s success!\n", path);avformat_find_stream_info(ic, NULL); //调用该函数可以进一步读取一部分视音频数据并且获得一些相关的信息av_dump_format(ic, 0, path, 0); //输出媒体文件的信息到控制台上AVPacket *pkt = av_packet_alloc();while (1){int ret = av_read_frame(ic, pkt);if (ret != 0){printf("\n--------------------------end--------------------------");break;}//av_packet_unref(pkt);Sleep(2); //睡眠2ms,避免程序执行过快影响观察效果。}av_packet_free(&pkt);}if (ic){avformat_close_input(&ic);}getchar();return 0;
}
可以看到上述代码的第38行将av_packet_unref(pkt);这一行注释掉了,所以会导致内存泄漏。运行效果如下图所示。可以在vs2015的诊断工具里面观察到进程运行的过程中(在控制台打印"--------------------------end--------------------------"之前)占用的内存越来越大。在任务管理器中观察到该进程内存占用也是越来大。
我们把上述代码的第38行的av_packet_unref(pkt);加入到代码中,再次编译运行。运行效果如下图所示,可以观察到,进程运行过程中,内存基本上是不变的。
综上所述:使用FFmpeg要注意内存泄漏的问题,av_read_frame中会申请内存,需要在外面进行释放,所以每读完一个packet,需要调用av_packet_unref进行内存释放。 如果不熟悉FFmpeg的函数,可以使用vs诊断工具帮助检测定位其内存泄漏,具体方法可以参考博主的另一篇文章《使用vs诊断工具检测FFmpeg的内存泄漏问题》。
FFmpeg中调用av_read_frame函数导致的内存泄漏问题相关推荐
- Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例源码分析
文章目录 概述 Why 内存泄露 ? 在线程池中使用ThreadLocal导致的内存泄漏 概述 ThreadLocal的基本使用我们就不赘述了,可以参考 每日一博 - ThreadLocal VS I ...
- mmap函数_分析由 mmap 导致的内存泄漏
背景 一个程序链接 TCMalloc ,同时调用 mmap / munmap 管理一部分较大的内存 通过 TCMalloc 的统计信息,判断内存泄漏不是由 new / malloc 等常规接口导致的 ...
- 开机启动加载驱动过程中调用PostMessage函数出错
今天在WINCE5.0+S3C2440系统调试检测出租车是否载客的驱动的时候遇到这样的问题: 发现在开机启动加载驱动过程中调用PostMessage函数时会导致调用的线程崩溃,比如如果下面的线程在创建 ...
- 在构造函数/析构函数中调用virtual函数带来的影响
在构造函数/析构函数中调用virtual函数,那么调用的一定是本类中的virtual函数. 先看一段代码: #include<iostream>class Base { public:Ba ...
- python中调用C++函数
python中调用C++函数 无参调用 单变量传入与返回调用 numpy数组传入与返回调用 c++类调用 用python写不香吗?还这么复杂调用C++? 一. 无参调用 在python中调用无参数和无 ...
- C++核心准则C.82:不要在构造函数或析构函数中调用虚函数
C.82: Don't call virtual functions in constructors and destructors C.82:不要在构造函数或析构函数中调用虚函数 Reason(原因 ...
- Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...
我在硬故障处理程序中有一些程序集.程序集基本上是为了传递当前堆栈指针作为参数(在R0中).它看起来像这样...如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数? __asm(&quo ...
- C++中最好不要在构造函数和析构函数中调用虚函数!!!
1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...
- r语言中调用c 程序,如何在R程序包中调用C函数
程序包名称为pareto.这是.c文件中src目录:如何在R程序包中调用C函数 #include #include #include "Rinternals.h" #include ...
最新文章
- R语言关联规则挖掘数据集预览、分析、筛选:项目数的分布形态(分位数、密度图)、itemFrequency函数统计每一项目在所有事务中出现的次数、最常发生的项目、数据筛选(交易的集合项目大于1)
- [数据结构]数据结构中各种树
- [Spark]PySpark入门学习教程---介绍(1)
- 电商视觉:焦点图的万能构图模板
- matlab求最大公倍数_小学数学最大公因数最小公倍数练习
- 【编辑器】VSCode界面美化,图标与主题插件大全
- python 华氏度转换摄氏度
- Tecplot 10 将输入的多个plt文件做成动画 :
- JZOJ4809挖金矿
- Java注解是怎么成功上位的?
- 基于matlab使用合成雷达和无线通信信号训练的语义分割神经网络执行频谱检测
- kubernetes节点维护命令——cordon, drain, uncordon
- js 通讯录(多音字)
- Ahao网络传媒技术收徒
- 2012-11-1小光棍节【就在今天,我们进行了这学期的第一次考试】下面写下今天的考试心得~!
- js在线写作文本编辑器插件Writty
- ADS129X芯片——模拟功能
- 软件测试简历,别再做无用的简历了
- 张宇基础三十讲(第一轮复习中不会做的题目留存)
- java通讯录备份_基于Java语言的C/S模式通讯录备份和查询软件
热门文章
- Linux查看每个进程的Openfiles数量
- 正版photoshop2022购买体验经历分享
- 计算机监听的端口,侦听计算机的指定端口并分析其数据包,监听,本,解析
- 获取文件的大小(fseek和ftell函数)
- 暑期项目实训7.7 flask+darnn继续修改+内网穿透+DSTP论文阅读
- 英伟达发布ChatGPT专用GPU,性能提升10倍,还推出云服务,普通企业也能训练LLM...
- 『Python学习笔记』Python实现并发编程(补充joblibpymysql)
- 分析mysql股票数据_股票数据分析(一)数据获取
- Python的用途介绍
- java虚拟机的内存管理