我正在尝试使用Pinvoke从GStreamer库导入的函数在C#中创建一个视频播放器。它到目前为止看起来不错,但如果我添加gmaincontext
我的C#应用程序冻结,我就无法点击任何按钮或移动我的窗口。
我认为问题可能涉及GstElement *pipeline;
void seek_to_pos(double position) {
gint64 len;
gst_element_query_duration(pipeline, GST_FORMAT_TIME, &len);
gst_element_seek_simple(pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, len*position);
}
void play_file(char* path_to_file, void* hwnd_ptr_of_window){
gst_init(NULL, NULL);
HWND hwnd = (HWND)hwnd_ptr_of_window;
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
pipeline = gst_element_factory_make("playbin", "player");
g_object_set (G_OBJECT (pipeline), "uri", path_to_file, NULL);
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(pipeline), (guintptr)hwnd);
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);//problem
}
,但我并不确切地知道问题是什么或如何解决问题。
这是我库中的C ++代码:
g_main_loop_run(loop);
没有GMainLoop
字符串,一切正常,但我当然需要它来做其他事情。
另外,我已经知道我需要在a中运行{{1}} 不同的线程,不阻止我的C#应用程序的事件循环,但我不知道我该怎么做。
所以我需要一个代码示例或链接来描述我如何正确地做到这一点。谢谢!