我在Ubuntu上使用LIBAV以WebM格式在服务器上保存用户的视频流(RTP VP8)。 问题是,使用av_write_frame时内存泄漏。内存使用率不断增长(同样 webm文件大小),并且在完成视频录制后永远不会被释放。释放内存(RAM)的唯一方法是在之后从存储(HD)中删除WebM文件。
我有两个问题:
av_write_frame
消耗的内存?我正确地释放了packet.data
。在评论av_write_frame
行时,内存使用率不会增长。关闭文件的正确方法是什么?这就是我正在做的事情(它没有释放内存):
av_write_trailer(fctx);
avcodec_close(vStream->codec);
avio_close(fctx->pb);
avformat_free_context(fctx);
答案 0 :(得分:1)
如果在删除文件时释放内存,则表示您可能正在将数据写入RAM磁盘或作为RAM磁盘符号链接的文件夹。例如,在某些Linux系统中,/ tmp文件夹是RAM上的一个单独分区。
在测量执行时间时,将数据写入RAM可能是一个好主意,因为您可以避免写入磁盘所引入的延迟。请注意它,因为它们是非持久性的。
(本来可以对另一个答案发表评论,但由于声誉不足,我暂不予评论)
答案 1 :(得分:0)
请确保使用最新的ffmpeg和VP8库。 av_write_frame不应该分配任何应该释放的内存。您可以通过编写一个帧然后关闭流来确认,并在Valgrind下运行该程序。 还有很多其他的东西要免费,但是由于你确定注释av_write_frame会阻止泄漏,这不适用于你。
我假设你的代码在某处:
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 :(得分:0)
为了更好的解释,请看一下: https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache/155771#155771