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

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

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

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

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

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

How to access the pixel buffer of an NSWindow in OSX?

最佳答案

据我所知,无法从 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 的内置合成器慢,但总的来说应该可以实现您想要的。

    10-06 02:39