7

我正在使用 AVCaptureScreenInput 进行屏幕截图。该应用程序有一个带有配置选项的窗口。

我想记录屏幕但不记录记录器应用程序中的窗口。例如,如果您进行屏幕录制,Quicktime 会执行此操作。

我想我找到了可以做到的,但我不确定它们如何或是否可以一起使用。

kCGWindowListOptionOnScreenBelowWindow 位于 Core Graphics 框架的 CGWindow.h 中。AVCaptureScreenInput 是 AVFoundation 框架中 AVCaptureInput.h 的一部分。

如果您正在拍摄单个屏幕截图,则可以传递 kCGWindowListOptionOnScreenBelowWindow 和 windowID 以便仅捕获低于该窗口级别的窗口。如果可行,我可以通过将捕获应用程序的窗口设置为非常高的级别来实现我的目标。

我对 Objective-c 比较陌生,我不清楚是否可以将 kCGWindowListOptionOnScreenBelowWindow 与 AVCaptureScreenInput 一起使用。如果是,有人可以提供有关生成的代码需要是什么样子的提示吗?

如何在 OSX 中访问 NSWindow 的像素缓冲区?

4

1 回答 1

12

据我所知,没有办法从 OS X 的内置显示录制 API 中排除特定窗口:

  • AVFoundation 的 AVCaptureScreenInput (10.7+)
  • 核心图形 CGDisplayStream (10.8+)

当最终的屏幕输出已经合成在一起时,上述两种方法似乎都是在合成后抓取屏幕内容。
因此,排除您的录制窗口将需要您使用一个 API,该 API 允许您自己合成窗口,然后将这些自定义帧附加到 AVAssetWriterInput。

Quartz Window Services允许您通过 CGWindowListCreateImage 拍摄单个窗口的快照。Son of Grab是一个很好的示例项目,它还展示了如何将多个窗口镜头合成在一起。

检索拼接在一起的镜头后,您必须将其附加到 AVAssetWriterInput。AVFoundation 提供了一个方便的类来将自定义像素缓冲区附加到电影:AVAssetWriterInputPixelBufferAdaptor

尤其是 AVFoundation 部分可能会变得非常令人沮丧,并且您可能会遇到性能问题,因为合成很可能比 OS X 的内置合成器慢,但总的来说应该可以实现您想要的。

于 2013-08-19T11:18:06.320 回答