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