Захват определенного окна в виртуальной камере на основе CoreMediaIO в Swift
Я пытаюсь понять один из образцов виртуальной камеры на основе CoreMediaIO, приведенных на https://github.com/seanchas116/SimpleDALPlugin
В настоящее время эта камера отображает анимированное движущееся изображение. соответствующий код для этого
private func createPixelBuffer() -> CVPixelBuffer? {
let pixelBuffer = CVPixelBuffer.create(size: CGSize(width: width, height: height))
pixelBuffer?.modifyWithContext { [width, height] context in
let time = Double(mach_absolute_time()) / Double(1000_000_000)
let pos = CGFloat(time - floor(time))
context.setFillColor(CGColor(red: 1, green: 1, blue: 1, alpha: 1))
context.fill(CGRect(x: 0, y: 0, width: width, height: height))
context.setFillColor(CGColor(red: 0, green: 1, blue: 0, alpha: 1))
context.fill(CGRect(x: pos * CGFloat(width), y: 310, width: 100, height: 100))
}
return pixelBuffer
}
create
а также
modifyWithContext
определены здесь
import Foundation
extension CVPixelBuffer {
static func create(size: CGSize) -> CVPixelBuffer? {
var pixelBuffer: CVPixelBuffer?
let options = [
kCVPixelBufferCGImageCompatibilityKey as String: true,
kCVPixelBufferCGBitmapContextCompatibilityKey as String: true,
] as [String: Any]
let error = CVPixelBufferCreate(
kCFAllocatorSystemDefault,
Int(size.width),
Int(size.height),
kCVPixelFormatType_32ARGB,
options as CFDictionary,
&pixelBuffer)
guard error == noErr else {
log("CVPixelBufferCreate error: \(error)")
return nil
}
return pixelBuffer
}
var width: Int {
return CVPixelBufferGetWidth(self)
}
var height: Int {
return CVPixelBufferGetHeight(self)
}
func modifyWithContext(callback: (CGContext) -> Void) {
CVPixelBufferLockBaseAddress(self, CVPixelBufferLockFlags(rawValue: 0))
let data = CVPixelBufferGetBaseAddress(self)
let colorSpace = CGColorSpaceCreateDeviceRGB();
let bytesPerRow = CVPixelBufferGetBytesPerRow(self)
let context = CGContext(
data: data,
width: width, height: height, bitsPerComponent: 8,
bytesPerRow: bytesPerRow,
space: colorSpace,
bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue | CGBitmapInfo.byteOrder32Big.rawValue)
if let context = context {
callback(context)
}
CVPixelBufferUnlockBaseAddress(self, CVPixelBufferLockFlags(rawValue: 0))
}
}
Как я могу обновить этот код для вывода захвата окна любого конкретного окна, такого как Chrome или терминал и т. Д.?