Libav - 如何使用 av_write_frame 正确释放内存泄漏

Libav - how to correctly free memory leaking with av_write_frame

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

我有 2 个问题:

  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);

  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]);
    }

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

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

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

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

在测量执行时间时,将数据写入 RAM 可能是个好主意,因为您不会因写入磁盘而引入延迟。请注意它,因为它们是非持久性的。

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