c++ - 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
解决方案
推荐阅读
- r - 用 R 预测一个简单的序列,支持向量机
- ruby-on-rails - 我可以在没有 activerecord 的情况下使用 hyperstack 吗?
- java - 如何比较两个有序列表
- postgresql - 全文搜索完全匹配
- python - Django 认证用户以匿名用户身份登录
- r - 使用 with() 和输出 df 的命令是否有提示/技巧
- sql - ORA-12704: case 语句中的字符集不匹配
- django - 为什么我的 django 翻译不起作用?
- tensorflow - 如何在 GPU 上定义具有多种返回类型的 tf.map_fn?
- android - ListView.builder 不在列中工作