GStreamer状态切换时出现内存泄漏问题求助
GStreamer状态切换引发内存占用持续上升问题及解决方法
我一直在编写一个基于GStreamer的摄像头程序,流程是先初始化pipeline,再根据用户输入在PLAYING和PAUSED状态间切换。运行一段时间后发现程序内存占用缓慢上升,我用一个极简示例复现了该问题:
#include <gst/gst.h> #include <stdio.h> #include <unistd.h> #include <string> #include <iostream> int main(int argc, char* argv[]) { gst_init(&argc, &argv); GError* err = NULL; std::string pipeline_str = "fakesrc ! fakesink sync = false "; GstElement* pipeline = gst_parse_launch(pipeline_str.c_str(), &err); gst_element_set_state(pipeline, GST_STATE_READY); gst_element_get_state(pipeline, NULL, NULL, 4000000000ll); for (;;) { gst_element_set_state(pipeline, GST_STATE_PAUSED); GstStateChangeReturn result = gst_element_get_state(pipeline, NULL, NULL, 4000000000ll); if (result != GST_STATE_CHANGE_SUCCESS){ std::cout << "error" << std::endl; break; } usleep(100); gst_element_set_state(pipeline, GST_STATE_PLAYING); result = gst_element_get_state(pipeline, NULL, NULL, 4000000000ll); if (result != GST_STATE_CHANGE_SUCCESS){ std::cout << "error" << std::endl; break; } usleep(100); } gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return 0; }
用htop观察该示例程序,可见内存占用增长很快,推测问题出在状态切换环节,请问有没有人遇到过类似问题?
更新
已采纳的解决方案有效,后续发现问题根源在于未清空总线。通过GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));获取总线,并在每次循环中执行gst_bus_set_flushing(bus, TRUE);刷新总线后,内存占用不再上升。
内容的提问来源于stack exchange,提问作者Rasmus
相关产品推荐
相关产品推荐

