https://www.jianshu.com/p/219e01b9252d

https://zhuanlan.zhihu.com/p/516506635

https://www.zhihu.com/question/381527055/answer/2788317082

https://zhuanlan.zhihu.com/p/578518804

https://zhuanlan.zhihu.com/p/574205874 (清晰)
https://zhuanlan.zhihu.com/p/500538442 (全)

视频为什么要编码(压缩)

https://zhuanlan.zhihu.com/p/563045067

概念

一、基本概念

  • 序列
  • 帧类型
    I/P/B/IDR
  • GOP(帧组)
    两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。

二、压缩方式

  • 帧内压缩(消除空间冗余)
    有损压缩技术
  • 帧间压缩 (消除时间冗余)
  • DCT
    整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。
  • CABAC压缩
    无损压缩技术

三、码流结构

https://blog.csdn.net/m0_68918744/article/details/123907744

https://zhuanlan.zhihu.com/p/516506635
https://blog.csdn.net/weixin_41422027/article/details/101768023
https://zhuanlan.zhihu.com/p/485677873
https://zhuanlan.zhihu.com/p/559580191
https://www.cnblogs.com/linuxAndMcu/p/14533228.html

H264码流组成,从大到小排序依次是:

H264视频序列、图像、片组、片、NALU、宏块、像素。

H.264的基本流(elementary stream)就是一系列NALU的集合

1.码流分层

https://blog.csdn.net/Poisx/article/details/121726566
https://zhuanlan.zhihu.com/p/654901998
https://blog.csdn.net/ET_Endeavoring/article/details/129812378

  • NAL分层

  • Slice及宏块分层

  • 视频序列的可视化表达

2.NAL单元(NALU)

https://blog.csdn.net/u014415274/article/details/124103377 (十分详细)
https://blog.csdn.net/qq_35703954/article/details/84595484

1)NALU的格式与分层

NALU流的格式为start_code+NALU_unit

startcode

https://cloud.tencent.com/developer/article/2020422

start_code:NALU的起始码为0x000001或0x00000001(起始码包括两种:3 字节(0x000001) 和 4 字节(0x00000001),在 SPS、PPS 和 Access Unit 的第一个 NALU 使用 4 字节起始码,其余情况均使用 3 字节起始码。)

NALU格式
一个NALU=一组对应视频编码的NALU头部信息 + 一个原始字节序列负荷(RBSP,RAW Byte Sequence Paload)
一个原始的NALU单元结构包含:
[NALU head] + [NALU payload]三部分,其中start code是一个NALU单元开始,用来分割各个NALU.

NALU格式:

单元的信息头(一个字节)定义了RBSP单元的类型,NAL单元其余部分为RBSP数据。

NALU分层结构

注意这里是按照功能分层,并非框架分层。

  • 视频编码层(VCL即Video Coding Layer):负责高效的视频内容表示,这是核心算法引擎,其中对宏块、片的处理都包含在这个层级上,它输出的数据是SODB;

  • 网络适配层(NAL即Network Abstraction Layer):以网络所要求的恰当方式对数据进行打包和发送,比较简单,先报VCL吐出来的数据SODB进行字节对齐,形成RBSP,最后再RBSP数据前面加上NAL头则组成一个NALU单元。

NALU分层目的:VCL只负责视频的信号处理,包含压缩,量化等处理,NAL解决编码后数据的网络传输,这样可以将VCL和NAL的处理放到不同平台来处理,可以减少因为网络环境不同对VCL的比特流进行重构和重编码;

2)NALU详解
NALU头结构

NALU的第一个字节即为NALU类型,将其转为二进制数据后,解读顺序从左往右算,如下:

第1位为禁止位,值为1表示语法错误
第2,3位为参考级别
第4-8位是NAL单元类型。

264常见的帧头数据为:

00 00 00 01 67 (SPS)        67的二进制表示:0110 0111

00 00 00 01 68 (PPS)        68的二进制表示:0110 1000

00 00 00 01 65 ( IDR 帧)    65的二进制表示:0110 0101

00 00 00 01 61 (P帧)        61的二进制表示:0110 0001
SODB、RBSP和EBSP的基本概念

https://www.jianshu.com/p/5f89ea2c3a28 (*)
https://zhuanlan.zhihu.com/p/547358971
SODB:数据比特串,即编码后的最原始的数据;

RBSP:原始字节序列载荷,即在SODB的后面添加了trailing bits,即一个bit 1和若干个bit 0,以便字节对齐

EBSP:扩展字节序列载荷,即在RBSP的基础上添加了仿校验字节0x03. (就是防止NALU的RBSP中有00 00 00 01这样与起始码冲突的字节)

三者联系:SODB->RBSP->EBSP
SODB是编码收的原始数据,经过封装后为RBSP,RBSP是NAL单元的数据部分的封装格式。在NAL内部为了防止与起始码竞争,从而引入填充字节0x03,这样便形成了EBSP。

NALU类型

通常情况我们看到的NLAU类型就是SPS(7)、PPS(8)、SEI、IDR的slice(5)、非IDR这几种。

  • sps与pps
    https://zhuanlan.zhihu.com/p/588403821
    一般情况 SPS 和 PPS 的 NAL Unit 通常位于整个码流的起始位置。 封装文件一般进保存一次,位于文件头部, SPS/PPS 在整个解码过程中复用,不发生变化。 然而对于实时流,通常是从流中间开始解码,因此需要在每个 I帧 前添加 SPS 和 PPS ; 如果编码器在编码过程中改变了码流参数(如分辨率),需要重新调整 SPS 和 PPS 数据。
NALU冷门知识

https://blog.csdn.net/MACMACip/article/details/106761092

3.NALU解码过程

https://blog.csdn.net/weixin_39399492/article/details/133165018

H264官方文档

如何看懂官方文档:https://www.cnblogs.com/jyfyonghu/p/10486071.html

句法元素:https://blog.csdn.net/xiaojun111111/article/details/40107559


0 条评论

发表回复

您的电子邮箱地址不会被公开。