2016-10-21 3 views
1

アップルのドキュメントはAVAssetにCIFilterを適用するため、この例を与えるGPUココアにCIFilterの適用:(はるかにパフォーマンスのAACコーデックを使用したものとなるように思われる)

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) 
}) 

これは、いくつかのビデオで素晴らしい作品と他の人はCPU使用率が高くなり、ビデオは処理を終了しません。これをGPU上に移して、CPUの多くを結びつけないようにする方法はありますか? iOS用のthis questionを見ましたが、CIContext contextWithEAGLContext:はOS Xでは使用できません。私はAVFoundation/video処理を初めて使用しています。OS Xに相当するものはありますか?

注:リアルタイムでこれを行うつもりはないので、フィルタを適用し、GPUを使用してファイルをファイルシステムにエクスポートするだけです。

答えて

1

MacOSのではなく、OpenGLのためのcontextWithCGLContextあります。ご希望の場合は

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

や金属のためcontextWithMTLDevice:をその:

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