C++ FFMPEG c++;读取数据包时出现内存泄漏问题

C++ FFMPEG c++;读取数据包时出现内存泄漏问题,c++,ffmpeg,memory-leaks,libav,C++,Ffmpeg,Memory Leaks,Libav,我已经编写了一个程序来读取视频文件中的帧。除了下面描述的问题外,一切都很完美。 读取帧后,当我调用avcode_send_packet函数时,它会泄漏内存。 在阅读下一帧之前,我使用了av_packet_unref。但内存泄漏仍然没有得到解决。 我正在WIndows 10上使用最新的FFMPEG 4.3版本 此外,av_frame_unref不会修复内存泄漏。我认为数据包中的数据缓冲区并没有得到释放,我觉得这与FFMPEG版本问题有关,因为我看到了互联网上其他程序员所做的类似编码 有人知道如何修

我已经编写了一个程序来读取视频文件中的帧。除了下面描述的问题外,一切都很完美。 读取帧后,当我调用avcode_send_packet函数时,它会泄漏内存。 在阅读下一帧之前,我使用了av_packet_unref。但内存泄漏仍然没有得到解决。 我正在WIndows 10上使用最新的FFMPEG 4.3版本

此外,av_frame_unref不会修复内存泄漏。我认为数据包中的数据缓冲区并没有得到释放,我觉得这与FFMPEG版本问题有关,因为我看到了互联网上其他程序员所做的类似编码

有人知道如何修复这个内存泄漏吗

-----------------代码如下----------------------- ... 这里是与设置avformatcontext和AVCodeContext相关的代码

while(1)
    {
        if (av_read_frame(pFormatCtx, packet) >= 0)
        {
            if (packet->stream_index == videoindex)
            {

                ret = avcodec_send_packet(pCodecCtx, packet);//on executing this line, memory shoots up in MBs , everytime.
                if (ret < 0)
                {
                    av_packet_unref(packet);
                    fprintf(stderr,"Failed to Decode packet. \n:%s", av_err2str(ret));
                    return -1;
                }

                ret = avcodec_receive_frame(pCodecCtx, pAvFrame);
                if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
                {
                    av_packet_unref(packet);
                    continue;
                }
                if (ret < 0)
                {
                    av_packet_unref(packet);
                    printf("Failed to Decode packet. \n");
                    return -1;
                }
                av_packet_unref(packet);

                
                {
                    //.. do something with the frame.
                }
                av_frame_unref(pAvFrame);

            }
            
            av_packet_unref(packet);
        }
}
while(1)
{
如果(av_读取_帧(pFormatCtx,数据包)>=0)
{
如果(数据包->流_索引==视频索引)
{
ret=avcodec\u send\u packet(pCodecCtx,packet);//在执行这一行时,每次内存都以MB的速度增长。
如果(ret<0)
{
av_数据包_unref(数据包);
fprintf(stderr,“未能解码数据包。\n:%s”,av_err2str(ret));
返回-1;
}
ret=avcodec_接收_帧(pCodecCtx,pAvFrame);
如果(ret==AVERROR(EAGAIN)| | ret==AVERROR_EOF)
{
av_数据包_unref(数据包);
继续;
}
如果(ret<0)
{
av_数据包_unref(数据包);
printf(“解码数据包失败。\n”);
返回-1;
}
av_数据包_unref(数据包);
{
//用这个框架做点什么。
}
av_帧_unref(pAvFrame);
}
av_数据包_unref(数据包);
}
}

需要调试详细信息:应更新问题,以包括所需的行为、特定的问题或错误,以及重现问题所需的最短代码。@santosh无法在既没有4.3也没有4.3.1的Linux上重现此问题。你能试着制作一个最小的程序来重现这个问题吗?是的,昨天,我对我的do something部分代码进行了注释,我深入观察到,每帧内存增加4-8 mbs,但在最初的帧中发生了这种情况,后来内存稳定在50MB左右。此外,我在dosomething部分中发现了一些问题,在该部分中,我将帧转换为cv::mat并将其存储以供处理。我必须在处理后发布。这是我发现的主要原因,我将使用mat.data.release函数在适当的位置修复它。谢谢