我可以使用 v4l2loopback 创建一个虚拟视频设备,使用 Xephyr 在其自己的窗口中创建一个嵌套的 X 服务器,并使用 gst 管道将两者连接起来,这样 Xephyr 窗口的内容就会显示为我的网络摄像头。这提供了一个不错的沙盒,其中只有我想要共享的应用程序可见,这意味着我可以切换回视频会议,而其他参与者不会丢失嵌套桌面的视图。
但是,这看起来像是我的网络摄像头,而不是屏幕共享,因此我失去了真正屏幕共享的一些优点。例如,这意味着每个其他用户都必须“固定”我的提要,以便在其他人讲话时不会失去焦点。因此,我正在寻找一种方法来欺骗我的浏览器,使其从运行它的 X 服务器以外的 X 服务器或视频设备获取其屏幕共享输入。
如果有关系的话,这是在 Cinnamon 环境中运行的 Firefox。
在现代 Firefox 上(如果您拥有 Wayland,则必然始终如此),屏幕共享是由 Firefox 请求
pipewire
屏幕共享列表和流,然后从那里获取数据来完成的。Pipewire 本身通过
xdg-desktop-portal
的接口向您的屏幕管理器请求捕获后端。这些特定门户有各种实现(针对 gtk、kde、wlroots 等),它们(大多数)都实现了ScreenCast接口。据我所知,xdg-desktop-portal API 提供的接口选择中,每个接口(如声音播放、显示文件选择对话框、屏幕捕获、视频捕获等)只能有一个活动实现。不过,您可以选择自己喜欢的那个!
这样,您就可以在“主” X11 上运行默认通用 gtk 门户,在 Xephyr 中运行 kde 门户,然后使用该门户启动 KDE 门户
$DESKTOP
。说实话,我不确定这是否值得付出努力,而且我确信一旦你真正尝试,你会遇到更多障碍。但原则上,只要它们有不同的 DBUS 名称,你就可以拥有任意数量的支持屏幕录制的门户,并通过在修改的
$XDG_CONFIG_HOME
环境启动浏览器来选择你想要使用的门户,这会将其指向自定义的portals.conf。