在niri下实现腾讯会议(wemeet)屏幕共享的经验分享

Attacker IV 2026-03-26 21:25 1

因为经常要开会,所以腾讯会议 (wemeet) 的屏幕共享问题对我来说是一个重大的阻碍,不能让我完全放弃 Windows 转 GNU/Linux。虽然可能在 kde 或者 gnome 桌面下问题不大,但是我还是比较想用 niri,所以一直在折腾。终于在尝试各种各样的方案以后,在AI 的帮助下,实现了 niri 下的腾讯会议屏幕共享,包括两个:



  1. 自己可以正常共享

  2. 能看到别人的共享


这应该算是社区里大家都经常遇到的两个问题,所以分享出来供大家参考


因为不是特别专业,所以就简单按自己的理解总结一下要注意的点。


我的系统是NixOS,niri是25.11版本,wemeet是3.26.10.401版本,显卡是NVIDIA。如果佬们的版本和硬件和我的不同可能不完全适用。


先说说如果完全不配置可能出现的情况是什么,就是wemeet可以正常打开,点击屏幕共享没有调出屏幕选择,然后也看不到别人共享的屏幕(黑屏)。


下面是具体配置步骤:



  1. 第一步,给niri打一个补丁, Support shm sharing by wrvsrx · Pull Request #1791 · niri-wm/niri · GitHub 。据说是解决了shm的问题(虽然我不太了解这是啥),但是提这个pr的佬说他的wemeet在打了这个补丁之后正常工作,我之后的配置也是在这个基础上的,没有试过去掉这个补丁之后是否还能用(




  1. 第二步,将和屏幕相关的 portal 请求,交给 hyprland backend 处理。具体来说是 “org.freedesktop.impl.portal.ScreenCast” = [ “hyprland” ];“org.freedesktop.impl.portal.RemoteDesktop” = [ “hyprland” ];

    这里是参考的这位佬的帖子 niri如何正确运行腾讯会议


安装portal:


  xdg.portal.extraPortals = with pkgs; [
xdg-desktop-portal-gnome
xdg-desktop-portal-gtk
xdg-desktop-portal-hyprland
xdg-desktop-portal-wlr
];

配置portal:


      niri = {
default = lib.mkForce [
"gtk"
"gnome"
];
"org.freedesktop.impl.portal.Access" = [ "gtk" ];
"org.freedesktop.impl.portal.Notification" = [ "gtk" ];
"org.freedesktop.impl.portal.Secret" = [ "gnome-keyring" ];
"org.freedesktop.impl.portal.ScreenCast" = [ "hyprland" ];
"org.freedesktop.impl.portal.RemoteDesktop" = [ "hyprland" ];
};


同时可能需要同步一下境变量,在niri的配置文件spawn-sh-at-startup.kdl中加上:


spawn-sh-at-startup "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri"

到这一步,如果环境加载没问题,那么就已经可以共享自己的屏幕了。具体来说会出现一个选择共享屏幕的窗口,点击就能共享了,(同时还有可能出现一系列的绿色窗口,应该是某种奇怪的bug,但是不影响屏幕共享。)


只有这个没用



点击开始共享后出现了这个窗口才算成功(不过现在只能共享整个屏幕,不能选窗口),之后应该就能正常共享自己的屏幕了



不过,到此为止还没有解决无法看到别人共享的问题,可能要么是黑屏,要么是闪退。


所以需要第三步




第二步更新,见


