一、 播放视频的程序中涉及内存管理的大概有3部分
1)用av_read_frame从buffer中获取数据
while(bStart)
{
pAvPkt=(AVPacket *)malloc(sizeof(AVPacket));
memset(pAvPkt,0,sizeof(AVPacket));
av_init_packet(pAvPkt);
if(av_read_frame(pFormatContext,pAvPkt)<0)
{
av_free_packet(pAvPkt);
av_free(pAvPkt);
}
//挂载队列
.................
}
2)用avcodec_decode_video2解码数据av_frame_alloc,退出队列,最后播放完av_free_frame
3)av_image_alloc和sws_getContext()初始化数据,然后sws_scale(),最后显示完后sws_freecontext()
二、测试
内存增加怎么解决,就是一部分一部分的屏蔽测试。
测试的顺序是3)、2)、1),
测试3)、2)是一样的,内存在缓慢的增加
测试1)时,也是在缓慢地增加,但是把
pAvPkt=(AVPacket *)malloc(sizeof(AVPacket));
放在while循环外,发现内存不在增加,由此想到应该是哪里没有释放啦
三、解决方案
最后竟然的发现是pAvPacket没有free
在 av_free_packet(pAvPkt); 之后添加
free(pAvPkt);
最终测试10多个小时,没有明显增加,解决
四、后记
在这个问题上耗费了很多时间,不应该这样。吃一暂长一智,一定要注意malloc的话,一定要手动free,不管什么情况