Annex-b
H264有AVCC跟 Annex-b两种格式,而苹果 videotoolbox 只能针对AVCC格式的nalu 做硬解码,而且解码像素格式必须是NV12, 也叫YUV420SP
一般的mp4 都是 avcc 的 h264编码,一般硬解没问题. 而Annex-b格式视频流就必须手动解析处理。
FFMpeg
ffmepg 中 提供了一个 mp4toannexb的filter 但是 反过来的就没有,其实ffmpeg 中就针对 Annex-b格式走videotoolbox硬解做了额外处理的
总体分了两块,一块是解析 extradata中的 vps sps pps 等nal,封装为AVCDecoderConfigurationRecord | HEVCDecoderConfigurationRecord格式的data数据
另一块就是转换packet中的 nalu数据格式,然后通过 videotoolbox api 进行解码操作。 详细直接看 libavcodec/videotoolbox.c
源码
videotoolbox
这里主要是通过ffmepg完成解封装操作拿到 packet,手动解析packet 跟 extra 数据 完成videotoolbox的硬解码。
跟ffmpeg不一样的就是用到最新提供的api CMVideoFormatDescriptionCreateFromH264ParameterSets | CMVideoFormatDescriptionCreateFromHEVCParameterSets
。