首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法截取Mac上特定窗口的截图?

有没有办法截取Mac上特定窗口的截图?
EN

Stack Overflow用户
提问于 2022-11-05 05:59:16
回答 1查看 52关注 0票数 1

我只想使用Imagemagick或Ffmpeg捕获特定的窗口,但我听说Mac上不支持所需的x11 id。

其目的是捕获应用程序窗口,以便显示所有区域,即使某些区域超出显示范围且不可见。

EN

Stack Overflow用户

回答已采纳

发布于 2022-11-05 07:43:29

通常,macOS上的应用程序使用原生Cocoa框架来生成他们的GUI,而不是X11。我将写我的答案,以解决每一种可能性的术语,将两者用一条水平线隔开。

用X11

您可以在X11 macOS上安装名为XQuartzhomebrew服务器:

代码语言:javascript
运行
复制
brew cask install xquartz

但是,只有写入X11接口的应用程序才能创建XQuartz窗口,并且可以以X11的方式捕获这些窗口,使用xwininfo并将id传递给X11。然而,很少有应用程序使用X11。

让我们用一个例子快速地展示一下:

代码语言:javascript
运行
复制
xeyes &                # start "xeyes" which is an X11 app and get our prompt back
xwininfo -name xeyes   # so we can get its id

...
...
xwininfo: Window id: 0xa0000a "xeyes"
...
...

# Tell ImageMagick to grab the "xeyes: window by its id and save as "xeyes.png"
magick import -window 0xa0000a xeyes.png

另一个问题是的自制版本的ImageMagick不支持X11.因此,您必须要么编辑自制的公式,要么自己运行./configure并包含X11支持--这是非常重要的。

带有天然的macOS Cocoa和“screencapture”

如果应用程序使用原生Cocoa接口,则可以使用我共享的here脚本获取其"Cocoa id“。稍微简单一点,您可以运行一些AppleScript来获取窗口id,例如获取属于终端应用程序的窗口id:

代码语言:javascript
运行
复制
osascript -e 'tell app "Terminal" to id of window 1'

然后,您可以在screencapture命令中使用该id,该命令随macOS提供,希望能够对您正在使用的任何应用程序执行您想要的操作。例如:

代码语言:javascript
运行
复制
/usr/sbin/screencapture -l <WINDOWID> image.png

用“ffmpeg”

AVFoundation macOS上,ffmpeg在封面下使用,因此首先需要获得AVFoundation分配给屏幕的索引,如下所示:

代码语言:javascript
运行
复制
ffmpeg -hide_banner -f avfoundation -list_devices true -i ""

[AVFoundation indev @ 0x131e05df0] AVFoundation video devices:
[AVFoundation indev @ 0x131e05df0] [0] FaceTime HD Camera
[AVFoundation indev @ 0x131e05df0] [1] Capture screen 0        <-- THIS LINE
[AVFoundation indev @ 0x131e05df0] AVFoundation audio devices:
[AVFoundation indev @ 0x131e05df0] [0] MacBook Pro Microphone

查看上面的清单,您可以看到,如果我想记录屏幕,就必须使用设备[1]。由于我不想录制声音,所以我使用none作为声音通道,所以在我的Mac上30 for记录屏幕的基本ffmpeg命令是:

代码语言:javascript
运行
复制
ffmpeg -r 30 -f avfoundation -i "1:none" ...

现在,您想记录一个特定的窗口,但是ffmpeg不知道窗口,它只知道坐标,所以我们需要找到窗口的坐标。想象一下,我想记录Safari主窗口,首先我用以下方法获得它的位置:

代码语言:javascript
运行
复制
osascript -e 'tell application "Safari" to get the bounds of the front window'
87, 43, 1290, 538     # top-left x, top-left y, width, height

现在我让ffmpeg记录一下:

代码语言:javascript
运行
复制
ffmpeg -y -r 30 -f avfoundation -i "1:none" -vf "crop=1290:538:87:43" screen.mp4

它看起来很管用,但不管用!很明显,没有原子,ffplay也不能在没有原子的情况下玩东西。事实证明,原子被写在视频的末尾--除非你控制--从它们中取出C。因此,现在可以通过添加5秒的持续时间来确保不需要控制-C:

代码语言:javascript
运行
复制
ffmpeg -y -r 30 -f avfoundation -i "1:none" -t 5 -vf "crop=1290:538:87:43" screen.mp4

这似乎也有效,但实际上也不起作用。您可以使用ffplay,但不能使用苹果的QuickTime,后者只喜欢yuv420p格式,因此您实际上可以用它来做您想做的事情:

代码语言:javascript
运行
复制
ffmpeg -y -r 30 -f avfoundation -i "1:none" -t 5 -vf "crop=1290:538:87:43,format=yuv420p" screen.mp4
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74325476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档