我正在开发36-64流的视频墙,我遇到了重新启动流时增加内存的问题 我有一个例子来说明我的问题。 示例:https://github.com/Deymoss/Rtsp-player
当我启动应用程序时,会创建一个管道,因此,应用程序最初占用 54MB 的 RAM,当我启动流时,体积增加到 ~ 110 MB,当我关闭流时,内存不会释放,当我再次运行相同的流时,RAM 量增加到 120 MB,依此类推,文件描述符也是如此(我怀疑 BUS 创建了它们)
关闭时如何正确清除内存和有关流的所有信息?
目前我将管道设置为 NULL 并且不进行取消引用,但如果我取消注释这些行:
gst_bus_set_sync_handler(m_videoPipe->bus, nullptr, nullptr, nullptr);
gst_object_unref(m_videoPipe->pipeline);
gst_object_unref(m_videoPipe->bus);
尽管函数末尾每个元素和管道本身的引用计数为零,但内存消耗没有任何变化
在 componentComplete 内部通过引用获取 glsink 元素。虽然后来链接被去掉了,但是这样会不会造成内存泄漏呢?
在关闭函数中,尝试删除所有元素的链接,而不仅仅是管道和总线的链接。
void VideoItem::close() {
gst_element_set_state(m_videoPipe->pipeline, GST_STATE_NULL);
GstState state;
GstStateChangeReturn ret = gst_element_get_state(m_videoPipe->pipeline, &state, nullptr, GST_CLOCK_TIME_NONE);
if (ret == GST_STATE_CHANGE_FAILURE) {
}
gst_object_unref(m_videoPipe->src);
gst_object_unref(m_videoPipe->videoDecode);
gst_object_unref(m_videoPipe->flip);
gst_object_unref(m_videoPipe->videoSink);
gst_object_unref(m_videoPipe->pipeline);
gst_object_unref(m_videoPipe->bus);
m_videoPipe.reset();
}
在messageHandler中实现清理
GstBusSyncReply messageHandler(GstBus * /*bus*/, GstMessage *msg, gpointer videoItem) {
switch (GST_MESSAGE_TYPE(msg)) {
case GST_MESSAGE_EOS:
case GST_MESSAGE_ERROR: {
// Initiate cleanup process for the VideoItem instance
VideoItem *priv = static_cast<VideoItem *>(videoItem);
priv->close();
break;
}
}
return GST_BUS_PASS;
}