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)
太抽象了
太抽象了
卡了一天
|
|
|
伤心
|
|
|