更新一下,现在我发现在第二步,将和屏幕相关的 portal 请求,可以不走hyprland后端,直接用gnome后端即可,实测可用且可以选择窗口共享
[image]
[image]
配置如下
config = {
common = {
# Use GNOME first with GTK as the global fallback backend.






  1. 第三步,让wemeet本体走 XWayland,同时保持上面配置好的 portal。前者解决无法看到别人共享的屏幕的问题,后者解决自己共享屏幕的问题。这里主要是 AI 帮我配的,nixos 里面直接这样写


{ pkgs, ... }@args:

let
# Use the stable package-set build for Wemeet itself so the app keeps the
# older 1.4.x PipeWire-era screenshare hook path, while preserving the
# current repo-local wrapper strategy around it.
wemeetBase = args."pkgs-stable".wemeet;

# Keep upstream Wemeet resources and desktop entry, but replace the default
# launcher with the hybrid route validated under niri:
# XWayland startup + Mesa EGL + Wayland portal/PipeWire screenshare backend.
wemeet = pkgs.symlinkJoin {
name = "wemeet";
paths = [ wemeetBase ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
rm -f $out/bin/wemeet

displayProbe='if [ -z "''${DISPLAY-}" ]; then
for x_sock in /tmp/.X11-unix/X*; do
if [ -S "$x_sock" ]; then
export DISPLAY=":''${x_sock##*/X}"
break
fi
done
fi'

makeWrapper ${wemeetBase}/bin/wemeet-xwayland $out/bin/wemeet \
--run "$displayProbe" \
--set __EGL_VENDOR_LIBRARY_FILENAMES ${pkgs.mesa}/share/glvnd/egl_vendor.d/50_mesa.json
'';
};
in
{
home.packages = [
wemeet
];
}


里面还配置了优先用 Mesa 的 EGL(应该和 NVIDIA 显卡的渲染问题有关),我的设备不这样配会导致 wemeet 崩溃。


总之最后能看到别人共享的屏幕了,自己也能共享,而且之前的绿色窗口也消失了,算是意外之喜 ^-^



这套方案我用了几天算是比较稳了,逃离Windows指日可待 ^-^

最新回复 (19)
  • 在学OCaml 04-01 16:17
    1

    啊啊啊啊啊如此宝贵的经验分享我居然还是第一个前排支持! 用了 Niri 快一年里, 每次开会我都要掏出积灰的 Windows 本. 现在终于可以扔了!

  • gnu 04-01 16:20
    2

    可以,很好


    如果不打补丁,疼薰会议能在 wayland 的 gnome 上运行吗?

  • 在学OCaml 04-01 16:54
    3

    腾讯会议已经支持wayland共享屏幕了, gnome上应该已经能做到开箱即用. niri 这边因为实现缺少一个共享屏幕的协议所以还得hack一下

  • Attacker IV 楼主 04-01 16:59
    4

    似乎gnome、kde的wayland现在的腾讯会议是原生支持的,但我自己没有用过gnome,佬可以自己试试 ^-^

  • Attacker IV 楼主 04-01 17:02
    5

    感谢支持!佬可以试试这个方案,如果有问题随时交流 ^-^

  • gnu 04-01 17:58
    6

    还没有机会尝试过


    不知道疼薰会议和浏览器共享屏幕用的是不是一个东西。浏览器那边,用的是 pipewire, 按理说只要装了 Pipewire 和 portal 就能使

  • Attacker IV 楼主 04-02 10:35
    7

    更新一下,现在我发现在第二步,将和屏幕相关的 portal 请求,可以不走hyprland后端,直接用gnome后端即可,实测可用且可以选择窗口共享




    配置如下


    config = {
    common = {
    # Use GNOME first with GTK as the global fallback backend.
    default = [
    "gnome"
    "gtk"
    ];
    "org.freedesktop.impl.portal.FileChooser" = [ "gtk" ];
    };

    niri = lib.mkForce {
    default = [
    "gnome"
    "gtk"
    ];
    "org.freedesktop.impl.portal.FileChooser" = [ "gtk" ];
    };

    hyprland = {
    default = [
    "hyprland"
    "gnome"
    "gtk"
    ];
    "org.freedesktop.impl.portal.FileChooser" = [ "gtk" ];
    };
    };


    (因为使用thunar 所以FileChooser使用了gtk,也可以直接全部gnome)


    有意思的是,hyprland必须要用他自己的后端才能正常屏幕共享,使用gnome会失效。niri则可以全部梭哈gnome ^-^

  • littleforks 04-02 10:48
    8

    佬太强了!!之前要展示项目突然得屏幕共享,当众从niri切回windows,社死完了 ^-^这就去试一下

  • Attacker IV 楼主 04-02 10:53
    10

    之前我也得先切好再展示,每次切回去都得先适应一下Windows ^-^

  • littleforks 04-02 10:57
    11

    还真是,平铺式用惯了,回win切窗口发现快捷键没反应 ^-^ ^-^

  • 李寻欢 04-02 11:12
    12

    牛逼,收藏一手先~

  • 日居月诸 04-03 11:51
    13

    很不错的方案!我最近也尝试去解决了楼主这个问题,不过我用的是 wemeet-x11 + wayland-screenshare 的(陈旧)路线。这个路线有个好处是,高频切换 screensharing 不容易弄坏(我记得 wemeet wayland 自带的共享有个 bug),然后可以正常录鼠标且没有绿框。


    以及我没遇到不能看到他人共享的问题,可能 niri 最近修了吧。


    以下是帖子原文,现在还没审核好 :)




    原文

    在 niri-wm 中,腾讯会议的屏幕共享一直有问题。进行了一些尝试后,我成功解决了这个问题。


    解决路线: 不使用现在 Wemeet 自带的 Wayland 端,而是回到(很久以前的)Wemeet-x11 + wemeet-wayland-screenshare 方案。



    其实我一直很喜欢这个方案,原因是它可以在 GNOME 下正常显示鼠标。不过很久没用 GNOME 了。



    使用 Fix 了 shm sharing 的 niri


    共享内存的屏幕共享功能到现在好像还没合入主分支(现在已经有个 PR 了;它提供了一个 patch)。你可以自行 patch 上这个补丁。如果你使用 Arch Linux,可以尝试使用我写的 PKGBUILD。


    使用 wemeet-wayland-screenshare


    不知道 wemeet-wayland-screenshare 是不是太久没更新了,现在在 wemeet 使用它在共享第一次屏幕后,若关闭共享,第二次就无法正常共享了。我用 AI 修了一下,代码在我的fork。如果你使用 Arch Linux,可以尝试我写的 PKGBUILD。




    完成后,就可以正常地使用 WemeetApp(Wayland Screenshare) 这个 .desktop 来运行可以正常屏幕共享的 wemeet 了!



    楼主这个方案

  • 日居月诸 04-03 11:52
    14

    楼主这个方案好像也很有意思,我之后试试,可惜不太会 nix 看不太懂(



    好像 L 站卡了一下后面这句话吞了。不敢再编辑,我回答里一堆 github 链接每次都得审批 ^-^


  • Attacker IV 楼主 04-03 12:31
    15

    感谢佬的分享!

    nix配置用AI看一下应该很快就能“翻译”出来。


    我觉得大体和佬的方案也差不多,wemeet 走 x11或xwayland,然后能正常调用portal就行(niri自己没有屏幕共享的portal所以用gnome的),然后用“ 使用 Fix 了 shm sharing 的 niri”这一点也是一样的 ^-^


    区别可能在我直接用了现在wemeet的官方包,没用 wemeet-wayland-screenshare,不过我到目前还没有遇到啥bug

  • 小贺同学 04-14 17:00
    16

    区别可能在我直接用了现在wemeet的官方包,没用 wemeet-wayland-screenshare,不过我到目前



    大佬是只在wemeet的原版基础上配置了一个kooha吗?我现在也有相关问题,但我是debian下的niri.默认就能看到别人的屏幕,只是共享出去会黑屏

  • Attacker IV 楼主 04-14 18:01
    17

    自己共享不了应该是niri侧的问题,需要打一个niri的补丁,能看到别人的共享应该就不用动wemeet。GitHub - SeaDve/Kooha: Elegantly record your screen · GitHub kooha是指这个吗?我没有配置过这个,只是用了gnome的patrol

  • 小贺同学 04-14 18:26
    18

    我刚把niri的补丁打好了,似乎还有点问题。做了第一步和第二步。环境配置好了,但是还是失效了。暂时还没想到其他的问题

  • Attacker IV 楼主 04-14 18:34
    19

    具体是哪一步不行呢,是调不出选择屏幕的窗口吗?佬可以发发报错或截图,一起讨论一下 ^-^

  • 小贺同学 04-14 19:13
    20

    先从第一步开始,打补丁:


       Compiling pangocairo v0.21.5
    Compiling niri-config v25.11.0 (/home/zeroth/ForMe/niri/niri-config)
    Finished `release` profile [optimized + debuginfo] target(s) in 1m 47s

    zeroth@zeoroth-MiBook ~/F/niri (main)> niri --version (base)
    niri 25.11 (v25.11-150-ga0f2d9b0)

    上面是已经重新编译过的niri版本。


    第二步主要是安装三个包并且配置好环境:



    1. 安包


    sudo apt install xdg-desktop-portal xdg-desktop-portal-gnome xdg-desktop-portal-gtk


    1. 配置环境


    vim ~/.config/xdg-desktop-portal/niri-portals.conf
    # 使用上面这条命令,创建文件,然后填入下面的内容
    如下:
    [preferred]
    # 默认情况优先使用 gnome,其次是 gtk
    default=gnome;gtk;

    # 明确指定屏幕共享和截图使用 gnome 后端
    org.freedesktop.impl.portal.Screencast=gnome
    org.freedesktop.impl.portal.Screenshot=gnome

    # 明确指定文件选择器使用 gtk 后端
    org.freedesktop.impl.portal.FileChooser=gtk


    1. 然后修改niri配置


    spawn-sh-at-startup "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri"

    添加上面的参数


    至此,选择注销重启。仍然无法解决屏幕无法显示的问题:




    他只有这两个窗口。鼠标都无法看到


    如果选择使用x11方式启动:也就是这条命令


    env -u WAYLAND_DISPLAY QT_QPA_PLATFORM=xcb XDG_SESSION_TYPE=x11 ./wemeetapp.sh

    那么他可以看到鼠标移动,是黑屏状态。

* 帖子来源Linux.do
返回