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
。