iOS11系统增加了对HEVC视频格式,对于调用AVFoundation里的系统API实现视频播放编辑的应用不需要做任何适配,系统API已经很好的兼容了HEVC视频格式。但是如果使用了FFmpeg做跨平台开发,或是使用到VideoToolbox做视频硬解,就必须做适配了。
创建VideoToolBox
VideoToolBox解码需要调用VTDecompressionSessionCreate方法创建session,创建session时需要CMVideoFormatDe ionRef类型的视频格式描述。
对于解码H264视频,做法是调用CMVideoFormatDe ionCreateFromH264ParameterSets方法,传入SPS,PPS完成创建。
对于解码HEVC视频,需要调用iOS11新提供的接口CMVideoFormatDe ionCreateFromHEVCParameterSets创建。所以,我们的主要任务是获取HEVC视频的ParameterSets,调用上述接口,剩下的工作就和解码H264视频一样了。
获取ParameterSets
HEVC视频存放SPS,PPS的数据结构与H264类似
官方定义参考 https://lists.matroska.org/pipermail/matroska-devel/2013-September/004567.html
HEVCDecoderConfigurationRecord:
// The CodecPrivate syntax shall follow the// syntax of HEVCDecoderConfigurationRecord// defined in ISO/IEC 14496-15.//// The number zero (0) shall be written to// the configurationVersion variable until// official finalization of 14496-15, 3rd ed.//// After its finalization, this field and the// following CodecPrivate structure shall// follow the definition of the// HEVCDecoderConfigurationRecord in 14496-15.unsigned int(8) configurationVersion;unsigned int(2) general_profile_space;unsigned int(1) general_tier_flag;unsigned int(5) general_profile_idc;unsigned int(32) general_profile_compatibility_flags;unsigned int(48) general_constraint_indicator_flags;unsigned int(8) general_level_idc;bit(4) reserved = ‘1111’b;unsigned int(12) min_spatial_segmentation_idc;bit(6) reserved = ‘111111’b;unsigned int(2) parallelismType;bit(6) reserved = ‘111111’b;unsigned int(2) chromaFormat;bit(5) reserved = ‘11111’b;unsigned int(3) bitDepthLumaMinus8;bit(5) reserved = ‘11111’b;unsigned int(3) bitDepthChromaMinus8;bit(16) avg Rate;bit(2) constant Rate;bit(3) numTemporal s;bit(1) temporalIdNested;unsigned int(2) lengthSizeMinusOne;unsigned int(8) numOfArrays;for (j=0; j < numOfArrays; j++) { bit(1) array_completeness; unsigned int(1) reserved = 0; unsigned int(6) NAL_unit_type; unsigned int(16) numNalus; for (i=0; i< numNalus; i++) { unsigned int(16) nalUnitLength; bit(8*nalUnitLength) nalUnit; }}存放在extradata中,对应FFmpeg中AVCodecContext结构体的extradata数据段。
我们需要解析其中的SPS,PPS,VPS,作为ParameterSets传给解码器完成创建工作。从上述的定义我们可以直接跳过21个字节,遍历之后的数据段,根据的NAL_unit_type类型32、33、34别对应VPS、SPS和PPS,获取所有SPS,PPS,VPS。
剩下的就和解码H264无任何区别了,VideoToolBox解码网上有很多demo,这里就不在赘述。
继续阅读与本文标签相同的文章
【读书笔记】iOS-使用钥匙串保护数据
详解React 服务端渲染方案完美的解决方案
-
云产品权限细粒度设置
2026-05-19栏目: 教程
-
一起聊聊图像质量和美学评估的数据集
2026-05-19栏目: 教程
-
源码分析Node的Cluster模块
2026-05-19栏目: 教程
-
Maven使用经验总结(持续更新)
2026-05-19栏目: 教程
-
短视频SDK的编译设计与实现系列(一)——CMake基础入门
2026-05-19栏目: 教程
