05|码流结构:原来你是这样的H264
H264 的编码结构
- 深入了解
- 翻译
- 解释
- 总结
H264编码的码流结构对于视频工程开发至关重要。本文深入解析了H264编码的码流结构,包括帧类型、GOP、Slice、NALU等概念。帧类型包括I帧、P帧和B帧,它们的区别在于编码方式和依赖关系。GOP以IDR帧为分隔点,影响编码效率和视频seek操作。Slice作为并行编码设计的基本单元,可以提升编码速度,但也会影响帧内预测性能。文章还详细介绍了H264的码流结构,包括码流格式、NALU数据和不同类型的NALU的区分方式。此外,文章还提供了解决工程上常见问题的方法,如判断多Slice对应同一帧、从SPS中获取图像的宽高以及计算得到QP值。通过本文,读者可以快速了解H264编码的码流结构及解决工程问题的方法,为视频工程开发提供了重要的技术参考。
《攻克视频技术》,新⼈⾸单¥59
全部留言(40)
- 最新
- 精选
- aikeke老师能推荐下好用的h264字段分析工具吗?
作者回复: Elecard或者VQAnalyzer都挺好的,我用的VQAnalyzer。
2021-12-02211 - smartB帧需要双向参考,pts 和 dts 不一致。因此需要等待后面的 p 帧解码后才能继续,从而引入了延时。
作者回复: 嗯嗯,编码的时候也是一样的,需要先等后面的P帧先编码才能编码B帧。
2021-12-0111 - Chris Zou老师,ts文件中是不是就是含起始码的码流,而mp4文件就是不含起始码的mp4码流?
作者回复: 是的
2021-12-136 - 晓龙想问一下老师,起始码和NALU的关系是,起始码是用来区分PPS,SPS,I,B,P帧,然后I,B,P帧内部,又有由多个Slice/NALU组成是吧? 也就是说,I 帧和B帧中间用起始码分割,然后I帧内部,又会再被Slice分割?
作者回复: 起始码用来分隔一个个NALU的,每一个Slice都是放在一个NALU里面,而I、P、B这些帧,每一帧又可以是一个或多个Slice。也就是说起始码分隔的是Slice不是帧,同一个I帧有多个Slice的话,也是会有起始码分隔的。
2021-12-026 - tony老师请教一下如下问题: 1. 判断一帧起始以及结束是否可以使用fu-a的start以及end标识位? 2. 判断哪几个slice属于同一个帧是否可以使用slice header中的frame number? 3. rtc中编码时为什么不采用sp帧?这样丢弃了某一参考帧,还能恢复出来 4. 有些书上说h264码流结构设计为具有良好网络亲和性的,从哪些方面特征可以表现出来?
作者回复: 1、不可以,fu-a的start和end标志位只能用来判断slice的开头和结尾。一帧可以有多个slice,所以不能这样判断。 2、不可以,因为多个帧的frame number可以相同,而且frame num有最大值,到了最大值又会从0开始。 3、RTC中有SVC的,不一定需要连续参考,也可以解决这个问题。 4、应该是说NALU这个东西吧,里面会nalu type这个字段吧。而且slice header里面没有使用复杂的CAVLC和CABAC的熵编码,更容易解析出来。可以不用完全解码出整个帧,提前做一些可解码性判断。比如说这节课里面的first_mb_in_slice字段用来判断帧的开头和结尾这种操作。
2021-12-244 - qingzhu(1)“00 00 00”修改为“00 00 03 00”; 会不会原始编码中也存在“00 00 03 00”的冲突?
作者回复: 不会,因为原始的00 00 03 00中的00 00 03会被修改为00 00 03 03,所以是可以区分的。
2021-12-0244 - 我有一条鱼问题: 那B帧相对于P帧来说能减少多少大小吗?有相关的数据吗?
作者回复: 使用一个B帧大概提升10%左右
2021-12-031 - 晓龙iOS Video Toolbox 可以参考这一篇 https://www.cnblogs.com/tangyuanby2/p/11449460.html, 对照老师的课程,融会贯通
作者回复: 嗯嗯,一起学习交流,又问题可以给我留言。
2021-12-021 - paradiseB帧因为双向参考的缘故,编码和解码都存在时延,特别是在倒放的时候比较麻烦,所以安防领域都不使用B帧编码。 感谢江哥细致的讲解
作者回复: 嗯嗯,谢谢支持。
2021-12-021 - 武丽权老师,想问下,文章里面所指的I帧,P帧,B帧是因为帧内宏块的预测方式决定的吗,还是说不同帧决定了该帧内宏块的预测方式。这里不是很理解,希望得到老师的解惑
作者回复: 不同帧决定了帧内可用的预测方式
2023-03-06归属地:广东2