有什么方法可以在GTK4中顺序渲染视频小部件而不导致内存泄漏?

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

当尝试在循环队列中依次渲染一个视频时,由于某种原因,我遇到了严重的内存泄漏。

制作简单的重复视频轮播 GUI 而不会导致任何内存泄漏的最佳方法是什么?删除引用似乎也没有多大作用,我只是希望它不是由 Gstreamer 本身引起的。

当我想从主窗口删除小部件时尝试了 g_object_unref ,但没有成功。记忆不断累积。

编辑:这是一个非常小的程序来演示该问题。这每 5 秒在两个视频文件之间切换,但仍然不知何故耗尽了我所有的可用内存。

static gboolean switch_video(gpointer user_data)
{
    static bool toggle = false;
    GtkVideo *video = GTK_VIDEO(user_data);

    std::string path = toggle ? "files/video1.mp4" : "files/video2.mp4";
    GtkMediaStream *new_media_file = gtk_media_file_new_for_filename(path.c_str());

    gtk_video_set_media_stream(video, GTK_MEDIA_STREAM(new_media_file));
    gtk_media_stream_play(new_media_file);
    g_object_unref(new_media_file);

    toggle = !toggle;
    return TRUE;
}

static void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *window = gtk_application_window_new(app);

    gtk_window_set_title(GTK_WINDOW(window), "GTK4 Video Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);

    GtkWidget *video = gtk_video_new();
    gtk_window_set_child(GTK_WINDOW(window), video);
    gtk_widget_show(window);

    g_timeout_add_seconds(5, switch_video, video);
}

int main(int argc, char *argv[])
{
    GtkApplication *app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);

    return status;
}
memory video widget gstreamer gtk4
1个回答
0
投票

我修改了功能开关视频(..),以便以另一种方式将视频加载到播放器中。这似乎有效。 switch-logig 当然可以变得更加有效,但原理应该已经很清楚了。

static gboolean switch_video(gpointer user_data)
{
    GtkVideo *video = GTK_VIDEO(user_data);
    
   static const char *utf8Filename;

   if (gtk_video_get_file(video) == NULL)
   { 
        utf8Filename = "files/video1.mp4";
   }
   else if (g_strcmp0(utf8Filename, "files/video1.mp4") == 0 )
   {
    utf8Filename ="files/video2.mp4";
   }
   else
   {
    utf8Filename ="files/video1.mp4";
   }

   gchar *glibEncodedFilename = g_filename_from_utf8(utf8Filename, -1, NULL,NULL,NULL);
   // Load a video file
   gtk_video_set_file(GTK_VIDEO(video), g_file_new_for_path(glibEncodedFilename));
   // start the video if visible
   gtk_video_set_autoplay(GTK_VIDEO(video),TRUE);

    return TRUE;
}

尝试愉快。

© www.soinside.com 2019 - 2024. All rights reserved.