安装腾讯会议

腾讯会议官网下载安装包并安装(笔者下载的版本是 3.19.2.400)。

安装完成后观察 /usr/share/applications/wemeetapp.desktop 文件发现腾讯会议主程序由 /opt/wemeet/wemeetapp.sh 脚本启动,但是直接点击程序图标运行会出现以下报错:

检测到窗口系统采用wayland协议,腾讯会议暂不兼容,程序即将退出!

修改启动脚本

腾讯会议默认不支持 Wayland 桌面环境,因此需要对启动脚本 /opt/wemeet/wemeetapp.sh 进行一些修改。具体地,启动脚本通过 if [ "$XDG_SESSION_TYPE" = "wayland" ] 这一行代码检测机器的桌面环境,我们需要在此之前添加以下内容:

# Force x11 instead of Wayland
export XDG_SESSION_TYPE=x11
export EGL_PLATFORM=x11
export QT_QPA_PLATFORM=xcb
unset WAYLAND_DISPLAY
unset WAYLAND_DISPLAYCOPY

再次启动程序,发现能够正常登陆账户并发起/参与会议,声音、画面一切正常,但是无法进行屏幕共享,发起共享后其他与会人员只能看到黑屏。

实现原生屏幕共享

针对腾讯会议在 Wayland 桌面环境下无法进行屏幕共享的问题,xuwd1/wemeet-wayland-screenshare 项目 hook 了 X11 的 XShmAttach, XShmGetImageXShmDetach 函数,实现了一个兼容层 (libhook.so),带来了原生的屏幕共享支持。

安装依赖

首先,安装 libhook 运行所需的系统依赖:

sudo apt install wireplumber xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-wlr  libopencv-dev libportal-dev libpipewire-0.3-dev libx11-dev libxdamage-dev libxcomposite-dev libxrandr-dev

构建 libhook

笔者在本机中安装构建依赖时出现以下报错:

E: 无法定位软件包 xwaylandvideobridge

通过查询 Debian Package Tracker 发现 xwaylandvideobridge 软件包在 2024 年 12 月 4 日才并入 testing 软件源,因此目前在 bookworm(Debian 12) 软件源中不可用,为避免跨发行版更新软件源导致大规模兼容性问题,笔者决定使用 docker 构建 hook library。

[!TIP]

笔者通过进一步查询以及后续实际测试发现,xwaylandvideobridge 并非 hook library 运行所必需的依赖(至少在 KDE 和 GNOME 下并不依赖),而项目原作者为了保留不同桌面环境的兼容性,仍然在项目中引用了该库。

创建 builder 镜像工作目录:

mkdir wemeet-wayland

编写 builder 镜像 dockerfile,具体内容如下:

FROM debian:trixie

RUN apt update && \
    apt install -y build-essential cmake ninja-build pkg-config wireplumber xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-wlr xwaylandvideobridge libopencv-dev libportal-dev libpipewire-0.3-dev git libx11-dev libxdamage-dev libxcomposite-dev libxrandr-dev && \
    apt clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

CMD ["bash", "-c", "git clone --recursive https://github.com/xuwd1/wemeet-wayland-screenshare.git && \
    cd wemeet-wayland-screenshare && \
    mkdir build && \
    cd build && \
    cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release && \
    ninja"]

构建 builder 镜像,整个过程大概需要 4 分钟左右:

docker build -t wemeet-wayland-screenshare-builder .

运行容器,执行构建任务:

docker run --rm -v ./app:/app wemeet-wayland-screenshare-builder

构建任务结束后 builder 容器会自动退出并删除,最终的构建产物为当前目录下的 app/wemeet-wayland-screenshare/build/libhook.so 文件。

预加载 libhook

拷贝 libhook.so 到系统目录:

sudo mkdir /usr/lib/wemeet
sudo cp app/wemeet-wayland-screenshare/build/libhook.so /usr/lib/wemeet

使用以下命令测试 libhook 是否工作正常:

LD_PRELOAD=/usr/lib/wemeet/libhook.so /opt/wemeet/wemeetapp.sh

最后,再次修改腾讯会议启动脚本 /opt/wemeet/wemeetapp.sh,在最后一行代码 exec wemeetapp $* 的上方添加以下内容:

export LD_PRELOAD=/usr/lib/wemeet/libhook.so

此后再点击桌面图标启动腾讯会议就一切功能正常了!🎉🎉🎉

参考资料