当前位置: 首页 > news >正文

wayland桌面录屏,屏幕录制,Linux屏幕录制

问题

使用ffmpeg录屏后,录屏的内容是黑屏,查看后发现,自己用的是gnome桌面,但是是wayland,并不是传统的X11,这就导致了不兼容问题

echo $XDG_CURRENT_DESKTOP

可以通过上面这个命令查看桌面环境
可以返回GNOME

echo $XDG_SESSION_TYPE

可以通过上面这个命令查看类型
看看是X11还是wayland

解决方式一

直接切换到X11
编辑文件: /etc/gdm3/custom.conf

sudo vim /etc/gdm3/custom.conf

#WaylandEnable=false

注释去掉:

WaylandEnable=false

保存,退出,重启:

sudo systemctl restart gdm3

执行完成后即可。

验证

echo $XDG_SESSION_TYPE

这种方式切换后,可以使用ffmpeg进行录屏,比较通用,但是我的改过来之后,有bug,移动鼠标的时候会严重掉帧卡顿,找不到原因,所以只能接着用Wayland

解决方式二

硬着头皮用wayland
经过多种录屏软件验证,发现晚上说的一些obs,等等软件并不能在自己的系统上用,可能是系统原因,所以,经过一天时间的(血泪史)研究发现,可以使用系统自带的录屏工具

按下printscreen按键,可以选择录屏,发现这种方式是成功的

但是我是希望通过命令行去调用执行的

所以

得用脚本调用控制开始录屏和结束录屏

so

通过监听进程,找到了他调用的软件
附代码

from flask import Flask, jsonify
import dbus
import threading

app = Flask(__name__)

# 连接到 D-Bus 会话总线
session_bus = dbus.SessionBus()

# 记录录制状态
is_recording = False

# 开始录制的功能
def start_screencast():
    global is_recording
    try:
        session_bus.call_blocking(
            'org.gnome.Shell.Screencast',
            '/org/gnome/Shell/Screencast',
            'org.gnome.Shell.Screencast',
            'Screencast',
            signature='sa{sv}',
            args=["Screencast_%d_%t.webm", {'draw-cursor': True, 'framerate': 35}],
        )
        is_recording = True
        print("Screen recording started.")
    except dbus.DBusException as e:
        print(f"Failed to start recording: {e}")

# 停止录制的功能
def stop_screencast():
    global is_recording
    try:
        session_bus.call_blocking(
            'org.gnome.Shell.Screencast',
            '/org/gnome/Shell/Screencast',
            'org.gnome.Shell.Screencast',
            'StopScreencast',
            signature='',
            args=[],
        )
        is_recording = False
        print("Screen recording stopped.")
    except dbus.DBusException as e:
        print(f"Failed to stop recording: {e}")

# Flask 路由处理:启动录制
@app.route('/start', methods=['GET'])
def start_recording():
    global is_recording
    if not is_recording:
        # 在独立线程中启动录制,防止阻塞 Flask 主线程
        threading.Thread(target=start_screencast).start()
        return jsonify({"message": "Recording started!"}), 200
    else:
        return jsonify({"message": "Recording is already running."}), 400

# Flask 路由处理:停止录制
@app.route('/stop', methods=['GET'])
def stop_recording():
    global is_recording
    if is_recording:
        stop_screencast()
        return jsonify({"message": "Recording stopped!"}), 200
    else:
        return jsonify({"message": "No recording in progress."}), 400

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=5000)

太抽象了
太抽象了
卡了一天

|
|
|
伤心
|
|
|
在这里插入图片描述

相关文章:

  • (功能测试)第五章 APP性能测试 常用的APP命令格式 补充与总结
  • React + TypeScript 数据血缘分析实战
  • DeepSeek R1 部署笔记(个人无框架部署,缓慢更新中)
  • Spring AOP 切面打印日志完整版
  • ubuntu离线安装Ollama并部署Llama3.1 70B INT4并对外发布服务
  • 鲲鹏麒麟离线安装Docker
  • 定义数组存储3部汽车对象(class2:类在class1中请看上一篇博客)
  • Everything in Python is an object. What does that mean?
  • 分类算法——逻辑回归 详解
  • 软件工程复试专业课-能力成熟度模型CMM
  • 幂等性 如何通过设计避免重复操作的影响
  • Springboot统一功能处理
  • [VMware]卸载VMware虚拟机和Linux系统ubuntu(自记录版)
  • NTS库学习,找bug中......
  • docker高级
  • AI agent(以AutoGPT为例)和AI Workflow 区别
  • 【PyTorch】2024保姆级安装教程-Python-(CPU+GPU详细完整版)-
  • leetcode刷题-动态规划08
  • MYSQL数据备份与恢复(mysqldump)
  • 青少年编程与数学 02-010 C++程序设计基础 11课题、程序结构
  • 网站的论文怎么写/排名优化seo公司
  • 多个wordpress管理系统/百度seo培训
  • web网站建设报价/广州商务网站建设
  • 网站建设与制作全套视频教程/2024年4月新冠疫情结束了吗
  • 做网站一般多少钱/线上营销活动方案
  • bootstrap微网站模板下载/百度搜索量查询