如何使用Swift实时过滤video

是可以应用filter到AVLayer并添加它作为addSublayer 查看 ? 我想改变颜色,并添加一些噪音的相机使用斯威夫特video,我不知道如何。

我想,可以像这样添加filterLayerpreviewLayer

self.view.layer.addSublayer(previewLayer) self.view.layer.addSublayer(filterLayer) 

这也许可以用我的自定义filter创buildvideo,但我认为,这可能会更有效地使用AVComposition

所以我需要知道:

  1. 将滤镜应用于相机video输出的最简单方法是什么?
  2. 是否可以合并AVCaptureVideoPreviewLayerCALayer

感谢您的每一个build议..

还有另一种方法,使用AVCaptureSession来创buildCIImage的实例,您可以应用CIFilter(其中有负载,从模糊到颜色校正到VFX)。

这是一个使用ComicBook效果的例子。 简而言之,创build一个AVCaptureSession:

 let captureSession = AVCaptureSession() captureSession.sessionPreset = AVCaptureSessionPresetPhoto 

创build一个AVCaptureDevice来表示相机,在这里我设置了后置摄像头:

 let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

然后创build设备的具体实现并将其附加到会话。 在Swift 2中,实例化AVCaptureDeviceInput会抛出一个错误,所以我们需要知道:

  do { let input = try AVCaptureDeviceInput(device: backCamera) captureSession.addInput(input) } catch { print("can't access camera") return } 

现在,这里有一个小问题:虽然我们实际上并没有使用AVCaptureVideoPreviewLayer,但它需要让示例委托起作用,所以我们创build其中一个:

 // although we don't use this, it's required to get captureOutput invoked let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) view.layer.addSublayer(previewLayer) 

接下来,我们创build一个video输出AVCaptureVideoDataOutput,我们将使用它来访问video源:

 let videoOutput = AVCaptureVideoDataOutput() 

确保自我实现AVCaptureVideoDataOutputSampleBufferDelegate,我们可以在video输出上设置采样缓冲区委托:

  videoOutput.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL)) 

video输出然后附加到捕获会话:

  captureSession.addOutput(videoOutput) 

…最后,我们开始捕捉会话:

 captureSession.startRunning() 

因为我们已经设置了委托,captureOutput将在每个帧捕获时被调用。 captureOutput传递了一个types为CMSampleBuffer的示例缓冲区,它只需要两行代码将该数据转换为CIImage以供Core Image处理:

 let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!) 

…并且图像数据被传递给我们的漫画书效果,该效果反过来被用来填充图像视图:

 let comicEffect = CIFilter(name: "CIComicEffect") comicEffect!.setValue(cameraImage, forKey: kCIInputImageKey) let filteredImage = UIImage(CIImage: comicEffect!.valueForKey(kCIOutputImageKey) as! CIImage!) dispatch_async(dispatch_get_main_queue()) { self.imageView.image = filteredImage } 

我在这里有我的GitHub回购这个项目的源代码 。