iOS GPUImage音视频采集以及美颜功能

iOS 直播专题2-音视频采集 ios GPUImage 音视频采集 阅读详情

iOS GPUImage音视频采集以及美颜功能


GPUImageStillCamera:用于拍摄当前手机的画面, 并且保存图片

GPUImageVideoCamera:通常用于实时视频的录制

使用方法:GPUImageStillCamera \ GPUImageVideoCamera>GPUImageFilter->GPUImageView 摄像机转到滤镜再转到view上

本篇博客Demo:iOS GPUImage音视频采集以及美颜功能


初始化需要用到的属性
    
    fileprivate lazy var camera: GPUImageVideoCamera? = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPresetHigh, cameraPosition: .front)
    
    fileprivate lazy var preView: GPUImageView  = {
        let preView = GPUImageView(frame: self.view.bounds)
        return preView
    }()
    
    let saturationFilter = GPUImageSaturationFilter() // 饱和
    let bilateralFilter = GPUImageBilateralFilter() // 磨皮
    let brightnessFilter = GPUImageBrightnessFilter() // 美白
    let exposureFilter = GPUImageExposureFilter() // 曝光
    
    fileprivate var player: AVPlayer?
    fileprivate var isEndRecording = false
    
    // 视频存放路径Url
    var fileURL : URL {
        return URL(fileURLWithPath: pathString)
    }
    
    //视频存放路径
    var pathString: String {
        return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/test.mp4"
    }
    
    // 创建写入对象
    fileprivate lazy var movieWriter : GPUImageMovieWriter = { [weak self] in
        if FileManager.default.fileExists(atPath: (self?.pathString)!) {
            try? FileManager.default.removeItem(atPath: (self?.pathString)!)
        }
        let movieWriter = GPUImageMovieWriter(movieURL: self?.fileURL, size: (self?.view.bounds.size)!)
        movieWriter?.encodingLiveVideo = true
        
        return movieWriter!
    }()
    

创建camera以及滤镜组
    
    fileprivate func conifgCamera() {
        //创建预览的View
        view.insertSubview(preView, at: 0)
        //设置camera方向
        camera?.outputImageOrientation = .portrait
        camera?.horizontallyMirrorFrontFacingCamera = true
        
        ///防止允许声音通过的情况下,避免录制第一帧黑屏闪屏
        camera?.addAudioInputsAndOutputs()
        
        //获取滤镜组
        let filterGroup = getGroupFilters()
        //设置默认值
        bilateralFilter.distanceNormalizationFactor = 5.5
        exposureFilter.exposure = 0
        brightnessFilter.brightness = 0
        saturationFilter.saturation = 1.0
        //设置GPUImage的响应链
        camera?.addTarget(filterGroup)
        filterGroup.addTarget(preView)
        //开始采集视频
        camera?.startCapture()
        // 将writer设置成滤镜的target
        filterGroup.addTarget(movieWriter)
        camera?.delegate = self
        camera?.audioEncodingTarget = movieWriter
        movieWriter.startRecording()
    }
    
    fileprivate func getGroupFilters() -> GPUImageFilterGroup {
        //创建滤镜组
        let filterGroup = GPUImageFilterGroup()
        //创建滤镜(设置滤镜的引来关系)
        bilateralFilter.addTarget(brightnessFilter)
        brightnessFilter.addTarget(exposureFilter)
        exposureFilter.addTarget(saturationFilter)
        //设置滤镜起点 终点的filter
        filterGroup.initialFilters = [bilateralFilter]
        filterGroup.terminalFilter = saturationFilter
        return filterGroup
    }

