标签:AVPacket packet ffmpeg deque ctx itertmp 内存 av 21
ffmpeg学习日记21-缓存AVPacket数据
avpacket中存储的是压缩过后的数据,数据量并不是很大,在合成视频之前,需要将该部分数据存在内存中,待合成使用。
创建一个存储器
std::list<AVPacket *> deque;
av_read_frame函数读出来avpacket,此处可以将avpacket结构中的数据单独存起来,也可以将整个avpacket结构存储起来,我选择后者的实现方式
while (av_read_frame(&(*ctx->fmt_ctx), &(*ctx->pkt)) >= 0) {
dec_total_frame_while++;
if (ctx->pkt->stream_index == ctx->stream_idx && ctx->codec_ctx->codec->type == AVMEDIA_TYPE_VIDEO) {
AVPacket *zctx = av_packet_alloc();
if (av_packet_ref(zctx, ctx->pkt) < 0) {
LOG_CRIT << "av_packet_ref has err!";
exit(0);
}
deque.push_back(zctx);
...
av_packet_ref函数是将pkt结构复制一份,重点,并且申请了内存
使用之后,需要进行内存释放
std::list<AVPacket *>::iterator itertmp;
for (itertmp = deque.begin(); itertmp != deque.end(); itertmp++) {
av_packet_unref(*itertmp);
av_packet_free(&(*itertmp));
}
deque.clear();
在创建存储器的时候,需要注意,创建方式为
std::list<AVPacket *> deque;
不能是
std::list<AVPacket > deque;
这种方式,在释放内存的时候,申请的内存并没有被释放掉,会造成内存泄露。
参考
标签:AVPacket,packet,ffmpeg,deque,ctx,itertmp,内存,av,21 来源: https://blog.csdn.net/bootleader/article/details/122869101
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。