【问题标题】:Cleaning AVFrame properly正确清洁 AVFrame
【发布时间】:2020-06-07 03:32:59
【问题描述】:

我正在使用 av_frame_alloc() 函数创建 AVFrame 对象并使用内部调用 av_frame_unref() 的 av_frame_free(&frame) 清除它,但它没有正确清理内存。我的应用的堆大小在运行时呈指数增长。

不工作:

AVFrame* frame = av_frame_alloc();
av_frame_free(&frame);

工作:

AVFrame* frame = av_frame_alloc();
av_free(frame->data[0]);

据我所知,av_frame_free() 调用 av_freep() 调用 av_free() 来释放动态内存。内存被清理,如果我直接使用 av_free(frame->data[0]) 而不是 av_frame_free(&frame)

【问题讨论】:

  • 也许框架在某处被引用计数,因为我看不到代码,只能猜测。试试av_frame_unref(frame) 然后av_frame_free(&frame)
  • av_frame_free() 内部调用 av_frame_unref(),如果它被引用。请找到源代码供您参考 [github.com/pockethook/player/blob/master/player.cpp#L104]
  • 事情搞砸了,我不知道罪魁祸首是下一行的av_frame_copy_props还是你的format_converter_。您最好切换到纯 C 并逐步检查(手动释放)。然后切换回智能指针 (C++)。
  • @thekamilz 谢谢。我会尽快检查并更新问题原因。
  • @thekamilz 它正在使用 av_image_alloc() 将一帧复制到另一帧。根据这个 [ffmpeg.org/doxygen/2.0/… 文档,分配的图像缓冲区应该由 av_freep(&frame->data[0]) 而不是 av_frame_free(&frame) 释放。我以为 av_frame_free() 内部调用了 av_freep(&frame->data[0])。

标签: ffmpeg libav


【解决方案1】:

我使用带有 H.264 的 libav 开发了一个关于视频屏幕共享应用程序的个人项目,以进行 60 FPS 视频编码。

为了解决内存泄漏问题,我使用av_frame_alloc 分配frame,使用av_frame_make_writable 使其在每个周期都可写,并使用av_freeav_freep 释放它们的内存。

所以,使用以下之一:

av_free(frame);
av_freep(frame);

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多