当尝试在循环队列中依次渲染一个视频时,由于某种原因,我遇到了严重的内存泄漏。
制作简单的重复视频轮播 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;
}
我修改了功能开关视频(..),以便以另一种方式将视频加载到播放器中。这似乎有效。 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;
}
尝试愉快。