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 条评论