Debian 12 (Wayland) 安装腾讯会议并实现原生屏幕共享
安装腾讯会议
在腾讯会议官网下载安装包并安装(笔者下载的版本是 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
, XShmGetImage
和 XShmDetach
函数,实现了一个兼容层 (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
此后再点击桌面图标启动腾讯会议就一切功能正常了!🎉🎉🎉