Buck Blog · 博客正文

返回技术分享首页
Ubuntu 设置腾讯会议屏幕共享

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=waylandGDM 标记为 Wayland
  • WAYLAND_DISPLAY 为空
  • Xorg 进程正在运行(PID 9088,由 GDM 启动)
  • xfwm4(XFCE 窗口管理器)在 :0.0 上运行
  • 没有任何 Wayland compositor 进程
结论:系统实际上运行在 X11 上,但 GDM 错误地将 $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 环境下"。在这种情况下:

  1. 腾讯会议认为自己在 Wayland 会话中,X11 的 XShmGetImage 截图无法获取真实的屏幕内容(在真正的 Wayland+XWayland 组合下确实如此)
  2. 因此它会尝试走 xdg-desktop-portal ScreenCast 接口来获取屏幕画面
  3. 但是,当前系统的 ScreenCast portal 后端不可用
    • xdg-desktop-portal-gtk:不提供 ScreenCast 接口
    • xdg-desktop-portal-gnome:提供 ScreenCast,但被 UseIn=gnome 限制,且依赖 Mutter(GNOME 合成器)
    • xdg-desktop-portal-wlr:需要 WAYLAND_DISPLAY 环境变量,并限定 wlroots 系桌面
  4. 所有 ScreenCast 后端都不匹配 → 屏幕共享失败
核心矛盾:系统实际是 X11(XShm 截图完全可用),但 WEMEET_XWAYLAND=1 让腾讯会议误以为需要 portal 方式的屏幕捕获,而 portal 后端在当前桌面环境下不可用。

第四步:为什么不直接改 XDG_SESSION_TYPE?

直接修改 $XDG_SESSION_TYPEx11(比如在 ~/.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:重启腾讯会议并测试

完全退出腾讯会议后重新启动,进入会议 → 点击"共享桌面" → 选择要共享的屏幕或窗口。

预期结果:屏幕共享正常工作,不再弹出 xdg-desktop-portal 相关错误提示。腾讯会议使用 X11 原生的 XShmGetImage 机制捕获屏幕画面。

原理总结

整个问题的因果链可以概括为:

  1. GDM 误标:显示管理器将 X11 会话的 $XDG_SESSION_TYPE 标记为 wayland
  2. 脚本误判:腾讯会议启动脚本据此判定环境为 Wayland
  3. 设置错误标记:脚本设置 WEMEET_XWAYLAND=1
  4. 截屏路径错误:腾讯会议放弃 X11 SHM 直接截图,转向 ScreenCast portal
  5. portal 不可用:XFCE 桌面环境下没有任何可用的 ScreenCast portal 后端
  6. 屏幕共享失败

我们的修复在第 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            │   原生截图 ✓
       │           └─────────────────────┘
适用判断:如果你的系统确实运行在 Wayland 上(echo $WAYLAND_DISPLAY 有输出,且存在 gnome-shell/kwin/sway 等 Wayland compositor 进程),则本文方案不适用,请参考 wemeet-wayland-screenshare 项目通过 Hook + PipeWire 实现屏幕共享。

常见的坑

坑 1:反复安装各种 portal 后端

网上不少帖子建议安装 xdg-desktop-portal-wlrxdg-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