首页 > 解决方案 > gstreamer 管道设置为 GST_STATE_NULL 后未释放内存

问题描述

我的应用程序需要多次重新启动 gstreamer 管道。但是在将管道设置为 GST_STATE_NULL 并在管道上调用 unref 后,内存似乎没有被释放。每次重启后,与进程关联的内存不断增加。

我能够仅使用 videotestsrc-fakesink 元素重现该问题,如下所示:

//g++ -Wall testpage_Simple.cpp -o testpage_Simple $(pkg-config --cflags --libs gstreamer-1.0)

#include <gst/gst.h> 
GstElement *pipeline;
GstElement *src;
GstElement *sink;
void clearPipeline () {
    // g_print ("clearPipeline    ");
    gst_element_set_state (pipeline, GST_STATE_NULL); 
    gst_object_unref (pipeline); 
}
void createPipeline () {
    pipeline = gst_pipeline_new ("pipelinePlay");
    src = gst_element_factory_make ("videotestsrc", "source");
    sink = gst_element_factory_make ("fakesink", "sink");

    gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);

    if (gst_element_link (src, sink)!= TRUE) {
        g_printerr ("src, sink could not be linked.\n");
    }
    gst_element_set_state (pipeline, GST_STATE_PLAYING);
}

gint main (gint argc, gchar * argv[]) 
{ 
    gst_init (NULL, NULL);
    system("gst-launch-1.0 --gst-version");
    g_print ("Start Test - ");
 //   for (int i=1; i<=10; i++) {
        system ("top -b -n 1 | grep testpage | awk '{print $6}'");
        createPipeline();
        clearPipeline(); 
 //   }
    g_print ("End of test !! ");
    system ("top -b -n 1 | grep testpage | awk '{print $6}'");
    gst_deinit();
    return 0; 
}

Ubuntu 19.04 上的示例输出(仅显示此过程的顶部命令中的 RES 列值):
GStreamer 核心库版本 1.16.1
开始测试 - 7140
测试结束!8504

我们在 Ubuntu 18.04 和 gstreamer 1.12.4 上也观察到了类似的内存趋势。

这是预期的行为还是我在清理管道时遗漏了什么?

我检查了以下链接。似乎是类似的问题,但是这个问题是
管道重启后GStreamer内存泄漏的未回答

我尝试了以下链接中的磁盘缓存建议,但遇到了类似的问题。但这也无济于事。
http://gstreamer-devel.966125.n4.nabble.com/Properly-freeing-resources-td4658631.html

标签: c++cvideogstreamergstreamer-1.0

解决方案


推荐阅读