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

时间:2015-02-25 14:21:52

标签: memory-leaks ffmpeg libavcodec libav libavformat

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

  2. 我假设你的代码在某处:

    stream = avformat_new_stream( fctx, codecCtx->codec );
    
  3. 正确?然后你还需要释放流:

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

答案 2 :(得分:0)

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

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