不支持h.265的意思是该视频文件的码率以及尺寸过大,改平台的存储空间暂不支持该码率的视频。

H.265是爱立信公司于2012年推出的一个新的视频编码器,并且在6个月之后就被国际电联正式批准。H.265旨在有限带宽下传输更高质量的网络视频,并且仅需原来一半的带宽即可播放相同质量的视频。这也就说明智能手机、平板电脑等移动设备将能够直接在线播放1080p全高清视频。

但是H.265只规定了一个可用技术的范围,并且它带来了远高于H.264的压缩效率,也带来了高于H.264数倍的解码难度,算法复杂度相比H.264也提高了2-10倍,运算量也飙升到400-500GOPS,复杂的运算对处理器提出了严峻的挑战。所以目前阶段,很多平台难以使用H.265编码播放视频。
1、占用存储空间不同
同样的画质和同样的码率,H.265比H2.64占用的存储空间要少理论50%。
2、视频画质不同
H.265标准的诞生是在有限带宽下传输更高质量的网络视频。H.265标准也同时支持4K(4096×2160)和8K(8192×4320)超高清视频。
3、视频大小不同
在相同的图象质量下,相比于H.264,通过H.265编码的视频大小将减少大约39-44%。
参考资料来源:百度百科—H.265
参考资料来源:百度百科—H.264技术
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和duration封装到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数据转换示意图。
h265为什么不普及之实时编码难度大
在视频采集后,在保证视觉效果的同时需要减少视频数据量,一边数据传输和存储,编码压缩显得尤为重要。H.265编码复杂度较之H.264呈几何增长,编码用时也随之增长,以现有的终端设备难以实现实时编码,所以目前阶段直播平台难以使用H.265编码播放视频。
h265为什么不普及之编码器使用难度大
H.265只是规定了一个可用技术的范围,编码时很多特性可以用,也可以不用。所以H.265编码器的使用难度大概是h.264的2-3倍不止。
h265为什么不普及之解码难度大
H.265带来了远高于H.264的压缩效率,也带来了高于H.264数倍的解码难度,算法复杂度相比H.264提高了2-10倍,运算量飙升到400-500GOPS,复杂的运算对处理器提出了严峻的挑战