[英]Swift iOS apply filter to video in real-time?
我正在尝试将滤镜实时应用于视频,但是当我点按按钮来转换CALayer时,不会应用任何更改; 这是好奇的,因为过滤器通过,但在屏幕上不可见。 这是我用来呈现AVOutput的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
})
}
}
https://github.com/jabson/MagicVideo
在项目过滤CIImage使用CIContext绘制OpenGLView,它工作正常。 写照片库也有写作的可能性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.