1、涉及的系统框架:AVFoundation、VideoToolbox、CoreMedia、CoreVideo
2、主要对象:AVCaptureDevice、AVCaptureSession、AVCaptureDeviceInput、AVCaptureVideoDataOutput、AVCaptureConnection、AVCaptureVideoPreviewLayer
3、关键C函数:VTCompressionSessionCreate、CMVideoFormatDescriptionGetH264ParameterSetAtIndex(SPS、PPS)、CMBlockBufferGetDataPointer
4、数据格式: header/sps + header/pps + header/NALU...
5、编码流程:创建session -> 设置编码相关参数 ->开始编码 ->循环获取采集数据 -> 获取编码后数据 -> 将数据写入H264文件
6、相关属性
kVTCompressionPropertyKey_RealTime:设置是否实时编码
kVTProfileLevel_H264_Baseline_AutoLevel:表示使用H264的Profile规格,可以设置Hight的AutoLevel规格.
kVTCompressionPropertyKey_AllowFrameReordering:表示是否使用产生B帧数据(因为B帧在解码是非必要数据,所以开发者可以抛弃B帧数据)
kVTCompressionPropertyKey_MaxKeyFrameInterval: 表示关键帧的间隔,也就是我们常说的gop size.
kVTCompressionPropertyKey_ExpectedFrameRate: 表示设置帧率
kVTCompressionPropertyKey_AverageBitRate/kVTCompressionPropertyKey_DataRateLimits设置编码输出的码率.
7、IPB帧及GOP概念
I帧: 帧内编码帧(intra picture),I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)的第一帧.经过适度的压缩.作为随机访问的参考点,可以当做静态图像.I帧可以看做一个图像经过压缩后的产物.I帧压缩可以得到6:1的压缩比而不会产生任何可察觉的模糊现象.I帧压缩去除了视频空间的冗余信息.
P帧: 前后预测编码帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像.
B帧: 双向预测编码帧(bi-directional interpolated prediction frame),既要考虑源图像序列前面已编码帧,又要顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像.
GOP:两个I帧之间形成的一组图片,就是GOP(Group of Picture).
通常在编码器设置参数时,必须会设置gop_size的值.其实就是代表2个I帧之间的帧数目. 在一个GOP组中容量最大的就是I帧.所以相对而言,gop_size设置的越大,整个视频画面质量就会越好.但是解码端必须从接收的第一个I帧开始才可以正确解码出原始图像.否则无法正确解码.
8、SPS/PPS
SPS/PPS实际上就是存储GOP的参数.
SPS: (Sequence Parameter Set,序列参数集)存放帧数,参考帧数目,解码图像尺寸,帧场编码模式选择标识等.
一组帧的参数集.
PPS:(Picture Parameter Set,图像参数集).存放熵编码模式选择标识,片组数目,初始量化参数和去方块滤波系数调整标识等.(与图像相关的信息)
熵编码模式,片组数目等这些我们会在后面的内容讲解到.大家在这里主要了解到SPS/PPS即可.
大家只要记住,在一组帧之前我们首先收到的是SPS/PPS数据.如果没有这组参数的话,我们是无法解码.
如果我们在解码时发生错误,首先要检查是否有SPS/PPS.如果没有,是因为对端没有发送过来还是因为对端在发送过程中丢失了.
SPS/PPS数据,我们也把其归类到I帧.这2组数据是绝对不能丢的.
参考文章:1、https://www.jianshu.com/p/eccdcf43d7d2 2、https://www.jianshu.com/p/6f4cc979169e