Swift iOS实时对视频应用过滤器?

Swift iOS实时对视频应用过滤器?,ios,swift,avfoundation,calayer,core-image,Ios,Swift,Avfoundation,Calayer,Core Image,我正在尝试对视频实时应用过滤器,但是当我点击按钮转换CALayer时,没有应用任何更改;这很奇怪,因为过滤器是通过的,但在屏幕上不可见。下面是我用来表示声明的UIView的子类 //AVCamPreview Class import Foundation import UIKit import AVFoundation class AVCamPreviewView: UIView { var session: AVCaptureSession? { get {

我正在尝试对视频实时应用过滤器,但是当我点击按钮转换CALayer时,没有应用任何更改;这很奇怪,因为过滤器是通过的,但在屏幕上不可见。下面是我用来表示声明的UIView的子类

//AVCamPreview Class
import Foundation
import UIKit
import AVFoundation


class AVCamPreviewView: UIView {


var session: AVCaptureSession? {
    get {

        return (self.layer as! AVCaptureVideoPreviewLayer).session
    }
    set (session) {

        (self.layer as! AVCaptureVideoPreviewLayer).session = session
    }
}

override class func layerClass() -> AnyClass {


    return AVCaptureVideoPreviewLayer.self
}
 }




  //CameraViewController
 //Properties

   lazy var context: CIContext = {
    let eaglContext = EAGLContext(API: EAGLRenderingAPI.OpenGLES2)
    let options = [kCIContextWorkingColorSpace : NSNull()]
    return CIContext(EAGLContext: eaglContext, options: options)
}()
lazy var filterNames: [String] = {
    return ["#nofilter","CIPhotoEffectNoir","CIPhotoEffectProcess"]
}()

//Apply Filter func
 @IBAction func applyFilter(_sender: UIButton) {
    let filterName = filterNames[_sender.tag]
    filter = CIFilter(name: filterName)
    self.filterButtonsContainer.center.x =  self.filterButtonsContainer.center.x - self.view.frame.width
}

 // MARK: - AVCaptureVideoDataOutputSampleBufferDelegate
func captureOutput(captureOutput: AVCaptureOutput!,didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,fromConnection connection: AVCaptureConnection!) {
    autoreleasepool {
        let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!

        let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer)!
        self.currentVideoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription)
        self.currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer)

        var outputImage = CIImage(CVPixelBuffer: imageBuffer)

        if self.filter != nil {

            self.filter.setValue(outputImage, forKey: kCIInputImageKey)
            outputImage = self.filter.outputImage!


        }


        if self.isWriting {
            if self.assetWriterPixelBufferInput?.assetWriterInput.readyForMoreMediaData == true {
                var newPixelBuffer: CVPixelBuffer? = nil

                CVPixelBufferPoolCreatePixelBuffer(nil, self.assetWriterPixelBufferInput!.pixelBufferPool!, &newPixelBuffer)

                self.context.render(outputImage, toCVPixelBuffer: newPixelBuffer!, bounds: outputImage.extent, colorSpace: nil)

                let success = self.assetWriterPixelBufferInput?.appendPixelBuffer(newPixelBuffer!, withPresentationTime: self.currentSampleTime!)

                if success == false {
                    print("Pixel Buffer failed")
                }
            }
        }

        let orientation = UIDevice.currentDevice().orientation
        var t: CGAffineTransform!
        if orientation == UIDeviceOrientation.Portrait {
            t = CGAffineTransformMakeRotation(CGFloat(-M_PI / 2.0))
        } else if orientation == UIDeviceOrientation.PortraitUpsideDown {
            t = CGAffineTransformMakeRotation(CGFloat(M_PI / 2.0))
        } else if (orientation == UIDeviceOrientation.LandscapeRight) {
            t = CGAffineTransformMakeRotation(CGFloat(M_PI))
        } else {
            t = CGAffineTransformMakeRotation(0)
        }
        outputImage = outputImage.imageByApplyingTransform(t)

        let cgImage = self.context.createCGImage(outputImage, fromRect: outputImage.extent)

        self.ciImage = outputImage

        dispatch_sync(dispatch_get_main_queue(), {


           (self.previewView.layer as! AVCaptureVideoPreviewLayer).contents = cgImage


        })
    }
}

在该项目中,CIImage使用CIContext在OpenGLView上绘制,效果良好。还可以写入照片库


在该项目中,CIImage使用CIContext在OpenGLView上绘制,效果良好。还有写入照片库的可能性

我想AVCaptureVideoPreviewLayer仅用于显示原始AVCaptureSession数据和设置。此处的内容不起作用。由于您正在创建一个CGImageRef,您可以在一个简单的UIImageView上使用它。我认为AVCaptureVideoPreviewLayer的可能副本仅用于显示原始AVCaptureSession数据和设置。此处的内容不起作用。由于您正在创建CGImageRef,因此可以在简单的UIImageView上使用它