Ubuntu Wayland + NVIDIA 下修复腾讯会议视频与屏幕共享黑屏问题
问题背景
我的环境是 Ubuntu 26.04 GNOME Wayland、NVIDIA 4060 GPU(580 Open 驱动)和腾讯会议 Linux 版 3.26.10.401。使用腾讯会议时发现共享屏幕和视频都是黑屏,之前在 Xorg 环境下使用一切正常。
由于 Ubuntu 26.04 默认只有 Wayland 会话选项,且不想两个会话来回切换使用,因此尝试从腾讯会议启动日志和启动脚本入手分析。
排查过程
腾讯会议的 xcast 日志位于:
~/.local/share/wemeetapp/Saas/Logs/xcast_*.log
实际日志显示,发起屏幕共享时 Portal 链路已经成功,后续还有持续的视频编码和发送统计。这证明 GNOME Portal、PipeWire、屏幕授权、捕获和编码发送并没有坏。
ext_portal entry updated 1
"width":1920,"height":1080,"fps":15
screen_capture_worker.start
真正异常的是本地视频渲染,同一次会议中该错误可以重复上百次。视频帧已经到达,但腾讯会议使用 NVIDIAEGL 为某些 XWayland 视频窗口创建 EGLSurface 失败,于是自己的视频、参会者视频和收到的屏幕共享都显示不出来。
eglCreateWindowSurface returned EGL_NO_SURFACE error:3005
因此说明NVIDIA EGL/GLX 与腾讯会议 XWayland 视频窗口的组合不兼容,尝试在腾讯会议中让 GLVND 选择 Mesa 的 EGL/GLX 实现。
经过逐项验证,两个变量各自解决不同的现象:
export __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
export __GLX_VENDOR_LIBRARY_NAME=mesa
__EGL_VENDOR_LIBRARY_FILENAMES=...50_mesa.json解决腾讯会议的视频显示问题;__GLX_VENDOR_LIBRARY_NAME=mesa解决屏幕共享显示问题;
解决方案
腾讯会议的启动脚本 /opt/wemeet/wemeetapp.sh 包含以下逻辑:
if [ "$XDG_SESSION_TYPE" = "wayland" ];then
if [ -f "/opt/x11-wayland/x11-ext.sh" ];then
source /opt/x11-wayland/x11-ext.sh
else
export QT_QPA_PLATFORM=xcb
export XDG_SESSION_TYPE=x11
unset WAYLAND_DISPLAY
export WEMEET_XWAYLAND=1
fi
fi
为了让改动尽可能小,选择实现/opt/x11-wayland/x11-ext.sh,利用官方机制加载兼容环境,内容如下:
#!/usr/bin/env bash
# 腾讯会议 3.26.10.401 的 /opt/wemeet/wemeetapp.sh 在 Wayland 会话中会优先 source /opt/x11-wayland/x11-ext.sh。使用 source 而不是启动子进程非常重要:本文件导出的变量会直接进入腾讯会议主进程及其 QtWebEngine 子进程。
# 这里是兼容 else 分支
export QT_QPA_PLATFORM=xcb
export XDG_SESSION_TYPE=x11
unset WAYLAND_DISPLAY
export WEMEET_XWAYLAND=1
# 需要确保该文件存在
readonly WEMEET_MESA_EGL_VENDOR=/usr/share/glvnd/egl_vendor.d/50_mesa.json
if [[ -r "$WEMEET_MESA_EGL_VENDOR" ]]; then
export __EGL_VENDOR_LIBRARY_FILENAMES="$WEMEET_MESA_EGL_VENDOR"
fi
export __GLX_VENDOR_LIBRARY_NAME=mesa
# Mesa EGL/GLX 能正常工作时保留其自动选择能力,可能比强制 llvmpipe 软件渲染有更低的 CPU 占用。
unset LIBGL_ALWAYS_SOFTWARE
可能需要修改x11-ext.sh权限(0644),然后重新启动腾讯会议即可

浙公网安备 33010602011771号