【问题标题】:Libav - how to correctly free memory leaking with av_write_frameLibav - 如何使用 av_write_frame 正确释放内存泄漏
【发布时间】:2015-04-27 14:07:15
【问题描述】:

我在 Ubuntu 上使用 LIBAV 以 WebM 格式将用户的视频流 (RTP VP8) 保存在服务器上。 问题是,使用 av_write_frame 时内存泄漏。内存使用量不断增长(webm 文件大小 相等),并且在完成视频录制后永远不会释放。释放内存 (RAM) 的唯一方法是事后从存储 (HD) 中删除 WebM 文件。

我有两个问题:

  1. 是否可以在运行时释放av_write_frame 消耗的内存?我正确地释放了packet.data。注释 av_write_frame 行时,内存使用量没有增加。
  2. 关闭文件的正确方法是什么?这就是我正在做的事情(它不会释放内存):

    av_write_trailer(fctx); avcodec_close(vStream->codec); avio_close(fctx->pb); avformat_free_context(fctx);

【问题讨论】:

  • 你是否在每次写操作后使用 av_free_packet 释放数据包?
  • 是的,我也在释放分配给packet.data 的内存。问题出在av_write_frame 直接或间接,因为我的内存使用量随着 .webm 文件大小线性增长。

标签: memory-leaks ffmpeg libavcodec libav libavformat


【解决方案1】:
  1. 请确保您使用最新的 ffmpeg 和 VP8 库。 av_write_frame 不应分配任何应释放的内存。您可以通过写入一帧然后关闭流,并在 Valgrind 下运行该程序来确认。 还有很多其他的东西可以释放,但是由于您确定注释掉 av_write_frame 会阻止泄漏,因此这不适用于您。

  2. 我假设您的代码中某处有:

    stream = avformat_new_stream( fctx, codecCtx->codec );
    

对吗?然后你还需要释放流:

    for ( unsigned int i = 0; i < fctx->nb_streams; i++ )
    {
        av_freep(&fctx->streams[i]->codec);
        av_freep(&fctx->streams[i]);
    }

【讨论】:

  • 非常感谢。您提到的 2 中的步骤已经在 avformat_free_context(fctx); 中完成,因此它们显然导致了分段错误。我的问题是 WEBM 文件中的数据不知何故粘在了内存上——当我删除 WebM 文件时,内存也被释放了,这对我来说很奇怪。
  • 奇怪。您是在 avformat_free_context(fctx) 之前还是之后这样做的?关于第一个bug,确实听起来很奇怪。
  • 如果你的意思是释放流,它直接在avformat_free_context(fctx); 内部完成。来源(第 2719、2722 行):libav.org/doxygen/release/0.8/libavformat_2utils_8c_source.html
【解决方案2】:

这是 Linux 内核内存管理的东西。因为我是 Linux 新手,所以我不知道。内存没有泄漏,Linux 只是将文件内容缓存到 RAM 中。

为了更好的解释,请看: https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache/155771#155771

【讨论】:

    【解决方案3】:

    如果您在删除文件时内存被释放,这表明您可能正在将数据写入 RAM 磁盘或作为 RAM 磁盘符号链接的文件夹。例如,在某些 Linux 系统中,/tmp 文件夹是 RAM 上的一个单独分区。

    • 您可能想检查重新启动后文件是否仍然存在。如果没有,您可能从未将文件写入磁盘。

    在测量执行时间时,将数据写入 RAM 可能是一个好主意,因为您不会受到写入磁盘带来的延迟的影响。请注意这一点,因为它们是非持久的。

    (本来会对另一个答案发表评论,但由于声誉不足,我还不能发表评论)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多