QT6 如何在Linux Wayland 桌面系统抓屏和分享屏幕
要在 Linux Wayland 桌面环境下使用 Qt6 实现屏幕抓取和分享,需结合 Qt 原生支持与系统级工具(如 PipeWire、XDG Desktop Portal)。以下是具体方案和技术要点:
Qt6 原生屏幕捕获(QScreenCapture)
适用场景:需在 Qt 应用程序中直接集成屏幕捕获功能。
核心依赖:
-
PipeWire
(≥0.3)提供底层多媒体框架24; -
XDG Desktop Portal
及其后端(如xdg-desktop-portal-wlr
)处理权限和屏幕选择
安装依赖: -
sudo apt install xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-wlr pipewire wireplumber
-
代码实现:
-
使用
QScreenCapture
类激活捕获会话,Wayland 下无法直接通过 API 选择屏幕,需依赖 Portal 弹窗交互 -
#include <QMediaCaptureSession>
#include <QScreenCapture>
#include <QVideoWidget>QMediaCaptureSession session;
QScreenCapture screenCapture;
QVideoWidget preview;// 设置捕获目标(Wayland 下需忽略 setScreen())
session.setScreenCapture(&screenCapture);
session.setVideoOutput(&preview);
screenCapture.setActive(true); // 触发 Portal 屏幕选择向导 -
限制与注意事项:
-
屏幕选择:调用
setActive(true)
时,系统会弹出交互式窗口要求用户选择屏幕或区域 -
仅支持 FFmpeg 后端:需确保 Qt 编译时启用了 FFmpeg4;
-
实验性功能:Qt 6.5+ 支持 Wayland 捕获,但稳定性可能不足
相关阅读:
神旗视讯 -- 高性能的私有化音视频系统
神旗视讯: 从零搭建高性能信创会议系统
神旗视讯开源地址:
国内: https://gitee.com/sqmeeting
国外: https://github.com/sqmeeting