【问题标题】:GTKmm Opengl context not initializedGTKmm Opengl 上下文未初始化
【发布时间】:2019-08-11 17:56:38
【问题描述】:

我正在尝试在 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 创建渲染上下文时出现问题。我在该行收到以下错误:

[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 视频播放器正确初始化?

【问题讨论】:

    标签: c++ opengl gtkmm mpv


    【解决方案1】:

    正如错误提示的那样,问题在于没有 OpenGL 上下文。 GLArea 不会立即创建,当创建 OpenGL 视图时,GLArea 上有一个事件signal_realize。我必须听那个事件,并在设置GLArea.make_current() 后在那里初始化 mpv 变量,以将 GLArea 的上下文设置为我们想要连接到 mpv 的上下文

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多