我只想使用Imagemagick或Ffmpeg捕获特定的窗口,但我听说Mac上不支持所需的x11 id。
其目的是捕获应用程序窗口,以便显示所有区域,即使某些区域超出显示范围且不可见。
发布于 2022-11-05 07:43:29
通常,macOS上的应用程序使用原生Cocoa框架来生成他们的GUI,而不是X11。我将写我的答案,以解决每一种可能性的术语,将两者用一条水平线隔开。
用X11
您可以在X11 macOS上安装名为XQuartz的homebrew
服务器:
brew cask install xquartz
但是,只有写入X11接口的应用程序才能创建XQuartz窗口,并且可以以X11的方式捕获这些窗口,使用xwininfo
并将id
传递给X11。然而,很少有应用程序使用X11。
让我们用一个例子快速地展示一下:
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:
osascript -e 'tell app "Terminal" to id of window 1'
然后,您可以在screencapture
命令中使用该id,该命令随macOS提供,希望能够对您正在使用的任何应用程序执行您想要的操作。例如:
/usr/sbin/screencapture -l <WINDOWID> image.png
用“ffmpeg”
在AVFoundation macOS上,ffmpeg
在封面下使用,因此首先需要获得AVFoundation分配给屏幕的索引,如下所示:
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
命令是:
ffmpeg -r 30 -f avfoundation -i "1:none" ...
现在,您想记录一个特定的窗口,但是ffmpeg
不知道窗口,它只知道坐标,所以我们需要找到窗口的坐标。想象一下,我想记录Safari主窗口,首先我用以下方法获得它的位置:
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
记录一下:
ffmpeg -y -r 30 -f avfoundation -i "1:none" -vf "crop=1290:538:87:43" screen.mp4
它看起来很管用,但不管用!很明显,没有原子,ffplay
也不能在没有原子的情况下玩东西。事实证明,原子被写在视频的末尾--除非你控制--从它们中取出C。因此,现在可以通过添加5秒的持续时间来确保不需要控制-C:
ffmpeg -y -r 30 -f avfoundation -i "1:none" -t 5 -vf "crop=1290:538:87:43" screen.mp4
这似乎也有效,但实际上也不起作用。您可以使用ffplay
,但不能使用苹果的QuickTime,后者只喜欢yuv420p
格式,因此您实际上可以用它来做您想做的事情:
ffmpeg -y -r 30 -f avfoundation -i "1:none" -t 5 -vf "crop=1290:538:87:43,format=yuv420p" screen.mp4
https://stackoverflow.com/questions/74325476
复制相似问题