iOS直播(三)GPUImage音视频采集并写入文件
上一篇介绍了用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] inlet writer = GPUImageMovieWriter(movieURL: self.fileURL, size: self.view.bounds.size)return writer!}()//视频沙盒地址fileprivate lazy var fileURL : URL = {[unowned self] inreturn 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 = truefilterGroup.addTarget(movieWriter)camera.delegate = self;camera.audioEncodingTarget = movieWritermovieWriter.startRecording()}
3.上一步中的getGroupFilters方法,是将多个滤镜效果叠加。GPUImage采用链式方法来处理画面,通过addTarget方法添加对象到链中,处理完一个target,再把上一个环节处理好的图像数据传递到下一个target处理,成为GPUImage处理链。
fileprivate func getGroupFilters() -> GPUImageFilterGroup {//创建滤镜组let filterGroup = GPUImageFilterGroup()//设置滤镜关系链bilateralFilter.addTarget(brightnessFilter)brightnessFilter.addTarget(exposureFilter)exposureFilter.addTarget(satureationFilter)//设置滤镜组初始、终点filterfilterGroup.initialFilters = [bilateralFilter]filterGroup.terminalFilter = satureationFilterreturn 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
iOS直播(三)GPUImage音视频采集并写入文件相关推荐
- iOS直播技术分享-音视频采集(一)
1.iOS直播技术的流程 直播技术的流程大致可以分为几个步骤:数据采集.图像处理(实时滤镜).视频编码.封包.上传.云端(转码.录制.分发).直播播放器. 数据采集:通过摄像头和麦克风获得实时的音视频 ...
- iOS直播(二)GPUImage音视频采集
上文中介绍了用AVFoundation实现音视频采集(https://blog.csdn.net/dolacmeng/article/details/81268622) ,开源的基于GPU的第三方图像 ...
- 直播软件搭建音视频开发中的视频采集
直播软件搭建音视频开发中的视频采集 前言 在直播和短视频行业日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的 ...
- “小程序+直播”怎样搅动音视频技术生态?
责编 / 王宇豪 策划 / LiveVideoStack 12月26日晚间,微信小程序开放了直播能力,并首先向社交.教育.医疗.政务民生.金融等五大应用场景开放.与原生App应用和基于浏览器的H5 ...
- Android 音视频采集与软编码总结
请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/75807435(本文已在 "任玉刚" 微信公众号发布 ...
- Android端WebRTC本地音视频采集流程源码分析
WebRTC源码版本为:org.webrtc:google-webrtc:1.0.32006 本文仅分析Java层源码,在分析之前,先说明一下一些重要类的基本概念. MediaSource:WebRT ...
- webrtc简单案例——音视频采集和播放
webrtc简单案例--音视频采集和播放 目录 打开摄像头并将画面显示到页面 打开麦克风并在页面播放捕获的声音 同时打开摄像头和麦克风,并在页面显示画面和播放捕获的声音 1. 打开摄像头并将画面显示到 ...
- (三)音视频:解析H264 SPS 更进一步理解H264
(一)音视频:解码H264文件流程 渲染和拿到解码后源数据YUV 完整Demo] (二)音视频:MediaCodec编码桌面信息 完整Demo 进一步理解H264 (三)音视频:解析H264 SPS ...
- WebRTC音视频采集和播放示例及MediaStream媒体流解析
WebRTC音视频采集和播放示例及MediaStream媒体流解析 目录 示例代码--同时打开摄像头和麦克风,并在页面显示画面和播放捕获的声音 API解析 mediaDevices MediaStre ...
最新文章
- 【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )
- 脉络最清晰的C++高斯消元程序
- 【2018ACM山东省赛 - E】Sequence(树状数组,思维,优化)
- 创业必经之路——Paul Graham创业曲线
- 几句话就能让你明白:VLAN是什么、TRUNK又是什么
- Python MQTT订阅获取发布信息字典过滤
- python自动处理下载的英文字幕
- static与线程安全 -摘自网络
- 牛客竞赛,GDDU第十届文远知行杯新生程序设计竞赛,摸鱼记(BDEIKL题解,补G,ACFHJ)
- Maven传递依赖冲突解决(版本冲突)
- 在线文本比较工具-toolfk程序员在线工具网
- 珍大户《认知世界的经济学》学习笔记 -- 第21课 利率的计算 更新时间2021年07月27日22:14:34
- MATLAB图像灰度化—优化三种灰度化算法
- zblog博客模板-zblog插件免费-支持PHP以及ASP
- video标签实现简单视频背景+遇到问题(视频无法显示,不能自动播放)
- java 连续数字_java 如何判断数字是否连续?求大神解答
- layui个人中心html,Layui的简易入门教程
- python最小二乘法 实现 曲面拟合
- 我在IT职场超15年:从程序员做到副总,送你21个超实用的职场法则!
- 前端如何做好数据容错
热门文章
- SPSS聚类分析:K均值聚类分析
- Mac 安装SecureCRT
- 替换元素和非替换元素的学习
- Fedora 19下Guacamole的安装使用
- 转【红帽GFS集群文件系统配置指南】
- [翻译]ASP.NET MVC 3 开发的20个秘诀(十二)[20 Recipes for Programming MVC 3]:缩放图片尺寸创建缩略图...
- 镜头评价指标及测试方法(二)—畸变与分辨率
- mongodb常用语句以及SpringBoot中使用mongodb
- ubuntu下vim的配置
- Spring源码分析【2】-Tomcat和Sping的连接点