攻克视频技术
李江
声网 Agora 视频专家
7494 人已学习
新⼈⾸单¥59
登录后,你可以任选3讲全文学习
课程目录
已完结/共 19 讲
攻克视频技术
15
15
1.0x
00:00/00:00
登录|注册

05|码流结构:原来你是这样的H264

你好,我是李江。
上一节课我们一起讨论了视频编码的基本原理。今天,我们就接着来聊聊视频编码的码流结构,这在视频开发工作中是非常重要的。
视频编码标准其实有很多,比如上一节课讲到的 H264、H265、AV1 等,但原理大同小异,都是预测、变换、量化和熵编码等几个步骤。H264 编码可以说是最常用的编码标准,比较经典,所以这节课我们就以 H264 为例来讲解码流结构。在掌握了这些之后,迁移学习其它编码标准的码流结构也就简单多了。
视频编码的码流结构其实就是指视频经过编码之后得到的二进制数据是怎么组织的,换句话说,就是编码后的码流我们怎么将一帧帧编码后的图像数据分离出来,以及在二进制码流数据中,哪一块数据是一帧图像,哪一块数据是另外一帧图像。
而我们在工程开发中,需要对编码后的数据进行一些解析,以便用于之后的打包。同时我们在打包时也需要判断当前一帧图像数据它的开头和结尾在哪。这些工作的前提就是我们要清楚如何分析编码码流,那么码流结构到底是怎样的,就是当下的学习重点了。
下面我们就以 H264 编码为基础,分析一下它的码流结构,并看看它在工程中是如何应用的。

H264 的编码结构

这里有一些前置知识我们需要先了解一下。我们先一起来看几个重要的概念吧。它们之间有这样一条线索,你在接下来的学习中可以重点关注一下,对于你记忆它们也是非常有帮助的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

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-02
    2
    11
  • smart
    B帧需要双向参考,pts 和 dts 不一致。因此需要等待后面的 p 帧解码后才能继续,从而引入了延时。

    作者回复: 嗯嗯,编码的时候也是一样的,需要先等后面的P帧先编码才能编码B帧。

    2021-12-01
    11
  • Chris Zou
    老师,ts文件中是不是就是含起始码的码流,而mp4文件就是不含起始码的mp4码流?

    作者回复: 是的

    2021-12-13
    6
  • 晓龙
    想问一下老师,起始码和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-02
    6
  • 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-24
    4
  • 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-02
    4
    4
  • 我有一条鱼
    问题: 那B帧相对于P帧来说能减少多少大小吗?有相关的数据吗?

    作者回复: 使用一个B帧大概提升10%左右

    2021-12-03
    1
  • 晓龙
    iOS Video Toolbox 可以参考这一篇 https://www.cnblogs.com/tangyuanby2/p/11449460.html, 对照老师的课程,融会贯通

    作者回复: 嗯嗯,一起学习交流,又问题可以给我留言。

    2021-12-02
    1
  • paradise
    B帧因为双向参考的缘故,编码和解码都存在时延,特别是在倒放的时候比较麻烦,所以安防领域都不使用B帧编码。 感谢江哥细致的讲解

    作者回复: 嗯嗯,谢谢支持。

    2021-12-02
    1
  • 武丽权
    老师,想问下,文章里面所指的I帧,P帧,B帧是因为帧内宏块的预测方式决定的吗,还是说不同帧决定了该帧内宏块的预测方式。这里不是很理解,希望得到老师的解惑

    作者回复: 不同帧决定了帧内可用的预测方式

    2023-03-06归属地:广东
    2
收起评论
显示
设置
留言
40
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部