功能以及方法的调用
    //翻转
    @objc fileprivate func pickUpCameraSelected() {
        camera?.rotateCamera()
    }
    
    //滤镜
    @objc fileprivate func filterCameraSelected() {
        filterView.show()
    }
    
    //结束录制
    @objc fileprivate func endRecordSelected() {
        isEndRecording = true
        preView.removeFromSuperview()
        movieWriter.finishRecording()
        let filterGroup = getGroupFilters()
        filterGroup.removeTarget(movieWriter)
        camera?.stopCapture()
    }
    
    //播放
    @objc fileprivate func playRecordSelected() {
        print(fileURL)
        if !FileManager.default.fileExists(atPath: pathString) {
            showAlert("播放路径不存在")
            return
        }
        let playerItem = AVPlayerItem(url: fileURL)
        player = AVPlayer(playerItem: playerItem)
        let layer = AVPlayerLayer(player: player)
        layer.frame = CGRect(x: (kWidth - 220)/2.0, y: 210, width: 220, height: 220)
        view.layer.addSublayer(layer)
        player?.play()
    }
    
    
    
    //拍照
    @objc fileprivate func takePhotoSelected() {
        
        guard let camera = camera else {
            fatalError("请退出程序重新录制!")
        }
        
        if camera.isMember(of: GPUImageVideoCamera.self)  {
            showAlert("请查看takePhotoSelected方法的说明")
            return
        }
        
        /*说明:
        GPUImageVideoCamera:通常用于实时视频的录制
         GPUImageStillCamera:用于拍摄当前手机的画面, 并且保存图片
        1. 将
        fileprivate lazy var camera: GPUImageVideoCamera? = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPresetHigh, cameraPosition: .front)
        改为
        fileprivate lazy var camera: GPUImageStillCamera? = GPUImageStillCamera(sessionPreset: AVCaptureSessionPresetHigh, cameraPosition: .front)
         
        2. 取消以下注释
         
        */
        
        /*
        camera.capturePhotoAsImageProcessedUp(toFilter: getGroupFilters(), withCompletionHandler: {[weak self] (image, error) in
            if error == nil {
                UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
                self?.showAlert("图片保存成功,请退出程序重新录制!")
            }else{
                self?.showAlert("图片保存失败,请退出程序重新录制!")
            }
            self?.endRecordSelected()
        })
        */
 
    }
    

美颜效果的切换处理,可以参考 iOS GPUImage图像处理
    
    //根据滑动改变美颜效果
    fileprivate func configSliderChange() {
        
        filterView.sliderDidValueChanged = {[weak self] (_, slider, type) in
            print(slider.value)
            switch type {
                
            case .bilateralFilter:
                self?.bilateralFilter.distanceNormalizationFactor = 10.0 - CGFloat(slider.value)
                break
                
            case .exposureFilter:
                self?.exposureFilter.exposure = CGFloat(slider.value) * 20.0 - 10.0
                break
                
            case .brightnessFilter:
                self?.brightnessFilter.brightness = CGFloat(slider.value) * 2.0 - 1.0
                break
                
            case .saturationFilter:
                self?.saturationFilter.saturation = CGFloat(slider.value) * 2.0
                break
        
            }
        }
        
    }
    
    //开关美颜功能
    fileprivate func configSwitchChange() {
        
        filterView.switchDidValueChanged = {[weak self] (_, filterSwitch, isOpen) in
            if isOpen {
                self?.camera?.removeAllTargets()
                let group = self?.getGroupFilters()
                self?.camera?.addTarget(group)
                group?.addTarget(self?.preView)
            }else{
                self?.camera?.removeAllTargets()
                self?.camera?.addTarget(self?.preView)
            }
        }
        
    }

效果图如下:



FFmpeg,opengl,gpuimage,完成音视频同步加GpuImage的滤镜功能 FFmpeg,opengl,gpuimage,完成音视频同步加GpuImage的滤镜功能 android平台 FFmpeg2.7.2 opengl 2.0 立即下载

相关推荐

音视频同步算法

音视频同步算法, 使用pts同步 音频流、视频流 流程图

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

上一篇介绍了用GPUImage图像处理库进行图像采集,从而避免了直接使用AVFoundation(AVKit)时繁琐的代码,同时不用熟悉OpenGL ES也可以快速地对图像进行美颜、添加滤镜等。这一篇介绍如果使用多个滤镜以及录制视频,并保存到本地沙盒中。 本文默认你已经按照上一篇中介绍的集成了GPUImage库。 1.声明必要的全局变量 fileprivate lazy var camera...

dolacmeng的专栏 1426

WSL子系统启动报错 Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE

WSL子系统启动报错 :Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE 于是分析原因,最终发现是Windows功能中的虚拟机平台功能不知道什么时候被取消了。

Linux I Tell U 6万+

AVFoundation和GPUImage初探

最近在做视频相关的东西,然后熟悉了一下AVFoundation框架,以及强大的开源库GPUImage。在这里记录这个过程中遇到的一些问题,以及解决的方法。 AVFoundation简介进阶GPUImage总结 1.AVFoundation的一些基本概念 根据苹果的官方文档,AVFoundation是用来播放和创建实时的视听媒体数据的框架,同时提供Objective-C接口来操作这

andy_jiangbin的专栏 1942

天龙八部源码深度解析:从宠物系统到副本机制(C++游戏开发实战)

本文深度解析《天龙八部》源码架构,重点剖析宠物系统状态机实现与副本动态加载机制等核心模块。通过C++代码示例展示宠物AI状态迁移逻辑和副本场景管理技术,为现代游戏开发提供兼容性改造方案与设计启示。适合游戏开发者学习经典MMORPG的工程化实现路径。

