一.理解VideoToolBox硬编码
在IOS4.0中,苹果已经支持硬编码。但是硬编码当时属于私人API。没有提到为开发者准备的东西。
在2014年的WWDC大会上,iOS 8.0之后,苹果公开了硬编码的API。
就是VideoToolbox.framework的API。VideoToolbox是一套纯C语言API。其中包含了很多C语言函数.VideoToolbox.framework是基于Core Foundation库函数,基于C语言
VideoToolBox实际上属于低级框架,它是可以直接访问硬件编码器和解码器.它存在于视频压缩和解压缩以及存储在像素缓存区中的数据转换提供服务.
硬编码的优点
- 提高编码性能(使用CPU的使用率大大降低,倾向使用GPU)
- 增加编码效率(将编码一帧的时间缩短)
- 延长电量使用(耗电量大大降低)
这个框架在音视频项目开发中,也是会要频繁使用的.如果大家有想法去从事音视频的开发.那么这个框架将会是你学习的一个重点.
VideoToolBox框架的流程
- 创建session
- 设置编码相关参数
- 开始编码
- 循环获取采集数据
- 获取编码后数据
- 将数据写入H264文件
1.1 编码的输入和输出
在我们开始编码工作之前,需要了解VideoToolBox进行编解码的输入输出分别是什么? 只有了解了这个,我们才能清楚知道如何去向VideoToolBox添加数据,并且如何获取数据.
如图所示,左边的三帧视频帧是发送給编码器之前的数据,开发者必须将原始图像数据封装为CVPixelBuufer的数据结构.该数据结构是使用VideoToolBox的核心.1.2 CVPixelBuffer 解析
在这个官方文档的介绍中,CVPixelBuffer 给的官方解释,是其主内存存储所有像素点数据的一个对象.那么什么是主内存了?
其实它并不是我们平常所操作的内存,它指的是存储区域存在于缓存之中. 我们在访问这个块内存区域,需要先锁定这块内存区域.
单纯从它的使用方式,我们就可以知道这一块内存区域不是普通内存区域.它需要加锁,解锁等一系列操作.
作为视频开发,尽量减少进行显存和内存的交换.所以在iOS开发过程中也要尽量减少对它的内存区域访问.建议使用iOS平台提供的对应的API来完成相应的一系列操作.
在AVFoundation 回调方法中,它有提供我们的数据其实就是CVPixelBuffer.只不过当时使用的是引用类型CVImageBufferRef,其实就是CVPixelBuffer的另外一个定义.
Camera 返回的CVImageBuffer 中存储的数据是一个CVPixelBuffer,而经过VideoToolBox编码输出的CMSampleBuffer中存储的数据是一个CMBlockBuffer的引用.
在iOS中,会经常使用到session的方式.比如我们使用任何硬件设备都要使用对应的session,麦克风就要使用AudioSession,使用Camera就要使用AVCaptureSession,使用编码则需要使用VTCompressionSession.解码时,要使用VTDecompressionSessionRef.