You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Linux平台下Mujoco仿真录像失效的特定窗口截图工具替代方案问询

解决Linux下MuJoCo仿真画面捕获的替代方案

我之前也碰到过MuJoCo自带录像功能罢工的情况,在Linux环境下确实得找些靠谱的窗口截图/录屏工具来替代。结合你的需求,给你几个亲测有效的方案,包括截图拼接和直接录屏的选项:

1. 优先推荐:用ffmpeg直接录屏(最省心,无需截图拼接)

其实不用麻烦截图再拼接,ffmpeg可以直接捕获指定窗口的画面,效率更高还不会丢帧。步骤如下:

安装依赖

sudo apt install ffmpeg xdotool

录屏命令

先获取MuJoCo窗口的ID,然后直接录屏:

# 获取MuJoCo窗口的第一个匹配ID(替换成你的窗口名称关键词,比如"MuJoCo")
WINDOW_ID=$(xdotool search --name "MuJoCo" | head -1)
# 获取窗口的宽高和位置信息
eval $(xdotool getwindowgeometry --shell $WINDOW_ID)
# 开始录屏,关闭鼠标显示,编码为H.264格式
ffmpeg -f x11grab -draw_mouse 0 -s ${WIDTH}x${HEIGHT} -i :0.0+${X},${Y} -c:v libx264 -crf 23 -pix_fmt yuv420p mujoco_simulation.mp4

录屏过程中按Ctrl+C停止即可,生成的视频直接可用。

2. 截图拼接方案:scrot + xdotool(轻量命令行工具)

如果一定要用截图拼接的方式,scrot是Linux下非常轻量的截图工具,配合xdotool获取窗口ID可以精准捕获目标窗口。

安装依赖

sudo apt install scrot xdotool

Python调用示例

import subprocess
import time

# 替换成你的MuJoCo窗口名称关键词
WINDOW_NAME_KEYWORD = "MuJoCo"
# 仿真帧率(比如60帧/秒,调整sleep间隔)
FRAME_RATE = 60

# 获取窗口ID
window_id = subprocess.check_output(
    ["xdotool", "search", "--name", WINDOW_NAME_KEYWORD]
).strip().decode()

# 循环截取画面
for frame_idx in range(1000):  # 替换成你需要的帧数
    # 截取指定窗口,保存为带序号的PNG图片
    subprocess.run([
        "scrot", 
        "-u", "-b",  # -u截取当前激活窗口,-b包含窗口边框(可选)
        f"mujoco_frame_{frame_idx:04d}.png",
        "--window", window_id
    ])
    time.sleep(1 / FRAME_RATE)

# 最后用ffmpeg拼接成视频
subprocess.run([
    "ffmpeg", "-r", str(FRAME_RATE),
    "-i", "mujoco_frame_%04d.png",
    "-c:v", "libx264", "-crf", "23", "-pix_fmt", "yuv420p",
    "mujoco_output.mp4"
])

3. Pythonic方案:pyautogui

pyautogui是跨平台的自动化工具,Linux下也支持窗口截图,不用额外调用命令行工具,代码更简洁。

安装依赖

sudo apt install python3-xlib
pip install pyautogui

代码示例

import pyautogui
import time

FRAME_RATE = 60
WINDOW_NAME_KEYWORD = "MuJoCo"

# 找到目标窗口
mujoco_windows = pyautogui.getWindowsWithTitle(WINDOW_NAME_KEYWORD)
if not mujoco_windows:
    print("未找到MuJoCo窗口!")
    exit()

mujoco_win = mujoco_windows[0]
mujoco_win.activate()  # 确保窗口处于激活状态

# 循环截图
for frame_idx in range(1000):
    # 截取窗口区域(左、上、宽、高)
    screenshot = pyautogui.screenshot(region=(
        mujoco_win.left, mujoco_win.top,
        mujoco_win.width, mujoco_win.height
    ))
    screenshot.save(f"mujoco_frame_{frame_idx:04d}.png")
    time.sleep(1 / FRAME_RATE)

# 拼接视频
import subprocess
subprocess.run([
    "ffmpeg", "-r", str(FRAME_RATE),
    "-i", "mujoco_frame_%04d.png",
    "-c:v", "libx264", "-crf", "23", "-pix_fmt", "yuv420p",
    "mujoco_output.mp4"
])

4. 修复你试过的mss工具

你之前用mss没成功,大概率是没指定正确的窗口区域。试试结合xdotool获取窗口的位置和大小,再用mss精准捕获:

安装依赖

sudo apt install xdotool
pip install mss

代码示例

from mss import mss
import subprocess
import time

FRAME_RATE = 60
WINDOW_NAME_KEYWORD = "MuJoCo"

# 获取窗口ID和几何信息
window_id = subprocess.check_output(
    ["xdotool", "search", "--name", WINDOW_NAME_KEYWORD]
).strip().decode()
geom_output = subprocess.check_output(
    ["xdotool", "getwindowgeometry", "--shell", window_id]
).decode().splitlines()
geom = {}
for line in geom_output:
    key, val = line.split("=")
    geom[key] = int(val)

# 设置mss的捕获区域
bbox = {
    "top": geom["Y"],
    "left": geom["X"],
    "width": geom["WIDTH"],
    "height": geom["HEIGHT"]
}

# 开始截图
with mss() as sct:
    for frame_idx in range(1000):
        img = sct.grab(bbox)
        # 保存为PNG
        mss.tools.to_png(img.rgb, img.size, output=f"mujoco_frame_{frame_idx:04d}.png")
        time.sleep(1 / FRAME_RATE)

# 拼接视频
subprocess.run([
    "ffmpeg", "-r", str(FRAME_RATE),
    "-i", "mujoco_frame_%04d.png",
    "-c:v", "libx264", "-crf", "23", "-pix_fmt", "yuv420p",
    "mujoco_output.mp4"
])

这些方案应该能解决你的问题,个人最推荐用ffmpeg直接录屏,步骤最少效果最稳定。

内容的提问来源于stack exchange,提问作者swanckel

火山引擎 最新活动