-1

我正在尝试在 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 视频播放器正确初始化?

4

1 回答 1

0

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

于 2019-08-11T09:56:38.927 回答