25-9-12:
目前,腾讯会议官方已经为Linux更新了最新版wemeet(在今日最新版本为V 3.26.10(400)),其已经直接支持了Wayland下屏幕共享的功能. 不仅如此,新版本界面也更加美观现代,基本达到了其余操作系统版本的水平。因此,本项目已经完成了其任务,从现在起不再维护,转入归档状态.
因此,所有用户现在应该安装/升级到最新版的腾讯会议wemeet,并卸载本项目.
最后,衷心谢谢各位贡献者的支持,特别是DerryAlex、novel2430和Coekjan,以及AUR上的sukanka. 他们的贡献解决了多个突出问题,让我们能在短暂的半年时间内获得一个相对稳定和良好的功能和使用体验。由于我个人的怠惰和心理问题,此前有许多MR和Issue没有及时处理和回复,真的抱歉啦!希望这个项目也曾帮助到过大家。
长期以来,由于腾讯会议开发者的不作为,腾讯会议一直无法实现在Wayland下的屏幕共享,给Linux用户造成了极大的不便。但现在,很自豪地,本项目首次实现了在大部分Wayland环境下使用腾讯会议的屏幕共享功能!
特别地,有别于其他方案,本项目不使用虚拟相机,而是特别实现了一个hook库,使得用户可以在大部分Wayland环境下正常使用腾讯会议的屏幕共享功能.
在几位贡献者的努力下,本项目现在已经可以支持大部分的DE/WM下的腾讯会议屏幕共享功能. 目前确认可用的DE/WM包括:
- KDE Wayland
- GNOME Wayland
- Hyprland
- wlroots-based (tested: sway, wayfire, labwc, river, maomao)
下面的图片展示了使用步骤和效果:
在几位贡献者的努力下,本项目现在已经可以同时支持KDE Wayland和GNOME Wayland下的腾讯会议屏幕共享功能. 特别地,下面给出在ArchLinux上的编译和安装方法. 如果你使用的是其他distro,还请自行adapt,但总体上应该相当容易.
- 安装AUR package wemeet-bin:
# Use whatever AUR helper you like, or even build locally
yay -S wemeet-bin - 安装依赖
sudo pacman -S wireplumber
sudo pacman -S libportal xdg-desktop-portal xdg-desktop-portal-impl xwaylandvideobridge opencv- 注意:本项目在之前的版本中必须依赖于
pipewire-media-session. 而现在经过测试已经确定wireplumber下可用. 如果系统中已经安装pipewire-media-session,pacman会在安装wireplumber时提示替换,你基本可以毫无顾虑地同意替换. 关于此问题具体的implication,还请自行查阅相关资料.
- 编译本项目:
# 1. clone this repo
git clone --recursive https://github.com/xuwd1/wemeet-wayland-screenshare.git
cd wemeet-wayland-screenshare
# 2. build the project
mkdir build
cd build
cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release
ninja
- 编译完成后,
build目录下可见有libhook.so
- 将
libhook.so预加载并钩住wemeet:
# make sure you are in the build directory
LD_PRELOAD=$(readlink -f ./libhook.so) wemeet-x11按照上面的使用方法,你应该可以在Wayland下正常使用腾讯会议的屏幕共享功能了!
- 注意:推荐使用
wemeet-x11. 具体原因请见后文兼容性和稳定性类部分.
- (optional) 将
libhook.so安装到系统目录
sudo ninja install默认情况下,libhook.so会被安装到/usr/lib/wemeet下. 你随后可以相应地自行编写一个启动脚本,或者修改wemeet-bin的启动脚本,使得libhook.so按如上方式被预加载并钩住wemeetapp.
Flatpak 版腾讯会议已集成本项目,直接从 Flathub 安装即可:
如果你使用的是ArchLinux,更方便的安装方法是直接安装AUR包wemeet-wayland-screenshare-git:
# Use whatever AUR helper you like, or even build locally
yay -S wemeet-wayland-screenshare-git
随后,在命令行执行wemeet-wayland-screenshare,或者直接在应用菜单中搜索WemeetApp(Wayland Screenshare),打开即可.
下面是本项目概念上的系统框图.
事实上,本项目实际上开发的是一个X11的hack,而不是wemeetapp的hack. 其钩住X11的XShmAttach,XShmGetImage和XShmDetach函数,分别实现:
-
在
XShmAttach被调用时,hook会启动payload thread,启动xdg portal session,并进一步启动gio thread和pipewire thread,开始屏幕录制,并将frame不断写入framebuffer. 此外,一个x11 overlay sanitizer会被启动,使得X11模式下(wemeet-x11),开启屏幕共享时wemeet的overlay被强制最小化,进而让用户的鼠标可以自由地点击包括xdg portal窗口在内的任何屏幕内容. -
在
XShmGetImage被调用时,hook会从framebuffer中读取图像,并将其写入XImage结构体中,让wemeetapp获取到正确的屏幕图像 -
在
XShmDetach被调用时,hook会指示payload thread停止xdg portal session,并进一步join gio thread和pipewire thread,结束屏幕录制.
此外,hook同时还会劫持XDamageQueryExtension函数,使得上层应用认为XDamage扩展并未被支持,从而强迫其不断使用XShmGetImage获取新的完整图像.
如果你对此感兴趣,也可以进一步查阅experiments目录下的代码和文档,以了解更多细节.
本项目当前还是非常实验性质的,其还有诸多不足和许多亟待解决的问题. 如果你有兴趣,欢迎向本项目贡献代码,或者提出建议!下面是一个简要的问题列表:
-
framebuffer中的mutex导致的功耗偏高的问题已经在
Coekjan的PR #13中得到解决. 目前观察到对于灵耀16Air(UM5606) Ryzen AI HX 370, 屏幕共享时的最低封装功耗可以低至4.7W左右,和Windows下的屏幕共享功耗基本相当. -
opencv的链接问题已经根据
lilydjwg的issue #1得到了解决. 现在,借助opencv,本项目可以在保证aspect ratio不变的情况下对图像进行缩放.
-
本项目目前只在以下环境下测试过:
- EndeavourOS ArchLinux KDE Wayland +
wireplumber/pipewire-media-session正常工作 - EndeavourOS ArchLinux GNOME 47 Wayland +
wireplumber正常工作 - 根据贡献者
DerryAlex的测试结果,GNOME 43 +wireplumber(Unknown distro) 正常工作 - 根据#4中反馈的结果,Manjaro GNOME 47 (+ possibly
wireplumber) 正常工作 - 根据
falser的反馈,ArchLinux Hyprland +wireplumber正常工作 - 根据
novel2430在#9中的测试,典型的wlroots-based DE/WM下 (tested: sway, wayfire, labwc, river) 正常工作
- EndeavourOS ArchLinux KDE Wayland +
-
目前,本项目只基于AUR package wemeet-bin测试过. 特别地,在纯Wayland模式下(使用
wemeet启动),wemeet本身存在一个恶性bug:尽管搭配本项目时,Linux用户可以将屏幕共享给其他用户,但当其他用户发起屏幕共享时,wemeet则会直接崩溃. 因此,本项目推荐启动X11模式的wemeet(使用wemeet-x11启动).
- 此时,本项目仍然可以确保屏幕共享功能正常运行.
- 而这主要得益于本项目新增加的x11 sanitizer,其会在屏幕共享时强制最小化wemeet的overlay(开始屏幕共享后2秒后生效),使得用户可以自由地点击包括xdg portal窗口在内的任何屏幕内容.
-
感谢AUR package wemeet-bin的维护者
sukanka以及贡献者Sam L. Yes. 他们出色的工作基本解决了腾讯会议在Wayland下的正常运行问题,造福了众多Linux用户. -
感谢
nothings开发的stb库. 相较于opencv的臃肿和CImg富有想象力的memory layout,stb库提供了一个轻量且直接的解决方案,使得本项目得以实现. -
感谢
lilydjwg提出的issue. 他的建议解决了本项目无法链接到opencv库的问题,改善了本项目的性能和效果. -
感谢
DerryAlex贡献的GNOME支持代码. 他出色的工作使得本项目可以在GNOME下正常工作,改进了x11 sanitizer的效果,并额外解决了项目中存在的一些问题. -
感谢
novel2430的帮助. 他花费了大量时间和精力测试了本项目在wlroots-based DE/WM下的兼容性,并帮助了我们解决在这些环境下的一些问题. -
感谢
Coekjan贡献的hugebuffer代码. 他的工作帮助本项目解决了framebuffer中的mutex导致的功耗偏高的问题.