weixin_29011239的博客 385

金融行业软件测试面试题(含答案)

6、假如发现了一个BUG,跟开发本身没什么关系,涉及到理念,需求问题,如何解决?11、假如要你测试6个月期限的p2p借款产品,你应该怎么设计案例,说出测试点。17、如果京东有一个购物网页给你,你要怎么进行测试?31、我们公司自动化测试用的语言是Java,Java你不会,该怎么办?23、你们测试用的测试环境是谁给的?24、如果领导分配你的任务超出负荷,领导高估了你的能力,怎么办。26、给你一个模块测试,只有一个星期的时间你如何有效率地完成?29、如果你组长的用例写错了,但他认为是对的,你怎么处理?

crhnb的博客 913

为什么选择PreLoader?5大核心优势彻底解决Android页面加载慢问题

PreLoader是一款专为Android应用打造的页面启动速度优化利器,通过在页面打开之前预加载数据的创新方式,有效解决了传统开发中页面加载缓慢的痛点。对于Android开发者而言,这款工具不仅能显著提升用户体验,还能简化数据加载逻辑,是优化应用性能的理想选择。 ## 🚀 核心优势一:突破性的预加载机制 PreLoader采用独特的"数据加载与UI初始化并行"策略,彻底改变了传统Andro

gitblog_00191的博客 425

利用Sigrity的SPEED2000进行时域电源噪声分析

SPEED2000进行时域电源噪声分析

ZHENGSA的博客 3619

GPUImage终极指南:iOS图像与视频GPU加速滤镜框架的完整解决方案

GPUImage是一个开源的iOS框架,专门用于GPU加速的图像和视频处理。这个强大的工具让开发者能够轻松应用各种滤镜和特效到图片、实时相机视频和电影中,相比CPU处理速度提升高达100倍!🎯 如果你正在寻找一个简单、快速且免费的iOS图像处理解决方案,GPUImage绝对是你的首选。 ## 为什么选择GPUImage框架?🤔 GPUImage框架的核心优势在于其卓越的性能表现。在iPho

gitblog_00696的博客 1020

MATLAB绘图中文乱码终极解决方案:从方框到清晰显示的全面指南

本文提供了MATLAB绘图中文乱码的全面解决方案。针对中文显示为方框的问题,从单次绘图的临时字体设置,到通过修改默认配置实现一劳永逸,再到系统级字体排查与Java环境配置,给出了详细的步骤指南。文章还涵盖了字体名称指定、图像导出防丢失以及跨平台协作等高级技巧,帮助用户彻底解决中文乱码困扰。

weixin_29093017的博客 613

2023东华大学机试OJ进阶版1-81题

先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。

m0_49263811的博客 2794

iOS图像处理调试工具:GPUImage渲染过程可视化实现

你是否曾在开发iOS图像处理功能时,遇到滤镜效果异常却难以定位问题的情况?是否想直观查看GPUImage滤镜链中每一步的渲染结果?本文将带你实现一套轻量级渲染过程可视化工具,通过3个核心步骤捕获、标注和展示GPUImage的渲染流水线,让调试效率提升80%。 ## 渲染过程捕获原理 GPUImage的渲染本质是纹理(Texture)在帧缓冲(Framebuffer)间的流转过程。每个滤镜(Fi...

gitblog_00413的博客 513

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 417

分析一下,直播类app开发需要哪些技术

