一.了解VideoToolBox 硬编码
在iOS4.0中,苹果已经支持硬编解码器。然而,硬编解码器在当时是一个专有的应用编程接口。它没有提供给开发者。
在2014年的WWDC会议上,在iOS8.0之后,苹果开启了硬编码和解码的API。
是可视工具箱框架的应用编程接口.可视工具箱是一套纯C语言的API。它包含许多C语言函数。框架是基于核心的。
基础库函数,基于C语言
VideoToolBox其实属于底层框架,可以直接访问硬件编码器和解码器。它存在于视频压缩和解压缩中,为存储在像素缓冲区中的数据转换提供服务。
硬编码的优点
*提高编码性能(CPU使用率大幅降低,首选GPU)
*提高编码效率(缩短帧编码时间)
*延长用电时间(大大降低耗电量)
这个框架也经常用于音频和视频项目的开发。如果你有从事音视频开发的想法,那么这个框架将是你学习的一个重点。
VideoToolBox框架的流程
*创建会话
*设置编码相关参数
*开始编码
*循环采集收集的数据。
*获取编码数据
*将数据写入H264文件
1.1 编码的输入和输出
在我们开始编码之前,我们需要知道用于编码和解码的可视工具箱的输入和输出是什么?
只有了解了这一点,我们才能清楚地知道如何向可视工具箱添加数据,以及如何获取数据。
如图,左边的三个视频帧是发送到编码器之前的数据,开发者必须将原始图像数据封装到CVPixelBuufer的数据结构中,这是使用VideoToolBox的核心
CVPixelBuffer分析
在这份官方文件的介绍中,CVPixelBuffer给出的官方解释是,它的主存将所有像素数据作为一个对象进行存储。那么什么是主存呢?
其实并不是我们通常操作的内存,它意味着内存区域存在于缓存中。在访问这个内存区域之前,我们需要锁定这个内存区域。
从它的用法,我们可以知道这个内存区域不是一个普通的内存区域。它需要锁定和解锁等一系列操作。
作为视频开发,应该尽量减少视频内存和内存的交换。因此,在作为视频开发,尽量减少进行显存和内存的交换.所以在iOS,的发展过程中,应该尽量减少对其存储区域的访问。建议使用iOS平台提供的相应API完成一系列相应的操作。
在AVFoundation
在回调方法中,它提供给我们的数据实际上是CVPixelBuffer,只不过当时使用的是引用类型CVImageBufferRef,这实际上是CVPixelBuffer的另一种定义。
摄像机返回的CVImageBuffer
存储在中的数据是CVPixelBuffer,而存储在由可视工具箱编码的CMSampleBuffer中的数据是CMBlockBuffer的引用。
在iOS
经常使用会话。比如我们在使用任何硬件设备时,都需要使用相应的会话,麦克风需要使用AudioSession,摄像头需要使用AVCaptureSession,编码需要使用VTCompressionSession。解码时,我们需要使用VTDecompressionSessionRef。