Ubuntu 设置腾讯会议屏幕共享
问题描述
在 Ubuntu 系统上启动腾讯会议(wemeet),点击"共享桌面"时出现如下提示:
使用系统桌面进行共享失败,请按下列方式设置后进行屏幕共享:
安装最新版本的系统组件"xdg-desktop-portal"
或切换系统显示协议至 X11
即使已经安装了 xdg-desktop-portal 及其各种后端(gtk、gnome、xapp、wlr),屏幕共享仍然失败。本文记录完整的排查过程和最终的正确配置方法。
适用范围
- 操作系统:Ubuntu 24.04 / 22.04 及衍生发行版
- 桌面环境:XFCE / GNOME / KDE 等(本质上是 X11 会话被误标记为 Wayland 的情况)
- 腾讯会议版本:3.26.x 系列(以 wemeet_3.26.10.401_amd64.deb 为例)
根因分析
第一步:确认实际显示协议
首先确认系统到底运行在 X11 还是 Wayland 下:
# 检查关键环境变量
echo "XDG_SESSION_TYPE=$XDG_SESSION_TYPE"
echo "WAYLAND_DISPLAY=$WAYLAND_DISPLAY"
echo "DISPLAY=$DISPLAY"
# 检查 Xorg 进程是否在运行
ps aux | grep Xorg | grep -v grep
# 检查 Wayland compositor 进程
ps aux | grep -E "gnome-shell|kwin|sway|weston|mutter" | grep -v grep
在我的环境中,结果显示:
XDG_SESSION_TYPE=wayland(GDM 标记为 Wayland)WAYLAND_DISPLAY为空Xorg进程正在运行(PID 9088,由 GDM 启动)xfwm4(XFCE 窗口管理器)在:0.0上运行- 没有任何 Wayland compositor 进程
$XDG_SESSION_TYPE 标记为 wayland。Xorg 在运行,XFCE 的 X11 窗口管理器 xfwm4 也在运行,不存在 Wayland compositor。
第二步:定位问题触发点
查看腾讯会议的启动脚本 /opt/wemeet/wemeetapp.sh,第 31-40 行是关键:
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 # 强制 Qt 走 X11
export XDG_SESSION_TYPE=x11
unset WAYLAND_DISPLAY
export WEMEET_XWAYLAND=1 # ← 问题根源!
fi
fi
由于 $XDG_SESSION_TYPE=wayland,脚本进入 Wayland 兼容分支。因为 /opt/x11-wayland/x11-ext.sh 不存在,走了 else 分支,设置了 WEMEET_XWAYLAND=1。
第三步:理解 WEMEET_XWAYLAND 的作用
WEMEET_XWAYLAND=1 告诉腾讯会议:"你正运行在 XWayland 环境下"。在这种情况下:
- 腾讯会议认为自己在 Wayland 会话中,X11 的
XShmGetImage截图无法获取真实的屏幕内容(在真正的 Wayland+XWayland 组合下确实如此) - 因此它会尝试走 xdg-desktop-portal ScreenCast 接口来获取屏幕画面
- 但是,当前系统的 ScreenCast portal 后端不可用:
xdg-desktop-portal-gtk:不提供 ScreenCast 接口xdg-desktop-portal-gnome:提供 ScreenCast,但被UseIn=gnome限制,且依赖 Mutter(GNOME 合成器)xdg-desktop-portal-wlr:需要WAYLAND_DISPLAY环境变量,并限定 wlroots 系桌面
- 所有 ScreenCast 后端都不匹配 → 屏幕共享失败
WEMEET_XWAYLAND=1 让腾讯会议误以为需要 portal 方式的屏幕捕获,而 portal 后端在当前桌面环境下不可用。
第四步:为什么不直接改 XDG_SESSION_TYPE?
直接修改 $XDG_SESSION_TYPE 为 x11(比如在 ~/.profile 中添加 export XDG_SESSION_TYPE=x11)可以让腾讯会议跳过 Wayland 分支,但这会影响所有读取该变量的应用,可能造成其他软件行为异常。
更好的做法是:利用腾讯会议启动脚本已有的优先级机制——当 /opt/x11-wayland/x11-ext.sh 存在时,脚本会加载它而跳过 else 分支(不设置 WEMEET_XWAYLAND=1)。
正确的配置方法
步骤 1:创建 x11-ext.sh 配置文件
以 root 权限创建目录和文件:
sudo mkdir -p /opt/x11-wayland
sudo tee /opt/x11-wayland/x11-ext.sh << 'EOF'
#!/bin/bash
# 系统实际运行在 X11 上,不需要 XWayland 兼容模式
export QT_QPA_PLATFORM=xcb
export XDG_SESSION_TYPE=x11
unset WAYLAND_DISPLAY
# 不设置 WEMEET_XWAYLAND,让 wemeet 使用原生 X11 SHM 截图
EOF
sudo chmod +x /opt/x11-wayland/x11-ext.sh
这个脚本做了四件事:
| 操作 | 说明 |
|---|---|
QT_QPA_PLATFORM=xcb | 强制 Qt 使用 X11 后端(而非 Wayland) |
XDG_SESSION_TYPE=x11 | 告知子进程运行在 X11 环境 |
unset WAYLAND_DISPLAY | 清除 Wayland 显示变量 |
不设置 WEMEET_XWAYLAND | 关键差异!让腾讯会议知道自己运行在真正的 X11 上 |
步骤 2:验证配置
创建后确认文件内容和权限:
cat /opt/x11-wayland/x11-ext.sh
ls -l /opt/x11-wayland/x11-ext.sh
预期输出:
#!/bin/bash
# 系统实际运行在 X11 上,不需要 XWayland 兼容模式
export QT_QPA_PLATFORM=xcb
export XDG_SESSION_TYPE=x11
unset WAYLAND_DISPLAY
# 不设置 WEMEET_XWAYLAND,让 wemeet 使用原生 X11 SHM 截图
-rwxr-xr-x 1 root root 252 7月 27 08:30 /opt/x11-wayland/x11-ext.sh
步骤 3:重启腾讯会议并测试
完全退出腾讯会议后重新启动,进入会议 → 点击"共享桌面" → 选择要共享的屏幕或窗口。
XShmGetImage 机制捕获屏幕画面。
原理总结
整个问题的因果链可以概括为:
- GDM 误标:显示管理器将 X11 会话的
$XDG_SESSION_TYPE标记为wayland - 脚本误判:腾讯会议启动脚本据此判定环境为 Wayland
- 设置错误标记:脚本设置
WEMEET_XWAYLAND=1 - 截屏路径错误:腾讯会议放弃 X11 SHM 直接截图,转向 ScreenCast portal
- portal 不可用:XFCE 桌面环境下没有任何可用的 ScreenCast portal 后端
- 屏幕共享失败
我们的修复在第 3 步介入:利用脚本的 x11-ext.sh 优先加载机制,配置正确的环境变量,同时不设置 WEMEET_XWAYLAND,让腾讯会议回到 X11 原生屏幕截图路径。
┌─────────────┐ ┌─────────────────┐ ┌──────────────┐ ┌─────────────┐
│ GDM 误标 │ ──→ │ wemeetapp.sh │ ──→ │ WEMEET_ │ ──→ │ ScreenCast │
│ XDG_SESSION │ │ 走 Wayland 分支 │ │ XWAYLAND=1 │ │ portal 不可 │
│ _TYPE= │ │ │ │ │ │ 用 → 失败 │
│ wayland │ │ │ │ │ │ │
└─────────────┘ └─────────────────┘ └──────────────┘ └─────────────┘
↑ ↑
│ 我们的修复在这里: │ ✓ 修复后
│ ┌─────────────────────┐ │
│ │ /opt/x11-wayland/ │ │
│ │ x11-ext.sh │ ─────────┘
│ │ 不设 WEMEET_ │ 使用 X11 SHM
│ │ XWAYLAND │ 原生截图 ✓
│ └─────────────────────┘
echo $WAYLAND_DISPLAY 有输出,且存在 gnome-shell/kwin/sway 等 Wayland compositor 进程),则本文方案不适用,请参考 wemeet-wayland-screenshare 项目通过 Hook + PipeWire 实现屏幕共享。
常见的坑
坑 1:反复安装各种 portal 后端
网上不少帖子建议安装 xdg-desktop-portal-wlr、xdg-desktop-portal-gnome 等包,但如果你在 X11+XFCE 环境下:
xdg-desktop-portal-gtk:不提供 ScreenCast 接口xdg-desktop-portal-gnome:ScreenCast 依赖 Mutter(GNOME 合成器),非 GNOME 桌面不可用xdg-desktop-portal-wlr:要求WAYLAND_DISPLAY环境变量,X11 下服务拒绝启动xdg-desktop-portal-xapp:为 XFCE 设计,但不包含 ScreenCast 接口
安装这些包不会解决问题,因为根因不在 portal 本身。
坑 2:全局修改 XDG_SESSION_TYPE
在 ~/.profile 或 ~/.bashrc 中添加 export XDG_SESSION_TYPE=x11 虽然有效,但不能区分"确实需要 XWayland 兼容的应用"和"本身就是 X11 的应用",可能影响其他应用的正常行为。本文方案只影响腾讯会议。
坑 3:版本升级覆盖
腾讯会议升级(apt upgrade wemeet)可能会覆盖 /opt/wemeet/wemeetapp.sh,但 不会影响 /opt/x11-wayland/x11-ext.sh,因为后者是独立的外部文件。这也是选择 x11-ext.sh 方案而非直接修改启动脚本的原因之一。
最后更新:2026-07-27
测试环境:Ubuntu 24.04 + XFCE + wemeet 3.26.10.401