gpt4 book ai didi

memory-leaks - 读取图像文件时FFmpeg泄漏

转载 作者:行者123 更新时间:2023-12-04 23:15:54 25 4
gpt4 key购买 nike

使用最新版本的 FFmpeg 读取图像文件时我遇到了内存泄漏,我无法追踪。

好像填完AVFrameavcodec_send_packetavcodec_receive_frame ,我调用av_frame_free实际上并没有释放 AVBuffer带有框架的物体。我唯一没有释放的是 AVCodecContext .如果我尝试这样做,我会崩溃。

我已经创建了这个示例程序,它非常简单。这将循环打开、读取然后关闭同一个图像文件。在我的系统上,这会以惊人的速度泄漏内存。

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>

int main(int argc, char **argv) {
av_register_all();

while(1) {
AVFormatContext *fmtCtx = NULL;

if (avformat_open_input(&fmtCtx, "/path/to/test.jpg", NULL, NULL) == 0) {
if (avformat_find_stream_info(fmtCtx, NULL) >= 0) {
for (unsigned int i = 0u; i < fmtCtx -> nb_streams; ++i) {
AVStream *stream = fmtCtx -> streams[i];
AVCodecContext *codecCtx = stream -> codec;
AVCodec *codec = avcodec_find_decoder(codecCtx -> codec_id);

if (avcodec_open2(codecCtx, codec, NULL) == 0) {
AVPacket packet;

if (av_read_frame(fmtCtx, &packet) >= 0) {
if (avcodec_send_packet(codecCtx, &packet) == 0) {
AVFrame *frame = av_frame_alloc();

avcodec_receive_frame(codecCtx, frame);
av_frame_free(&frame);
}
}

av_packet_unref(&packet);
}
}
}

avformat_close_input(&fmtCtx);
}
}

return 0;
}

最佳答案

解决方案是创建 AVCodecContext 的副本打开文件时自动创建并在 avcodec_open2 中使用此副本.这允许使用 avcodec_free_context 删除此副本.

使用最新版本的 FFmpeg , avcodec_copy_context已弃用并替换为 AVCodecParameters .在问题的示例程序中使用以下代码片段可以堵住泄漏:

AVCodecParameters *param = avcodec_parameters_alloc();
AVCodecContext *codecCtx = avcodec_alloc_context3(NULL);
AVCodec *codec = avcodec_find_decoder(stream -> codec -> codec_id);

avcodec_parameters_from_context(param, stream -> codec);
avcodec_parameters_to_context(codecCtx, param);
avcodec_parameters_free(&param);
[...]
avcodec_free_context(&codecCtx);

关于memory-leaks - 读取图像文件时FFmpeg泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com