CGDisplayStream 只捕捉单帧
CGDisplayStream only capturing a single frame
我终于开始第一次玩 Swift(和 macOS 开发)。我正在尝试编写一个简单的屏幕捕获应用程序来开始。我已经查看并成功地使用 AVFoundation APIs 来执行此操作(AVCaptureSession
、AVCaptureScreenInput
等)。但现在我想尝试降低一点并使用更接近金属的 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 捕获。
我终于开始第一次玩 Swift(和 macOS 开发)。我正在尝试编写一个简单的屏幕捕获应用程序来开始。我已经查看并成功地使用 AVFoundation APIs 来执行此操作(AVCaptureSession
、AVCaptureScreenInput
等)。但现在我想尝试降低一点并使用更接近金属的 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 捕获。