H264帧格式解析 详解H264Annexb与AVCC格式解析 天天观点
H264帧格式解析:
文章目录
(资料图片仅供参考)
H264帧基础知识 一组图像 GOPIDR帧与I帧P帧B帧H264 profile levelH264码率控制H264 Annexb byte-stream格式 NALU headerNALU start-codeH264 AVCC格式 extradata结构详解H264 Annexb与AVCC格式转换 H264 Annexb转为AVCCAVCC 转为 H264 Annexb
H264帧基础知识
一组图像 GOP
所谓GOP就是1组图像Group of Picture,在这一组图像中有且只有1个I帧,多个P帧或B帧,两个I帧之间的帧数,就是一个GOP。GOP一般设置为编码器每秒输出的帧数,即每秒帧率,一般为25或30,当然也可设置为其他值。在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP 开始才有可能得以恢复,所以GOP值也不宜设置过大。由于P、B帧的复杂度大于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。另外,过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。
IDR帧与I帧
在I帧中,所有宏块都采用帧内预测的方式,因此解码时仅用I帧的数据就可重构完整图像,不需要参考其他画面而生成。
H.264中规定了两种类型的I帧:普通I帧(normal Iframes)和IDR帧(InstantaneousDecoding Refresh, 即时解码刷新)。 IDR帧实质也是I帧,使用帧内预测。IDR帧的作用是立即刷新,会导致DPB(Decoded Picture Buffer参考帧列表)清空,而I帧不会。所以IDR帧承担了随机访问功能,一个新的IDR帧开始,可以重新算一个新的Gop开始编码,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。如果一个视频中没有IDR帧,这个视频是不能随机访问的。所有位于IDR帧后的B帧和P帧都不能参考IDR帧以前的帧,而普通I帧后的B帧和P帧仍然可以参考I帧之前的其他帧。IDR帧阻断了误差的积累,而I帧并没有阻断误差的积累。
一个GOP序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像,但I帧不一定都是IDR帧,只有GOP序列的第1个I帧是IDR帧。
I帧:帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)它是一个帧内压缩编码帧,压缩比约为7。它将全帧图像信息进行JPEG压缩编码及传输;解码时仅用I帧的数据就可重构完整图像;I帧描述了图像背景和运动主体的详情;I帧不需要参考其他画面而生成;I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;I帧不需要考虑运动矢量;I帧所占数据的信息量比较大。
疑问:按照GOP、IDR帧、I帧的解释,如果一个GOP出现除去第一个IDR帧之外的I帧,是不存在的,那这样的话,就不存在非IDR的I帧了,可是为什么还要说明非IDR的I帧呢。
解答:H264编码存在多种编码方式CBR、VBR、CVBR、ABR等等,VBR编码模式下图像内容变化差异很大时,会动态调整I帧的数量,因此GOP的概念需要修正:两个IDR帧之间的间隔为一组GOP,一组GOP中可以出现非IDR的I帧。
P帧
P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面,P帧没有完整画面数据,只有与前一帧的画面差异的数据。P帧的压缩率20
P帧是I帧后面相隔1~2帧的编码帧;P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;由于P帧是参考帧,它可能造成解码错误的扩散;由于是差值传送,P帧的压缩比较高。
B帧
B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,约为50,但是解码时CPU会比较累。
B帧是由前面的I或P帧和后面的P帧来进行预测的B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量B帧是双向预测编码帧B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;B帧不是参考帧,不会造成解码错误的扩散。
H264 profile level
BP-Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;EP-Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;MP-Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),也支持CAVLC 和CABAC 的支持;HP-High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、无损视频编码和更多的YUV 格式。
一般可以输出H264帧的USB摄像头,使用的是BP-Baseline Profile,只有I帧与P帧。
H264码率控制
VBR:Variable BitRate,动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion发生时,马赛克很少。码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码率(似乎码字更合适),图像内容复杂则分配较多的码字,这样既保证了质量,又兼顾带宽限制。这种算法优先考虑图像质量。
ABR:Average BitRate,平均比特率 是VBR的一种插值参数。ABR在指定的文件大小内,以每50帧 (30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量,可以做为VBR和CBR的一种折衷选择。
CBR:Constant BitRate,是以恒定比特率方式进行编码,有Motion发生时,由于码率恒定,只能通过增大QP来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。优点是压缩速度快,缺点是每秒流量都相同容易导致空间浪费。
CVBR:Constrained Variable it Rate,VBR的一种改进,兼顾了CBR和VBR的优点:在图像内容静止时,节省带宽,有Motion发生时,利用前期节省的带宽来尽可能的提高图像质量,达到同时兼顾带宽和图像质量的目的。这种方法通常会让用户输入最大码率和最小码率,静止时,码率稳定在最小码率,运动时,码率大于最小码率,但是又不超过最大码率。
H264 Annexb byte-stream格式
SODB:String of Data Bits,数据 bit 流,最原始的编码数据RBSP:Raw Byte Sequence Payload,原始字节序列载荷,在SODB的后面填加了结尾比特,RBSP trailing bits 一个bit“1”,若干比特“0”,以便字节对齐EBSP:Encapsulated Byte Sequence Payload,扩展字节序列载荷,在RBSP基础上填加了仿校验字节(0x03)。Start-code:在NALU加到Annexb即byte-stream格式时,需要在每组NALU之前添加开始码StartCode,如果该NALU对应的slice为1个GOP开始则用4位字节表示,0x00000001,否则用3位字节表示0x000001(也不一定)。
NALU header
bit位描述
F禁止位,0表示正常,1表示错误,一般都是0
NRI重要级别,11表示非常重要,一般取值为11、10、01
Type:nal_unit_type表示该NALU的类型是什么,类型的具体取值可见下表
nal_unit_typeNAL类型
0未使用
1非IDR的片
2片数据A分区
3片数据B分区
4片数据C分区
5一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧
6补充增强信息单元(SEI)
7序列参数集(SPS)
8图像参数集(PPS)
9分界符
10序列结束
11码流结束
12填充
13…23保留
24…31未使用
NALU Header常见的取值:0x67 0x68 0x65 0x61,0x47 0x48 0x45 0x41,0x27 0x28 0x25 0x21
NALU header描述
0x67,0x47,0x27SPS, 序列参数集,重要级别分别为11、10、01
0x68,0x48,0x28PPS,图像参数集,重要级别分别为11、10、01
0x65,0x45,0x25IDR帧,重要级别分别为11、10、01
0x61,0x41,0x21非IDR帧,重要级别分别为11、10、01
NALU start-code
一个NALU包中的数据并不包含它的大小(长度)信息,因此不能简单的连接NALU包来建立一个流,因为你不知道一个包从哪里结束,另一个包从哪里开始。 Annex B格式用起始码来解决这个问题,即给每个NALU加上前缀码:2个或者3个0x00,后面再加一个0x01, 如:0x000001或者0x00000001。 4字节类型的开始码通常只用于标识流中的随机访问点,如SPS PPS AUD和IDR,然后其他地方都用3字节类型的开始码以减少数据量。
如果该NALU对应的slice为1个GOP开始则用4位字节表示,0x00000001,否则用3位字节表示0x000001(不一定)防竞争字节:为了使NALU主体中不包括与开始码相冲突的,在编码时,就插入一个字节的0x03;解码时将0x03去掉。也称为脱壳操作。编码器将每个NAL各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NAL的分界,并依次取出NAL进行解码。每个NAL前有一个起始码 0x00 00 01(或者0x00 00 00 01),解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。同时H.264规定,当检测到0x000000时,也可以表征当前NAL的结束。那么NAL中数据出现0x000001或0x000000时怎么办?H.264引入了防止竞争机制,如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样: 0x000000->0x00000300 0x000001->0x00000301 0x000002->0x00000302 0x000003->0x00000303 解码器检测到0x000003时,把03抛弃,恢复原始数据。解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。
H264 AVCC格式
Annex-B:没有NALU长度字节,使用start code分隔NALU,start code为三字节或四字节,0x000001或0x00000001,一般是四字节;SPS和PPS按流的方式写在一组GOP之前。AVCC:使用NALU长度,固定字节,通常为4字节,分隔NALU;一般在每个NALU头部为4字节大端格式的长度字节,在一组GOP的头部包含extradata结构,用于存储sequence-header、SPS、PPS数据。虽然AVCC格式不使用起始码,防竞争字节仍然存在
extradata结构详解
namelength, unit: bitvalue
version8bit0x01
avc profile8bit0x64
avc compatibility8bit0x00
avc level8bit0x0A
NALULengthSizeMinusOne8bit0xFF,高6位保留,默认为1,低2位为11,表示NALU长度用3+1=4字节表示
number of SPS NALUs8bit0xE1,高3位保留,低5位表示有几个SPS,通常只有1个SPS
SPS size16bit大端格式的SPS长度,0x0019,表示25字节SPS
SPS NALU dataSPS size × 8bit0x67到0x80,表示SPS数据
number of PPS NALUs8bit0x01PPS个数,通常只有1个PPS
PPS size8bit0x07,表示PPS的数据长度
PPS NALU dataPPS size × 8bit0x68到0x30,表示PPS数据
NALULengthSizeMinusOne解释:这个变量告诉我们用几个字节来存储NALU的长度,如果NALULengthSizeMinusOne是0,那么每个NALU使用一个字节的前缀来指定长度,那么每个NALU包的最大长度是255字节,这个明显太小了,使用2个字节的前缀来指定长度,那么每个NALU包的最大长度是64K字节,也不一定够,一般分辨率达到1280*720 的图像编码出的I帧,可能大于64K;3字节是比较完美的,但是因为一些原因(例如对齐)没有被广泛支持;因此4字节长度的前缀是目前使用最多的方式,
H264 Annexb与AVCC格式转换
H264 Annexb转为AVCC
1、对于一个GOP的开始,根据start-code,分离出SPS、PPS帧,并分别计算出长度2、根据SPS, PPS创建出extradata,附加到GOP的头部3、从IDR帧开始,搜索start-code,分离出每一个NALU,计算长度,然后将start-code转为4字节的NALU长度
AVCC 转为 H264 Annexb
1、对于一个GOP的开始,首先检索出extradata部分的数据2、根据extradata数据创建出SPS帧,并用4字节的start-code:0x00000001附加在SPS数据的头部3、根据extradata数据创建出PPS帧,并用4字节的start-code:0x00000001附加在PPS数据的头部,并将PPS数据连接到SPS后面4、根据NALU的长度字段,分离出每一个NALU,然后用用4字节的start-code:0x00000001替换长度字段5、在以上过程中需要计算每一个NALU的长度,尤其是GOP的IDR帧,一般在IDR帧前还有SPS与PPS帧,其长度需要一起计算。
标签:
相关推荐:
最新新闻:
- qqpctray.exe是什么?qqpctray.exe程序占用率高怎么办?
- VEX为什么要用到中间表达式?为什么要用到VEX?|环球头条
- 天天热门:中国大学MOOC网站资源点汇总(收藏)
- 环球今热点:【全国计算机等级考试】2级公共基础120题之四(11)
- DirectSound能帮我们做什么?DirectSound开发指南 天天观察
- test.c测试游戏:测试三子棋的逻辑-最新资讯
- 中国“北斗”卫星导航系统——定位模块需求介绍
- 每日信息:pp助手安装失败怎么办?PP助手修复方法
- 世界速读:5.0以下的主流图片加载框架有哪些?安卓加载图片四大框架
- javascript首字母字符串开发教程 用于获取汉字的首字母拼音的开发方法|天天快资讯
- 磁盘垃圾文件清理器是什么?python接收命令行参数的方式及步骤-今日热讯
- iOS13越狱教程:如何安装AppSync和afc2补丁?
- C语言基础知识入门 C语言的具体结构
- 如何获取xlsx的Excel文件行数?xlsx的Excel文件使用方法 即时
- 当前资讯!在哪里看股指期货的行情?股指期货行情信息
- 热门看点:【激活码】180天诺顿NAVirus2012版本安装
- 操作系统中死锁的算法——银行家算法-环球播报
- 天天信息:如何使用视频剪辑软件将qsv格式视频转换为MP4格式?方法步骤
- H264帧格式解析 详解H264Annexb与AVCC格式解析 天天观点
- 笔记本电脑当无线路由器怎么设置?设置流程|天天观热点
- 全球快消息!进销存软件哪家强?上百种进销存软件大比拼
- 每日简讯:乔尔演员想看《最后的生还者》第二季还原“乔尔之死”:最真实的版本
- 《漫漫长夜》将于4月16日离开XGP
- 荷兰弟新剧定档6月9日:在片中演精神病人|当前快讯
- 央视探访天马科技集团 | 出口内销两旺,鳗鱼产业迎来消费利好!
- N64Switch在线追加《宝可梦竞技场2》4月12日上线
- 英国实体周榜:春季游戏没人打得过《生化4重制》
- 佩蒂特:梅西被嘘简直是对足球的侮辱!
- 发行商Devolver收购《枪伞游侠》开发商doinksoft 天天热消息
- 英特尔宋继强:面向半导体“万亿时代”,以全栈创新推动算力发展_环球观焦点
- 惠普第9代游戏家族重磅发布,助力玩家 玩出内力 再来亿把|环球实时
- 出游踏青随手拍出美景 逛京东手机焕新季入手爆款新机更超值
- 快用苹果助手如何安装?快用苹果助手安装不了怎么办?
- XLUEOPS.exe是什么?XLUEOPS.exe删除的方法
- Cydia源是什么?Cydia软件卸载步骤
- dnf画面卡是怎么回事?DNF卡屏最快解决方法是什么?
- 聚焦:观察|2023年在未来五年中发挥什么样的重要作用
- MP3Resizer如何压缩MP3文件?MP3Resizer安装及使用教程
- 任务管理器打不开怎么办?任务管理器打不开解决方法
- 无线网络连接不可用怎么办?无线网络连接不可用的解决方法
- 环球精选!穷人靠变异!DC新片《蓝甲虫》预告:拉丁超英来袭
- 本地网速测试有哪些方法?本地网速测试方法
- 如何设置使用激活工具oem7F7?oem7F7使用激活方法介绍
- win10运行lol一直崩溃怎么办?win10运行lol一直崩溃解决方法
- 88e6060是什么芯片?88e6060特性和好处
- 视频如何转换为AMV格式?AMV转换精灵操作方法
- LOL图标怎么点亮?qq上的英雄联盟图标怎么点亮?
- desktop.ini是什么文件?desktop.ini可以删除吗?
- 怎么用win10制作iso镜像文件?win10制作iso镜像文件的步骤教程
- 为什么电脑看视频卡住不动?电脑看视频卡怎么办?
- 有哪些是强制要求支付赡养费的情形? 报资讯
- 欧洲任天堂为漂移Joy-Con手柄提供保外维修
- 要闻:《守望先锋2》新辅助英雄“生命编织者”透露
- 当前最新:Xbox第一方游戏《量子破碎》将离开XGP阵容
- 挑战Steam Deck!华硕打造自己的掌机ROG Ally
- 云智能看护摄像头49元 环球简讯
- 维珍轨道公司正式关闭其太空发射业务_全球看点
- 环球热议:比亚迪汽车3月各车型销量出炉:卖爆了
- 只有手掌大小!12代新酷睿N100迷你主机低至789元:环球微头条
- 出租房必备 格兰仕微波炉只要249元 快播报
- 环球热文:《卧底公民》已登陆PS4/5 Steam获特别好评
- Switch里养一只猫咪《电子猫咪宠物》4月发售 焦点要闻
- 全球动态:空气压缩机油箱爆炸的原因是什么?_送男朋友生日礼物送什么好便宜真诚
- 他54岁担任福建省委副书记,曾多次保护赖昌星,57岁被判刑13年
- 开发者:顽皮狗新作将是全新IP!知名演员参与配音:世界快报
- HP发布暗影精灵9系列游戏本:RTX 4080干到13999元 要闻速递
- 埃文斯谈回归漫威:我很喜欢美队 但现在有些不对劲
- 《DOTA2》柏林Major 4月26日开打 奖金50万美元-全球速递
- 《龙与地下城:侠盗荣耀》北美开画夺冠
- 通灵学院钥匙任务前置_通灵学院的骷髅钥匙和观察室钥匙怎么弄
- 帅丰电器赋能终端,助力集成灶门店实现财富共赢
- 帅丰电器荆州集成灶门店开业活动启动会圆满成功! 当前热点
- 天天百事通!帅丰电器集成灶+集成水槽新品齐上线 速来一睹丰华
- vivo X Flip真机曝光:外屏超大 当前快讯
- 苹果手表被曝令手腕烫伤 真相来了