其他分享
首页 > 其他分享> > ffmpeg学习日记21-缓存AVPacket数据

ffmpeg学习日记21-缓存AVPacket数据

作者:互联网

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