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

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)

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

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


http://www.kler.cn/a/564720.html

相关文章:

  • leetcode 3008. 找出数组中的美丽下标 II
  • CentOS停服后的替代选择:openEuler、Rocky Linux及其他系统的未来展望
  • 【芯片设计】NPU芯片前端设计工程师面试记录·20250227
  • Qt关于平滑滚动的使用QScroller及QScrollerProperties类说明
  • vue3表单验证的时候访问接口如果有值就通过否则不通过.主动去触发校验
  • Expert Domain-Driven Design (DDD) Implementation in .NET 2024-10
  • 一键部署Ollama deepSeek:科技赋能,轻松上手
  • RAGFlow基础操作手册
  • Linux Kernel Connection Tracking Table
  • 前端开发--node.js
  • LE AUDIO广播学习笔记之BASE
  • vim临时文件泄露
  • 第四届工程管理与信息科学国际学术会议 (EMIS 2025)
  • ​Vue3 常用指令、属性、方法速查表
  • 【Oracle专栏】Oracle 之 回收站
  • 保护密码等敏感信息的几个常用方法
  • 如何制作安装包打包软件
  • 千峰React:Hooks(上)
  • 【Linux】线程详解
  • 文件操作 -- IO [Java EE 初阶]