CGDisplayStream 只捕捉单帧

CGDisplayStream only capturing a single frame

我终于开始第一次玩 Swift(和 macOS 开发)。我正在尝试编写一个简单的屏幕捕获应用程序来开始。我已经查看并成功地使用 AVFoundation APIs 来执行此操作(AVCaptureSessionAVCaptureScreenInput 等)。但现在我想尝试降低一点并使用更接近金属的 CGDisplayStream API.

不幸的是,我只能让它捕获一帧。我怀疑我可能遗漏了一些关于主 Runloop 和我传入的 DispatchQueue 之间潜在交互的信息?不太清楚这些东西是否首先相互作用。

这是我的问题的一个小复制:

import Foundation
import AVFoundation
import CoreGraphics

let mainDisplay    = CGMainDisplayID()
let displayBounds  = CGDisplayBounds(mainDisplay)
let recordingQueue = DispatchQueue.global(qos: .background)

let displayStreamProps : [CFString : Any] = [
  CGDisplayStream.preserveAspectRatio: kCFBooleanTrue,
  CGDisplayStream.showCursor:          kCFBooleanTrue,
  CGDisplayStream.minimumFrameTime:    60,
]

let displayStream = CGDisplayStream(
  dispatchQueueDisplay: mainDisplay,
  outputWidth:          Int(displayBounds.width),
  outputHeight:         Int(displayBounds.height),
  pixelFormat:          Int32(kCVPixelFormatType_32BGRA),
  properties:           displayStreamProps as CFDictionary,
  queue:                recordingQueue,

  handler: { status, displayTime, frameSurface, updateRef in
    print("is only called once")
  }
)

func quit(_ : Int32) {
  displayStream?.stop()
}

signal(SIGINT, quit)

displayStream?.start()

RunLoop.current.run()

任何帮助将不胜感激!!

删除此行似乎可以解决问题:

CGDisplayStream.minimumFrameTime:    60,

文档没有提及此 "time" 字段的单位是什么,但它似乎以秒为单位。因此,您可以将其更改为 1.0/60.0 以进行 60fps 捕获。