在 GPU 上应用 CIFilter Cocoa

Applying CIFilter on the GPU Cocoa

Apple 文档给出了将 CIFilter 应用于 AVAsset 的示例:

let filter = CIFilter(name: "CIGaussianBlur")!
let composition = AVVideoComposition(asset: asset, applyingCIFiltersWithHandler: { request in

   // Clamp to avoid blurring transparent pixels at the image edges
   let source = request.sourceImage.clampingToExtent()
   filter.setValue(source, forKey: kCIInputImageKey)

   // Vary filter parameters based on video timing
   let seconds = CMTimeGetSeconds(request.compositionTime)
   filter.setValue(seconds * 10.0, forKey: kCIInputRadiusKey)

   // Crop the blurred output to the bounds of the original image
  let output = filter.outputImage!.cropping(to: request.sourceImage.extent)

   // Provide the filter output to the composition
   request.finish(with: output, context: nil)
})

这在某些视频上效果很好(使用 AAC 编解码器的视频似乎性能更高),而在其他视频上 CPU 使用率激增,视频从未完成处理。有没有办法将其移动到 GPU 上以加快 up/not 占用这么多 CPU 的速度?我看到 this question 用于 iOS 但 CIContext contextWithEAGLContext: 在 OS X 上不可用。我是 AVFoundation/video 处理的新手,[=25 上是否有等效项=] X?

注意:我不想实时执行此操作,我只是想应用过滤器并使用 GPU 将文件导出到文件系统。

macOS 改为 contextWithCGLContext 用于 OpenGL:

+ (CIContext *)contextWithCGLContext:(CGLContextObj)cglctx
                         pixelFormat:(nullable CGLPixelFormatObj)pixelFormat
                          colorSpace:(nullable CGColorSpaceRef)colorSpace
                             options:(nullable NSDictionary<NSString*,id> *)options;

contextWithMTLDevice: 金属,如果你喜欢的话:

+ (CIContext *)contextWithMTLDevice:(id<MTLDevice>)device;