音视频入门基础:H.264专题(18)——AVCDecoderConfigurationRecord简介

一、引言

H.264流行的包装方式有两种,一种是AnnexB,另一种是avcC。对于AnnexB包装的H.264码流,其SPS和PPS被当做普通的NALU来处理;而对于avcC包装的H.264码流,其SPS和PPS信息存贮在AVCDecoderConfigurationRecord中(FFmpeg源码中把AVCDecoderConfigurationRecord称为extradata)。

在对AVCDecoderConfigurationRecord进行简介之前,请各位先从《音视频入门基础:H.264专题(1)------H.264官方文档下载》下载ISO/IEC提供的H.264官方文档《H.264-AVC-ISO_IEC_14496-15》。该文档总共有96页。本文下面所说的"页数"是指在pdf阅读器中显示的页数:

二、AVCDecoderConfigurationRecord

avcC封装的H.264码流中,最前面的是AVCDecoderConfigurationRecord(或称为extradata)。根据《H.264-AVC-ISO_IEC_14496-15》第16页,AVCDecoderConfigurationRecord包含的属性如下:

AVCDecoderConfigurationRecord中的属性依次如下:

configurationVersion:占8位(1字节),为版本,值必须为1。

AVCProfileIndication:占8位(1字节),所存放第一个SPS的第一个字节,即第一个SPS的profile_idc。

profile_compatibility:占8位(1字节),所存放第一个SPS的第二个字节,即第一个SPS的constraint_set0_flag + constraint_set1_flag + constraint_set2_flag + constraint_set3_flag + constraint_set4_flag + constraint_set5_flag + reserved_zero_2bits。

AVCLevelIndication:占8位(1字节),所存放第一个 SPS 的第三个字节,即第一个SPS的level_idc。

reserved:占6位,每个位的值都为1,即二进制的0b111111。

lengthSizeMinusOne:占2位。这里要先讲一个概念:NALUnitLength。NALUnitLength为某个NALU的以字节为单位的长度,即该NALU的NALU Header + EBSP的总长度。

avcC跟AnnexB不一样,avcC包装的H.264码流中,每个NALU前面没有起始码。avcC通过在每个NALU前加上NALUnitLength,在读取某个NALU之前,先把该NALU前面的NALUnitLength读取出来,拿到该NALU的总长度,然后根据该长度读取相应的字节数,从而读取出整个NALU。

lengthSizeMinusOne为存贮NALUnitLength所需的空间减1,单位为字节。比如,lengthSizeMinusOne为2,那么存贮该路H.264码流的每个NALUnitLength所需的空间为3个字节。我们在读取每个NALU之前,先读3个字节,把读取到的数据转成整数,这就是该NALU的总长度了。

reserved:占3位,每个位的值都为1,即二进制的0b111。

numOfSequenceParameterSets:占5位,SPS的数目。根据该SPS的数目循环读取每个SPS对应的sequenceParameterSetLength和sequenceParameterSetNALUnit。

sequenceParameterSetLength:占16位(2字节),SPS的长度,单位为字节。

sequenceParameterSetNALUnit:包含NALU Header的该SPS的实际NALU数据。不定长,长度为sequenceParameterSetLength的值。

numOfPictureParameterSets:占8位,PPS的数目。根据该PPS的数目循环读取每个PPS对应的pictureParameterSetLength和pictureParameterSetNALUnit。

pictureParameterSetLength:占16位(2字节),PPS的长度,单位为字节。

pictureParameterSetNALUnit:包含NALU Header的该PPS实际的NALU数据,不定长,长度为pictureParameterSetLength的值。

当SPS的profile_idc为如下值时,AVCDecoderConfigurationRecord中还包含如下属性:

三、AVCDecoderConfigurationRecord实例分析

通过《音视频入门基础:H.264专题(2)------使用FFmpeg命令生成H.264裸流文件》中介绍的方法生成的H.264裸流文件是AnnexB包装的。MP4、FLV等文件格式常使用avcC封装的H.264。所以我们可以通过分析FLV文件来了解avcC和AVCDecoderConfigurationRecord。

按照《音视频入门基础:FLV专题(4)------使用flvAnalyser工具分析FLV文件》中介绍的方法,通过flvAnalyser工具打开一个视频压缩编码方式为H.264的FLV文件,分析其第一个Video Tag。下面红框中所示的就是AVCDecoderConfigurationRecord:

相关推荐
A向前奔跑7 小时前
前端实现实现视频播放的方案和面试问题
前端·音视频
TEL1892462247710 小时前
IT66612:1对2 HDMI主动分配器,配备EDID RAM和嵌入式MCU
音视频·实时音视频·视频编解码
9527华安13 小时前
Artix7系列FPGA实现SDI视频解码转CameraLink,基于GTP高速收发器+OSERDES2原语架构,提供2套工程源码和技术支持
fpga开发·架构·音视频
Black蜡笔小新18 小时前
视频汇聚平台EasyCVR赋能加油站安防构建全场景视频监控体系
音视频
MediaTea18 小时前
Python 库手册:wave WAV 音频读写工具
开发语言·python·音视频
EasyDSS18 小时前
视频推流平台EasyDSS无人机推流直播技术在智慧消防场景中的应用
音视频·无人机
八月的雨季 最後的冰吻19 小时前
FFmepg-- 39-ffplay源码-ffplay 播放器中视频输出和尺寸变换
c++·音视频
ZEGO即构开发者19 小时前
uni-app 集成音视频 SDK 全攻略:30 分钟搭建跨端视频通话功能
uni-app·音视频·视频通话功能
简鹿视频21 小时前
avi如何转wmv?avi格式转换wmv格式技巧
windows·microsoft·音视频
Black蜡笔小新1 天前
视频融合平台EasyCVR智慧农田可视化视频监控解决方案
音视频