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

发布于:2025-03-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

问题

使用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)

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

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