[英]GTKmm Opengl context not initialized
我正在嘗試在 GTKmm 中創建一個視頻播放器,為此我使用mpv 。 文檔說,我可以使用 OpenGL 視圖嵌入視頻播放器。 但是,我在 GTKmm 應用程序中實現播放器時遇到了困難。
我有一個 GLWindow,它包含一個 GLArea,它應該包含視頻播放器。 問題是,當我嘗試初始化 mpv 渲染上下文時,出現錯誤,告訴我 OpenGL 未初始化。
以下是我的主窗口的構造函數:
GLWindow::GLWindow(): GLArea_{}
{
set_title("GL Area");
set_default_size(400, 600);
setlocale(LC_NUMERIC, "C");
VBox_.property_margin() = 12;
VBox_.set_spacing(6);
add(VBox_);
GLArea_.set_hexpand(true);
GLArea_.set_vexpand(true);
GLArea_.set_auto_render(true);
GLArea_.set_required_version(4, 0);
VBox_.add(GLArea_);
mpv = mpv_create();
if (!mpv)
throw std::runtime_error("Unable to create mpv context");
mpv_set_option_string(mpv, "terminal", "yes");
mpv_set_option_string(mpv, "msg-level", "all=v");
if (mpv_initialize(mpv) < 0)
throw std::runtime_error("could not initialize mpv context");
mpv_render_param params[] = {
{MPV_RENDER_PARAM_API_TYPE, const_cast<char*>(MPV_RENDER_API_TYPE_OPENGL)},
{MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, static_cast<void*>(new (mpv_opengl_init_params){
.get_proc_address = get_proc_address,
})},
{MPV_RENDER_PARAM_INVALID}
};
if (mpv_render_context_create(&mpv_gl, mpv, params) < 0)
throw std::runtime_error("Failed to create render context");
mpv_render_context_set_update_callback(mpv_gl, GLWindow::onUpdate, this);
}
據我所知,這應該只是初始化視頻播放器視圖,但是當我嘗試使用mpv_render_context_create
創建渲染上下文時mpv_render_context_create
。 我在該行收到以下錯誤:
[libmpv_render] glGetString(GL_VERSION) 返回 NULL。
[libmpv_render] OpenGL 未初始化。
然后應用程序以SIGSEGV
信號終止。
問題可能來自我的get_proc_address
函數,目前我只為 linux 實現了它,它看起來像下面這樣:
static void *get_proc_address(void *ctx, const char *name) {
return (void *)glXGetProcAddress(reinterpret_cast<const GLubyte *>(name));
}
老實說,我對為什么沒有創建 OpenGL 上下文感到不知所措。 我該如何調整我的 GTKmm 應用程序以允許 mpv 視頻播放器正確初始化?
正如錯誤所暗示的那樣,問題在於沒有 OpenGL 上下文。 GLArea 不是立即創建的,當創建 OpenGL 視圖時,GLArea 上有一個事件signal_realize
。 我不得不聽那個事件,並在設置GLArea.make_current()
之后在那里初始化 mpv 變量,將 GLArea 的上下文設置為我們想要連接到 mpv 的上下文
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.