管道重新启动后,GStreamer内存泄漏

时间:2019-04-26 11:17:31

标签: c++ c video gstreamer gstreamer-1.0

GStreamer版本:1.14.4

我在原始应用中同时播放了几个视频(开始时播放300 MiB,经过几次重启后,使用率增加到1 GiB)。它们应该每N分钟重新启动一次(取消引用整个管道并再次创建)。在第3次或第4次重新启动后,内存消耗增加到6-7 GiB,然后又回落到1 GiB。它发生了几次。因此,这不是典型的内存泄漏,但我不知道为什么它从300 MiB开始,增加到1 GiB,并在6-7和1 GiB之间波动。

因此,我决定创建2个简单的测试。

第一次测试:

我正在测试的内容:简单视频114.8 MiB的长度和持续时间将近5分钟。

问题出在哪里::内存使用量从62.2 MiB开始,在第一次播放后增加到88 MiB。重新加载视频并重新启动管道(未引用并再次创建)后,内存使用率仍为88 MiB,并继续增加到105 MiB,在其余测试时间内保持稳定。

auto app = Gtk::Application::create("org.gtkmm.app");
Gtk::Window w;
gst_init(NULL, NULL);

Glib::signal_timeout().connect_seconds([]()
{
    auto pipeline = gst_parse_launch("playbin uri=file:///path/to/150.mp4", NULL);

    gst_element_set_state (pipeline, GST_STATE_PLAYING);

    auto bus = gst_element_get_bus (pipeline);
    auto msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

    if (msg != NULL)
        gst_message_unref (msg);
    gst_object_unref (bus);
    gst_element_set_state (pipeline, GST_STATE_NULL);
    gst_object_unref (pipeline);

    return true;
}, 5);

return app->run(w);

第二项测试甚至与管道无关,但与我在原始应用中也使用过的GstDiscoverer有关。

我正在测试的内容:简单的GstDiscoverer插件

出了什么问题:在多次发现在其余测试时间内该位置保持稳定之后,内存从19.2 MiB开始并增加到100 MiB;

auto app = Gtk::Application::create("org.gtkmm.app");
Gtk::Window w;
gst_init(NULL, NULL);

Glib::signal_timeout().connect_seconds([](){
    auto discoverer = gst_discoverer_new(5 * GST_SECOND, nullptr);
    auto info = gst_discoverer_discover_uri(discoverer, "file:///path/to/150.mp4", nullptr);
    gst_discoverer_info_unref(info);
    g_object_unref(discoverer);

    return true;
}, 5);

return app->run(w);

结论:这不是真正的内存泄漏,但是我想知道为什么它不断将内存增加到某种“魔力界”。在原始应用中,它甚至更奇怪,因为尽管未引用所有资源,但它在1 GiB和6-7 GiB之间波动。

也许,GStreamer使用了一些内部池或缓存,即使在管道取消引用之后,它也不会释放。有什么建议吗?

0 个答案:

没有答案