LearningAVFoundation之拍摄+实时滤镜+实时写入

前言

AVFoundation框架的功能十分强大,同时也充斥着各类类,好比各类session,各类input,各类output。以前并无对整个框架进行过完整梳理,虽然也能东拼西凑的那各类类完成需求,但遇到深度定制的需求以及踩到坑以后,总会比较吃力。最近,在看《learning AV Foundation》这本书,看完后尝试着梳理了一个总体脉络,并将理解的知识点整合用Swift重写了一个demo,包括拍摄+实时滤镜+实时写入+自定义导出分辨率等。本篇为视频拍摄部分,下一章会更新视频的组合编辑及音频混合部分。git

总体脉络

总体架构

能够看到,整个流程能够分为三部分,分别为数据采集、数据加工和数据保存。github

数据采集: 数据采集不只限于本文场景中的经过摄像头和麦克分设备采集,还好比AVAssetReader从AVAsset实例中读取。不管以什么方式采集,这一阶段的输出都为CMSampleBuffer。值得一提的是,摄像头采集的是yuv格式的压缩的视频信号,在输出时要还原成能够处理的数字信号,这一配置在AVCaptureVideoDataOutput的videoSettings属性中。session

数据加工: 数据加工阶段能够基于CMSampleBuffer进行各类处理,包括加滤镜等,都在这个阶段。sampleBuffer会包含一个CVPixelBuffer,它是一个带有单个视频帧原始像素数据的Core Video对象,据此咱们能够进行像素级别的加工。架构

数据保存: 数据保存阶段将加工后的媒体资源进行编码并写入到容器文件中,好比mp4文件或.mov文件等。此处使用AVAssetWriter,它支持实时写入。它指望接收到的数据也是CMSampleBuffer格式。同时咱们也能够传入其余数据,经过pixelBufferAdaptor适配成它所指望的数据。好比,本文的demo中传入了CIImage,能够先将CIImage渲染成CVPixelBuffer,再进行写入。框架

以上就是总体脉络,本文的demo也是基于这个思路封装的。CaptureManager负责数据采集,经过block回调输出CMSampleBuffer数据。VideoWriteManager负责数据保存,接收CMSampleBuffer数据,经过block回调生成的文件路径。CameraViewController做为二者的调度方,并承担数据加工工做以及将加工后的数据展现给用户进行预览。ide

设备采集

经过设备采集的核心类是AVCaptureSession,它的输入是AVCaptureDeviceInput,输出是AVCaptureOutput,管理从物理设备中获得的数据流,并按照output的配置输出指定的文件或数据。AVCaptureOutput是一个抽象基类,若是定制化需求不高,能够直接使用AVCaptureMovieOut高级类来直接输出文件。可是若是须要进行底层的数据加工或自定义配置,就须要使用AVCaptureVideoDataout和AVCaptureAudioDataOutput来输出CMSampleBuffer格式的原始数据。此外,为了避免阻塞主线程,咱们通常会为AVCaptureOutput分配专门的串行队列。性能

数据加工-添加滤镜

滤镜大多使用GPUImage框架,但这不是本文的核心,所以,demo中仅使用了CoreImage框架来实现滤镜效果。为了达到实时滤镜的效果,须要在每一帧的回调数据中,都对每一帧的图像数据都应用当前滤镜的效果,从而用户能够在拍摄过程当中不断切换各类滤镜。学习

此处在学习《learning AV Foundation》书中的demo时,书中的demo是把原始数据分别传给用户预览界面和写入类,二者各自处理。但我以为这样至关于一样的加工处理了两遍,从代码维护和性能上都不是很可取。由于,此处我是处理完后,把处理完的数据分别传给预览界面显示和写入类保存。编码

数据保存

AVAssetWriter经过多个(音频、视频等)AVAssetWriterInput对象配置。AVAssetWriterInput经过mediaType和outputSettings来初始化,咱们能够在outputSettings中进行视频比特率、视频宽高、关键帧间隔等细致的配置,这也是AVAssetWrite相比AVAssetExportSession明显的优点。AVAssetWriterInput在附加数据后会在最终输出时生成一个独立的AVAssetTrack.线程

此处用到了PixelBufferAdaptor来附加CVPixelBuffer类型的数据,它在附加CVPixelBuffer对象的视频样本时能提供最优性能。

以上就是AVFoundation Caputure部分的总体思路和脉络,更多采坑细节如视频旋转问题等请参考Demo,内有详细注释。

相关文章
相关标签/搜索