屏幕录制
概述#
niri 主要是通过 portals 和 pipewire 提供的屏幕录制接口。 OBS、Firefox、Chromium、Electron、Telegram 以及其他应用程序均支持此功能。 您可以录制整个显示器或单个窗口。
要使用此功能,您需要一个可正常工作的 D-Bus 会话、pipewire、xdg-desktop-portal-gnome,以及将 niri 作为会话运行(即通过 niri-session 或从显示管理器启动)。
在主流发行版中,这些组件通常都能“开箱即用”。
此外,您也可以使用依赖于 wlr-screencopy 协议的工具,niri 也支持该协议。
niri 中内置有多项专为屏幕录制设计的特性。 让我们一起来看看!
遮蔽窗口#
您可以在屏幕录制中遮蔽特定窗口,将其替换为纯黑色的矩形区域。 这对于密码管理器或聊天窗口等场景很有用。

这是通过 block-out-from 窗口规则控制的,例如:
// 在屏幕录制中遮蔽密码管理器。
window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
block-out-from "screencast"
}
您也可以使用图层规则来遮蔽图层界面:
有关更多详细信息和示例,请参阅相应的 wiki 部分。
动态屏幕录制目标#
Niri 提供了一个特殊的屏幕录制流,您可以动态更改它。 在屏幕录制窗口对话框中,它显示为“niri 动态录制目标(niri Dynamic Cast Target)”。
选择该选项后,它将作为一个空的、透明的视频流启动。 然后,您可以使用以下几个绑定来更改它显示的内容:
set-dynamic-cast-window录制当前焦点窗口。set-dynamic-cast-monitor录制当前焦点显示器。clear-dynamic-cast-target恢复到空视频流。
您也可以从命令行调用这些操作,例如交互式选择要录制的窗口:
如果录制目标消失(例如目标窗口关闭),流将自动恢复为空状态。
所有动态录制共享同一个目标,但新的录制开始时是空视频流,直到您下次更改它(以避免意外泄露敏感内容)。
标示正在录制的窗口#
is-window-cast-target=true 窗口规则可匹配正在被录制的窗口。
您可以使用特殊的边框颜色来明确标示正在录制的窗口。
此功能也适用于动态屏幕录制所针对的窗口。 然而,对于在全屏屏幕录制中恰好可见的窗口,此功能则不起作用。
// 用红色标示正在录制的窗口。
window-rule {
match is-window-cast-target=true
focus-ring {
active-color "#f38ba8"
inactive-color "#7d0d2d"
}
border {
inactive-color "#7d0d2d"
}
shadow {
color "#7d0d2d70"
}
tab-indicator {
active-color "#f38ba8"
inactive-color "#7d0d2d"
}
}
示例:
窗口化(虚拟/分离式)全屏#
在录制 Google Slides 这类基于浏览器的演示文稿时,您通常希望隐藏浏览器界面,这就需要将浏览器设为全屏模式。 但这样做有时很不方便,例如,当您使用超宽屏显示器时,或者您只是想让浏览器窗口小一点,而不占用整个显示器。
toggle-windowed-fullscreen 这个绑定就是为了解决这个问题。
它会让应用程序以为自己进入了全屏模式,但实际上它仍然是一个普通窗口,您可以自由调整其大小并将其放置在任意位置。
请注意,并非所有应用程序都会响应全屏操作,因此可能有时候您使用了这个绑定,却看起来无事发生。
下面是一个示例,显示了一个窗口化全屏的 Google Slides 演示文稿,以及演讲者视图和会议应用程序:
屏幕镜像#
在进行演示时,将一个输出镜像到另一个输出可能会很有用。
目前,niri 没有内置的输出镜像功能,但你可以使用第三方工具 wl-mirror ,它可以将一个输出镜像到一个窗口。
请注意,下面的命令需要安装 jq 。
binds {
Mod+P repeat=false { spawn-sh "wl-mirror $(niri msg --json focused-output | jq -r .name)"; }
}
wl-mirror 窗口移动到目标输出。
最后,将 wl-mirror 窗口全屏(默认快捷键为 ModShiftF)。