搜索
您的当前位置:首页正文

实时拍摄美颜滤镜组GPUImageVideoCamera

来源:知库网

步骤: 创建GPUImageVideoCamera --> 设置相机方向 --> 创建预览图层GPUImageView --> 初始化一些滤镜 --> 获取滤镜组并添加滤镜(滤镜1添加滤镜2,滤镜2添加滤镜3) --> 设置滤镜组[最初的滤镜]--> 设置滤镜组的终端滤镜 --> 摄像机中添加滤镜组 --> 滤镜组中添加预览图层 --> 初始化写入对象GPUImageMovieWriter --> 设置GPUImageMovieWriter的是否对视频进行编码(true) --> 滤镜组中添加GPUImageMovieWriter写入对象 --> 设置摄像camera机代理 --> 设置摄像机camera的音频编码目的为GPUImageMovieWriter --> 开始采集视频 --> 开始写入

没有修改源码,Swift3.2

import UIKit
import GPUImage
import AVKit

class ViewController: UIViewController {
    @IBOutlet weak var beautyViewBottomCons: NSLayoutConstraint!
    
    // MARK: 懒加载属性
    // 创建视频源
    fileprivate lazy var camera : GPUImageVideoCamera? = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPresetHigh, cameraPosition: .front)
    
    // 创建预览图层
    fileprivate lazy var preview : GPUImageView = GPUImageView(frame: self.view.bounds)
    
    // 初始化滤镜
    let bilateralFilter = GPUImageBilateralFilter() // 磨皮
    let exposureFilter = GPUImageExposureFilter() // 曝光
    let brightnessFilter = GPUImageBrightnessFilter() // 美白
    let satureationFilter = GPUImageSaturationFilter() // 饱和
    
    // 创建写入对象
    fileprivate lazy var movieWriter : GPUImageMovieWriter = { [unowned self] in
        // 创建写入对象
        let writer = GPUImageMovieWriter(movieURL: self.fileURL, size: self.view.bounds.size)
        
        // 设置写入对象的属性
        
        return writer!
    }()
    
    // MARK: 计算属性
    var fileURL : URL {
        return URL(fileURLWithPath: "\(NSTemporaryDirectory())123.mp4")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print(fileURL)
        
        // 1.设置camera方向
        camera?.outputImageOrientation = .portrait
        camera?.horizontallyMirrorFrontFacingCamera = true
        
        // 2.创建预览的View
        view.insertSubview(preview, at: 0)
        
        // 3.获取滤镜组
        let filterGroup = getGroupFilters()
        
        // 4.设置GPUImage的响应链
        camera?.addTarget(filterGroup)
        filterGroup.addTarget(preview)
        
        // 5.开始采集视频
        camera?.startCapture()
        
        // 6.设置writer的属性
        // 是否对视频进行编码
        movieWriter.encodingLiveVideo = true
        
        // 将writer设置成滤镜的target
        filterGroup.addTarget(movieWriter)
        
        // 设置camera的编码
        camera?.delegate = self
        camera?.audioEncodingTarget = movieWriter
        
        movieWriter.startRecording()
    }
    
    
    fileprivate func getGroupFilters() -> GPUImageFilterGroup {
        // 1.创建滤镜组(用于存放各种滤镜:美白、磨皮等等)
        let filterGroup = GPUImageFilterGroup()
        
        // 2.创建滤镜(设置滤镜的引来关系)
        bilateralFilter.addTarget(brightnessFilter)
        brightnessFilter.addTarget(exposureFilter)
        exposureFilter.addTarget(satureationFilter)
        
        // 3.设置滤镜组链初始&终点的filter
        filterGroup.initialFilters = [bilateralFilter]
        filterGroup.terminalFilter = satureationFilter
        
        return filterGroup
    }
}


// MARK:- 控制方法
extension ViewController {
    @IBAction func rotateCamera() {
        camera?.rotateCamera()
    }
    
    @IBAction func adjustBeautyEffect() {
        adjustBeautyView(constant: 0)
    }
    
    @IBAction func finishedBeautyEffect() {
        adjustBeautyView(constant: -250)
    }
    
    @IBAction func switchBeautyEffect(switchBtn : UISwitch) {
        if switchBtn.isOn {
            camera?.removeAllTargets()
            let group = getGroupFilters()
            camera?.addTarget(group)
            group.addTarget(preview)
        } else {
            camera?.removeAllTargets()
            camera?.addTarget(preview)
        }
    }
    
    private func adjustBeautyView(constant : CGFloat) {
        beautyViewBottomCons.constant = constant
        UIView.animate(withDuration: 0.5) {
            self.view.layoutIfNeeded()
        }
    }
    
    @IBAction func changeSatureation(_ sender: UISlider) {
        satureationFilter.saturation = CGFloat(sender.value * 2)
    }
    
    @IBAction func changeBrightness(_ sender: UISlider) {
        // - 1 --> 1
        brightnessFilter.brightness = CGFloat(sender.value) * 2 - 1
    }
    
    @IBAction func changeExposure(_ sender: UISlider) {
        // - 10 ~ 10
        exposureFilter.exposure = CGFloat(sender.value) * 20 - 10
    }
    
    @IBAction func changeBilateral(_ sender: UISlider) {
        bilateralFilter.distanceNormalizationFactor = CGFloat(sender.value) * 8
    }
}

extension ViewController : GPUImageVideoCameraDelegate {
    func willOutputSampleBuffer(_ sampleBuffer: CMSampleBuffer!) {
        print("采集到画面")
    }
}

extension ViewController {
    @IBAction func stopRecording() {
        camera?.stopCapture()
        preview.removeFromSuperview()
        movieWriter.finishRecording()
    }
    
    @IBAction func playVideo() {
        print(fileURL)
        let playerVc = AVPlayerViewController()
        playerVc.player = AVPlayer(url: fileURL)
        present(playerVc, animated: true, completion: nil)
    }
}

Top