前言:
最近在进行一个PC对PC端的直播功能的研发,主要需要实现从PC端捕获桌面处理成H264视频流,以及采集PC端的扬声器的声音处理成AAC音频流,通过RTMP推流到服务器端中,然后客户端可以从服务器中拉流并播放视频,最终实现直播的功能。该项目主要运用到FFMPEG实现音视频的编解码和拉流,使用SDL进行对音视频的播放。
在实现该功能的过程中,总共可以分为如下几个核心模块:
1、音频的采集、编码;
2、桌面捕获和图像编码;
3、音视频的同步及推流(核心);
4、音视频的拉流及解码;
5、音视频同步播放(核心);
6、释放资源(避免内存泄漏)要点讲解
7、释放资源(避免内存泄漏)补充
其中音视频编解码是项目的基础,音视频的同步是项目的核心,在后续的文章中将分章节讲述该项目实现的过程。
在本章节中主要是对本人在使用ffmpeg时由于使用堆内存不恰当而造成的内存泄漏的情况以及阐述如何改正的方法:
(2)ffmpeg内存泄漏之---av_copy_packet
1.1功能简单介绍:
如下为该对函数的定义,该对函数主要实现将源AVPacket *src的数据包括缓存值拷贝给目的AVPacket *dst,同时会给dst分配dst->data的堆内存空间,这里需要注意使用完AVPacket *dst后释放以及传入进来的dst不应该提前分配过堆内存。
int av_copy_packet(AVPacket *dst, const AVPacket *src)
{
*dst = *src;
return copy_packet_data(dst, src, 0);
}
2.2程序样例:
如下为使用的范例,仅仅给出如何拷贝以及如何释放:
(1)AVPacket dst_pkt仅仅使用av_init_packet()进行初始化,而未对其分配data的内存;
(2)AVPacket pkt则是由前面一些操作后它的data成员已分配堆内存,其中使用如avcodec_receive_packet(ac, &pkt);等函数则会为pkt分配data的堆内存。
(3)使用av_copy_packet()后则将pkt的数据拷贝给dst_pkt,同时包括为dst_pkt->data分配堆内存来进行拷贝缓存数据,此处需要对其进行使用后释放资源,否则造成内存泄漏。
.....
//此前pkt->data已分配了内存
AVPacket dst_pkt = { 0 };
av_init_packet(&dst_pkt);//仅仅初始化并没有分配data内存
av_copy_packet(&dst_pkt, &pkt);
......
//使用完后释放pkt->data的堆内存
av_packet_unref(&pkt);
av_packet_unref(&dst_pkt);
.......
每写一篇文章都不容易,尊重别人的知识产权才是对自己和技术的尊重。为了避免发生知识产权被侵权的情况,我决定做出以下声明:
1.博客中标注原创的文章,版权归原作者 吴豪乐工作室 所有;
2.未经原作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。