文章目录
iOS 硬编码
iOS 硬编码简单的总结来说就是将采集到的CMSampleBufferRef
编码成H264或者是H265,对编码完成后的数据最后进行合成等工作用以实现自己不同的需求。
编码的主要步骤可分为以下几个步骤:
- 创建编码用的session,并设置编码的参数
- 等待数据进行正式编码工作
- 处理编码完成的数据
总结的步骤是比较简单的,但是在各个步骤中有几个比较重要的点需要注意,下面在代码中逐步进行指出
编码session 的创建
在进行session创建的时候需要设置回调函数,数据编码之后将通过该函数方法输出,另配置session的几个关键属性。
- 配置是否实时编码
- 配置编码等级(baseline/main/high)
- 配置帧率(1秒多少帧画面)
- 配置GOP(两个I帧的间隔多少帧)
- 配置编码类型(CABAC/CAVLC)
具体的操作代码如下:
- (void)createSessionWithConfig:(VideoEncodeConfig *)config {
needSetVideoParam = YES;
// 创建session,指定回调方法
VTCompressionSessionCreate(NULL, config.size.width, config.size.height, kCMVideoCodecType_H264, NULL, NULL, NULL, outputCallback, (__bridge void *)self, &pCompressionSession);
// 配置session 属性
// 是否实时
VTSessionSetProperty(pCompressionSession, kVTCompressionPropertyKey_RealTime, kCFBooleanTrue);
// gop数值
VTSessionSetProperty(pCompressionSession, kVTCompressionPropertyKey_MaxKeyFrameInterval, (__bridge CFTypeRef)@(config.videoMaxKeyframeInterval));
// 期望帧率
VTSessionSetProperty(pCompressionSession, kVTCompressionPropertyKey_ExpectedFrameRate, (__bridge CFTypeRef)@(config.videoFrameRate));
// 关键帧采样间隔时间
VTSessionSetProperty(pCompressionSession, kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration,( __bridge CFTypeRef)@(config.videoMaxKeyframeInterval / config.videoFrameRate));
// 比特率
VTSessionSetProperty(pCompressionSession, kVTCompressionPropertyKey_AverageBitRate, ( __bridge CFTypeRef)@(config.videoBitRate));
NSArray *limit = @[@(conf