You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 05:09:53