如何使用Swift实时过滤video
是可以应用filter到AVLayer并添加它作为addSublayer 查看 ? 我想改变颜色,并添加一些噪音的相机使用斯威夫特video,我不知道如何。
我想,可以像这样添加filterLayer和previewLayer :
self.view.layer.addSublayer(previewLayer) self.view.layer.addSublayer(filterLayer)
这也许可以用我的自定义filter创buildvideo,但我认为,这可能会更有效地使用AVComposition
所以我需要知道:
- 将滤镜应用于相机video输出的最简单方法是什么?
- 是否可以合并AVCaptureVideoPreviewLayer和CALayer ?
感谢您的每一个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回购这个项目的源代码 。