iOS H264,H265视频编码(Video encode)
发布网友
发布时间:2022-09-14 03:44
我来回答
共1个回答
热心网友
时间:2024-10-25 04:58
H264进行编码,iOS 11 之后,iPhone 7以上的设备可以支持新的编码器H265编码器,使得同等质量视频占用的存储空间更小。所以本例中可以使用两种方式实现视频数据的编码
系统已经提供VTIsHardwareDecodeSupported判断当前设备是否支持H265编码
1> g_isSupportRealTimeEncoder = (is64Bit == 8) ? true : false; 用来判断当前设备是32位还是64位
2> 创建H264/H265Session 区别仅仅为参数的不同,h264为kCMVideoCodecType_H264。 h265为kCMVideoCodecType_HEVC,在创建Session指定了回调函数后,当编码成功一帧就会调用相应的回调函数。
3> 通过 [self getSupportedPropertyFlags]; 获取当前编码器支持设置的属性,经过测试,H265不支持码率的*。目前暂时得不到解决。等待苹果后续处理。
4> 之后设置编码器相关属性,下面会具体介绍,设置完成后则调用VTCompressionSessionPrepareToEncodeFrames准备编码。
上述方法主要设置启动编码器所需的各个参数
1> kVTCompressionPropertyKey_MaxFrameDelayCount : 压缩器被允许保持的最大帧数在输出一个压缩帧之前。例如如果最大帧延迟数是M,那么在编码帧N返回的调用之前,帧N-M必须被排出。
2> kVTCompressionPropertyKey_ExpectedFrameRate : 设置fps
3> kVTCompressionPropertyKey_AverageBitRate : 它不是强制的*,bit rate可能会超出峰值
4> kVTCompressionPropertyKey_RealTime : 设置编码器是否实时编码,如果设置为False则不是实时编码,视频效果会更好一点。
5> kVTCompressionPropertyKey_AllowFrameReordering : 是否让帧进行重新排序。为了编码B帧,编码器必须对帧重新排序,这将意味着解码的顺序与显示的顺序不同。将其设置为false以防止帧重新排序。
6> kVTCompressionPropertyKey_ProfileLevel : 指定编码比特流的配置文件和级别
7> kVTCompressionPropertyKey_H264EntropyMode :如果支持h264该属性设置编码器是否应该使用基于CAVLC 还是 CABAC
8> kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration : 两个I帧之间最大持续时间,该属性特别有用当frame rate是可变
以上方法在每采集到一帧视频数据后会调用一次,我们将拿到的每一帧数据进行编码。
1> 通过frameID的递增构造时间戳为了使编码后的每一帧数据连续
2> 设置最大码率的*,注意:H265目前不支持设置码率的*,等待官方后续通知。可以对H264进行码率*
3> kVTCompressionPropertyKey_DataRateLimits : 将数据的bytes和ration封装到CFMutableArrayRef传给API进行调用
4> VTCompressionSessionEncodeFrame : 调用此方法成功后触发回调函数完成编码。
1> 首先在回调函数中截取到I帧,从I帧中提取到(h265中新增vps),sps,pps信息并写入文件
2> 遍历其他帧将头信息0000,0001写入每个头信息中,再将该数据写入文件即可
这里我们简单介绍一下H264,H265码流信息
注意在H265流数据中新增vps在最前。
流数据中,属性集合可能是这样的:
经过处理之后,在Format Description中则是:
根据上述得到CMVideoFormatDescriptionRef、CMBlockBufferRef和可选的时间信息,使用CMSampleBufferCreate接口得到CMSampleBuffer数据这个待解码的原始的数据。如下图所示的H264数据转换示意图。