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使用了一些内部池或缓存,即使在管道取消引用之后,它也不会释放。有什么建议吗?