iOS直播(三)GPUImage音视频采集并写入文件

本文介绍如何使用GPUImage库实现视频美颜效果,包括磨皮、美白、曝光和饱和度调整,以及如何录制并保存视频至本地沙盒。通过链式滤镜处理和GPUImageMovieWriter,实现高效视频录制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇介绍了用GPUImage图像处理库进行图像采集,从而避免了直接使用AVFoundation(AVKit)时繁琐的代码,同时不用熟悉OpenGL ES也可以快速地对图像进行美颜、添加滤镜等。这一篇介绍如果使用多个滤镜以及录制视频,并保存到本地沙盒中。

本文默认你已经按照上一篇中介绍的集成了GPUImage库。
1.声明必要的全局变量

   fileprivate lazy var camera : GPUImageVideoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSession.Preset.high.rawValue, cameraPosition: .back)
    
    //实时显示画面的预览图层
    fileprivate lazy var showView = GPUImageView(frame: 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!
    }()
    
    //视频沙盒地址
    fileprivate lazy var fileURL : URL = {
        [unowned self] in
        return URL(fileURLWithPath: "\(NSTemporaryDirectory())movie\(arc4random()).mp4")
    }()

2.在viewDidLoad中初始化配置,并开始采集和录制

override func viewDidLoad() {
        super.viewDidLoad()
        //设置摄像头方向为垂直
        camera.outputImageOrientation = .portrait
        //使用前值摄像头
        camera.horizontallyMirrorFrontFacingCamera = true

        //加入预览图层
        view.insertSubview(showView, at: 0)
        
        //获取滤镜组
        let filterGroup = getGroupFilters()
        //设置GUPImage的响应链
        camera.addTarget(filterGroup)
        filterGroup.addTarget(showView)

        //开始采集
        camera.startCapture()
        
        //配置写入文件
        movieWriter.encodingLiveVideo = true
        filterGroup.addTarget(movieWriter)
        camera.delegate = self;
        camera.audioEncodingTarget = movieWriter
        movieWriter.startRecording()
    }

3.上一步中的getGroupFilters方法,是将多个滤镜效果叠加。GPUImage采用链式方法来处理画面,通过addTarget方法添加对象到链中,处理完一个target,再把上一个环节处理好的图像数据传递到下一个target处理,成为GPUImage处理链。

fileprivate func getGroupFilters() -> GPUImageFilterGroup {
        //创建滤镜组
        let filterGroup = GPUImageFilterGroup()
        
        //设置滤镜关系链
        bilateralFilter.addTarget(brightnessFilter)
        brightnessFilter.addTarget(exposureFilter)
        exposureFilter.addTarget(satureationFilter)
        
        //设置滤镜组初始、终点filter
        filterGroup.initialFilters = [bilateralFilter]
        filterGroup.terminalFilter = satureationFilter
        
        return filterGroup
    }

4.我们在界面上添加一个按钮,点击后结束采集和录制,并利用AVPlayerViewController查看录制的视频

    @IBAction func clickPlay(_ sender: Any) {
        print(fileURL)
        camera.stopCapture()
        showView.removeFromSuperview()
        movieWriter.finishRecording()
        let playerVc = AVPlayerViewController()
        playerVc.player = AVPlayer(url: fileURL)
        present(playerVc, animated: true, completion: nil)
    }

运行效果:
运行效果
demo代码:https://github.com/dolacmeng/LiveGPUImageDemo/tree/record

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值