Gstreamer:释放RAM,关闭并重新加载rtsp流

问题描述 投票:0回答:1

我正在开发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);

尽管函数末尾每个元素和管道本身的引用计数为零,但内存消耗没有任何变化

c++ memory-management memory-leaks video-streaming gstreamer
1个回答
1
投票

在 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.