直播技术总结 直播总结 1.概述 关于直播类app开发的技术文章不少,成体系的不多。我们将用这篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面、深入地了解视频直播类app开发技术,更好地技术选型。 1.1 一个完整的直播APP原理 直播原理: 把主播录制的视频,推流送到服务器,服务器经过处理(鉴黄等),通过CDN分发给观众看。 直播环节: 推流端(采集、美颜、编码、推流),服务端处理(转码、录制、截图、鉴黄)、播放器(拉流、解码、渲染)、互动系统(聊天室、礼..

QQ1981747098的博客 2381

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

iOS GPUImage研究总结

关于GPUImage 这里直接引用官方描述:GPUImage是使用GPU处理图像的、他可以对图片、实时画面、视频进行处理。他允许你自定义滤镜、支持iOS4.0。然而,目前缺乏核心形象的一些更高级的功能,比如面部检测。

Quinn's blog ! I'm glad to be here! 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ios音视频开发路线及技术点

在音视频开发中,我们首先看到的就是视频的采集,在视频采集里,我们也要区分平台,例如android,iOS,PC。在本章的介绍中,我们集中介绍下iOS音视频开发相关能力。 ​ 音视频全链路流程 从图里,我们可以看到,在整个直播架构体系里面,最开始的就是采集,之后就是编码,封装,推流,转发,拉流,解码,渲染。 我们今天为你们系统介绍iOS视频采集相关流程 一、视频采集流程 iOS采集器的基本结构图如下: ​ iOS采集相关架构图 从图里可以看到,我们可以通过AVCapture De

m0_60259116的博客 7896

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

iOS 音视频采集与编码

学习过音视频的都知道,不常用的话就会容易忘记。因此,记下以前学些的点滴。(这不是入门贴) 主要分为以下主题做学习记录: 视频采集与编码音频采集与编码 video.png 视频采集与编码 视频采集 获取输入设备 NSError *deviceError; AVCaptureDeviceInput *inputDevice; for (AVCaptureD

Keep_Moving31038的博客 2538

如何快速的开发一个完整的iOS直播app(美颜篇)

在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇)开发一款直播app,美颜功能是很重要的,如果没有美颜功能,可能分分钟钟掉粉千万,本篇主要讲解直播中美颜功能的实现原理,并且实现美颜功能。袁峥Seemygo。

irainsa的博客 588

IOS技术分享| 在iOS WebRTC 中添加美颜滤镜

在使用WebRTC的时候,对视频进行美颜处理一般有两种方式:替换WebRTC中的采集模块和对视频数据进行美颜。 一、替换WebRTC中的采集模块 替换WebRTC中的采集模块,相对比较简单,使用GPUImageVideoCamera替换WebRTC中的视频采集,得到经过GPUImage添加美颜处理后的图像,发送给WebRTC的OnFrame方法。 参考基于WebRTC框架开发的全平台推拉流SDK:Github 设置美颜 - (void)setBeautyFace:(BOOL)beautyFace{

anyRTC的博客 1202

iOS短视频:基于GPUIMage的短视频录制(GPUImage自定义相机)

主要涉及到的GPUIMage的类 GPUImageVideoCamera:录制视频,采集数据使用到的类,GPUImage中一种是GPUImageStillCamera,另一种为GPUImageVideoCamera.正如其命名,如果只是拍照使用前者.录制视频使用后者. GPUImageView:用于显示视频的GPUImageView GPUImageBeautifyFilter:继承自GPUIm...

weixin_42433480的博客 2611

直播平台源代码中iOS 美颜渲染如何开发

iOS 直播系列二:美颜渲染 CIFilter // 根据分类名获取对应的滤镜数组 NSArray<NSString *> *categoryArr = [CIFilter filterNamesInCategory:kCICategoryDistortionEffect]; NSLog(@"% ==== @", categoryArr); 复制代码 滤镜分类 /* Categories */ CORE_IMAGE_EXPORT NSString * const kCICategor

云豹直播源码 492

如何快速实现iOS直播推流:RTMP协议与GPUImage滤镜的完整指南

在移动直播应用开发中,实现流畅的视频推流和实时美颜滤镜是提升用户体验的关键。TimLiu-iOS项目作为iOS开发资源集合,提供了丰富的直播推流和图像处理工具,帮助开发者快速构建专业级直播应用。本文将详细介绍如何利用RTMP协议进行视频推流,并结合GPUImage实现实时美颜滤镜效果,适合新手开发者快速上手。 ### 一、直播推流核心技术解析 🚀 #### 1. RTMP协议与推流框架选择

gitblog_01060的博客 342

10分钟快速搭建iOS直播应用:LFLiveKit完整入门指南

LFLiveKit是一款专为iOS平台打造的直播开发工具包,提供H264和AAC硬编码、GPUImage美颜、RTMP传输、弱网丢帧处理及动态码率切换等核心功能,帮助开发者快速构建专业级直播应用。 [![LFLiveKit Logo](https://raw.gitcode.com/gh_mirrors/lf/LFLiveKit/raw/79ff5357ac466951421255978c399

gitblog_00421的博客 1023

iOS直播开发终极指南:LFLiveKit源码深度剖析与实战应用

LFLiveKit是一个开源的iOS RTMP流媒体SDK,提供了从音视频采集到RTMP传输的全链路直播解决方案。作为iOS开发者掌握直播技术的重要工具,LFLiveKit支持H264+AAC硬件编码、GPUImage美颜滤镜、弱网丢帧优化等核心功能,让直播应用开发变得简单高效。 ## 🔍 LFLiveKit架构概览 LFLiveKit采用模块化设计,整个框架分为几个核心模块: - **音

gitblog_00882的博客 513
上一篇: iOS GPUImage图像处理
下一篇: iOS performSelector多参数传递解决方案以及objc_msgSend的使用注意事项
glt_code
博客等级 码龄10年 40粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值