温馨提示×

如何在Debian上利用Compton实现屏幕录制

小樊
31
2025-12-26 15:14:04
栏目: 智能运维

在 Debian 上用 Compton 实现屏幕录制

关键说明

  • Compton/Picom 是 X11 的窗口合成器,负责窗口合成、阴影、透明度等效果;它不负责录屏。录屏应由 ffmpeg、OBS 等工具完成。合成器在录制时的主要价值是提供离屏缓冲更一致的帧呈现,有助于减少某些场景下的画面撕裂或闪烁。若使用 Wayland,Compton 不参与合成,需用相应 Wayland 工具录屏。

安装与准备

  • 安装合成器(Debian 12 仓库中的 compton 可能较旧,功能与后续维护更好的 picom 相近;两者用法基本一致):
    • sudo apt update && sudo apt install compton
  • 安装录屏工具(示例使用 ffmpeg;也可用 obs-studio):
    • sudo apt install ffmpeg
  • 确认会话类型:
    • echo $XDG_SESSION_TYPE # 输出 x11 表示 X11;wayland 表示 Wayland

方案一 使用 ffmpeg 直接录制(推荐)

  • 全屏录制(X11):
    • ffmpeg -f x11grab -i :0.0 -f pulse -i default -c:v libx264 -preset veryfast -crf 23 -c:a aac -b:a 128k out.mp4
  • 指定区域录制(示例:x=1366、y=768、宽=1280、高=720):
    • ffmpeg -f x11grab -i :0.0+1366,768 -f pulse -i default -c:v libx264 -preset veryfast -crf 23 -c:a aac -b:a 128k out.mp4
  • 录制当前活动窗口(先用 xwininfo 获取窗口 ID):
    • xwininfo | grep “Window id”
    • ffmpeg -f x11grab -i :0.0+, -f pulse -i default -c:v libx264 -preset veryfast -crf 23 -c:a aac -b:a 128k out.mp4
  • 说明:
    • 音频设备名可用 pactl list sources short 查看并替换 default。
    • 若遇到画面撕裂/闪烁,可先确保合成器运行,再按下一节优化参数。

方案二 使用 OBS Studio 录制

  • 安装:sudo apt install obs-studio
  • 在 OBS 中添加“X11 屏幕捕获”或“窗口捕获”源,选择目标显示器或窗口,设置视频码率与音频后开始录制。
  • 合成器对 OBS 的作用与 ffmpeg 类似:提供离屏缓冲与更稳定的帧呈现,便于获得更平滑的录屏效果。

减少闪烁与卡顿的配置建议

  • 使用硬件加速后端:在 Compton 配置中优先使用 backend = “glx”(若出现异常,可尝试 xrender)。示例配置片段:
    • backend = “glx”
    • vsync = true
    • shadow = false # 录屏时可关闭阴影以降低开销
  • 录屏时缓解闪烁的参数:
    • 启动 Compton 加入 --benchmark 1000000(会降低 CPU 占用波动,但会增加功耗),示例:compton --benchmark 1000000 &
  • 驱动与刷新率:
    • 确保显卡驱动正确安装并更新;与显示器刷新率匹配可减少撕裂。
    • 使用 NVIDIA 显卡时,可在驱动层面启用同步(如 ForceFullCompositionPipeline)以进一步减少撕裂,再视情况在 Compton 中关闭 vsync 以避免双重同步带来的问题。

常见问题与排查

  • 找不到窗口坐标或区域:用 xwininfo 获取准确的 x、y、宽、高;多显示器下注意主显示器偏移。
  • 没有声音:确认 PulseAudio 正在运行,ffmpeg 使用 -f pulse -i default,或在 OBS 中选择正确的音频源。
  • Wayland 会话:Compton 不参与合成,请使用支持 Wayland 的录屏方案(如 OBS Studio 的 PipeWire 捕获,或 wf-recorder)。
  • 性能或画面问题:优先尝试 backend = “glx”、关闭阴影/透明、更新驱动与系统、必要时使用 --benchmark 参数。

0