h264编码学习笔记

参考文献:https://blog.csdn.net/pds574834424/article/details/78150474
https://blog.csdn.net/huaxun66/article/details/53427771
https://www.jianshu.com/p/0d18f04e524d
https://www.jianshu.com/p/e6ca899a2192
https://www.jianshu.com/p/d9631596e9c7

整体视频通信流程如下。
采集 —>处理—>编码和封装—>服务器—>服务器流分发—>播放器流播放

网络提取层(NAL network abstraction layer )和视频编码层(VCL video coding layer)。
H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
H264原始码流是由一个接一个的NALU(Nal Unit)组成的,NALU = 开始码 + NAL类型 + 视频数据
H264有严格的规范,以00 00 00 01分割之后的下一个字节就是NALU类型,用来描述此帧的意义。
NALU类型:
(1)第1位禁止位,值为1表示语法出错
(2)第2~3位为参考级别
(3)第4~8为是nal单元类型

nal单元类型:
0,未使用
1,不分区,非IDR图像的片 ,类型为1表示这是一个P帧或B帧。
2,片分区A
3,片分区B
4,片分区C
5,IDR图像的片段
6,补充增强信息单元(SEI)
7,序列参数集sps
8,图像参数集pps
9,分界符
10,序列结束符
11,流结束符
12填充
13…23保留
24…31未使用

SPS:包括了一个图像序列的所有信息(包含的是针对一连续编码视频序列的参数,如标识符seq_parameter_set_id、帧数及POC的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等)
PPS:包括了一个图像所有片的信息(对应的是一个序列中某一副图像或者某几幅图像,参数如标识符pic_parameter_set_id、可选的seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等)
IDR帧和I帧:首个I帧叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像,不过I帧不一定是IDR图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空(DPB,DecodedPictureBuffer 参考帧列表),将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
DTS:Decode Time Stamp。DTS主要是标识读入内存中的bi t流在什么时候开始送入解码器中进行解码。在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。DTS主要用于视频的解码,在解码阶段使用.PTS主要用于视频的同步和输出.在display的时候使用.在没有B frame的情况下.DTS和PTS的输出顺序是一样的。

I帧:完整编码的帧,也叫关键帧
P帧:参考之前的I帧生成的只包含差异部分编码的帧
B帧:参考前后的帧编码的帧叫B帧
在H.264基准类中,仅使用I帧和P帧以实现低延时,因此是网络摄像机和视频编码器的理想选择。

码率、帧率、分辨率
帧率:单位为fps(frame pre second),视频画面每秒有多少帧画面,数值越大画面越流畅
码率:码率单位是kbps即千位每秒,视频每秒输出的数据量,数值越大画面越清晰
分辨率:视频画面像素密度,例如常见的720P、1080P等
关键帧间隔:每隔多久编码一个关键帧
软编码:使用CPU进行编码。性能较差
硬编码:不使用CPU进行编码,使用显卡GPU,专用的DSP、FPGA、ASIC芯片等硬件进行编码。性能较好

【码率】(kbps)=【文件大小】(字节 )X8 /【时间】(秒)

h264编码学习笔记_第1张图片

分辨率常用的有:
720480(标清480p)
1280
720(高清720p)
19201080(全高清1080p, 19202 * 1080*2 = 4k)
3840×2160(八百万像素的超高清4k,往上再4倍就是8k超高清)
其实含480p以下为标清,480p以上为高清,经典的有720p、1080i、1080p,1080p又称全高清。

Gop是指多少秒一个I帧。

带宽 / (码流 * 8) = 同时在线人数
文件大小 = 时间×码率/8

YUV格式:一种颜色编码方式,可以转化成我们常用的RGB色值。Y代表亮度,UV代表色值,Y可以显示一张完整的黑白图像。
YUV的原理是把亮度和色度分离,利用人眼对亮度的敏感度超过色度这个特性,我们偷摸摸把色度信息减少一些,人眼也很难察觉到。甚至没有色度信息(UV分量)依旧可以显示完整的图像,只不过是黑白的。
YUV的主流采样方式有:YUV4:4:4、YUV4:2:2、YUV4:2:0:
YUV4:4:4 每一个Y分量都有对应一组UV分量
YUV4:2:2 每两个Y分量共用一组UV分量
YUV4:2:0 每四个Y分量共用一组UV分量

你可能感兴趣的:(视频开发,学习)