AVCaptureScreenInput和kCGWindowListOptionOnScreenBelowWindow

Geu*_*uis 6 cocoa core-graphics objective-c avfoundation

我正在使用AVCaptureScreenInput进行屏幕捕获.该应用程序有一个包含配置选项的窗口.

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

我想我发现会做什么,但我不确定它们是如何以及是否可以一起使用.

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

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

我对Objective-c比较新,如果可以将kCGWindowListOptionOnScreenBelowWindow与AVCaptureScreenInput一起使用,我也不清楚它.如果是,有人可以提供有关结果代码需要的提示吗?

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

Tho*_*ing 9

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

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

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

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

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

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