H264(9)---------h264面试题
为什么要有YUV这种数据出来?(YUV相比RGB来说的优点)
1、yuv除了yuv444外,其他格式比如yuv422 yuv420 yuv411都要比rgb格式占的空间下。
Yuv444 和rgb占的空间一样大。
Yuv422 = y + u+ v = y + y/2 + y/2 = 2y,比rgb小1/3
Yuv420 = y + u + v = y + y/2/2 + y /2/2 = 1.5y ,比rgb 小1/2
Yuv411 = y + u + v = y + 1/4y + 1/4y = 1.5y ,比rgb 小1/2
2、YUV(也称YCbCr):Y标识明亮度,UV的作用是描述影像色彩及饱和度
Y是灰白
U绿色分量
V 红色分量
老的黑白电视机的数据只有一个Y分量,等到彩色电视剧出现的时候加入U和V分量。
H264/H265有什么区别?
宏块个数爆发式增加,宏块内容复杂度降低,运动失量大幅度增加。所以就诞生了H265.
H264宏块是16x16的,H265宏块会根据宏块的变化幅度来进行宏块划分。而H265的编码单位可以选择从最小的8x8到最大的64x64。
H265压缩率相对于H264压缩率理论上要少百分之50;
平常电视的帧率一般多少?30帧?高清一般需要60帧?
平常电视、动画是25帧/s,游戏是30帧/s。高清是清晰度,超过720p就是高清了。帧率和平滑度有关。
SPS有什么作用?
1、通过profile 我们知道视频的压缩级别,支持的特性
2、通过level 我们知道视频可以支持的分辨率和比特率
3、我们可以通过pic_width_in_mbs_minus1 ,pic_heigh_in_mbs_minus1计算出视频的宽带和高度
4、frame _mbs_only_flag 明白是场编码那个是帧编码
5、log2_max_frame_num_minus4 获取得到GOP最大的帧数
6、max_num_ref_frames 获取参考帧的帧数
7、pic_order_cnt_type 计算帧的序号
8、可以计算得出帧率
PPS有什么作用?
指定熵编码,图片的分片(通常每张图像是一片),是否开启权重预测
Slice Header 有什么作用?
定义了解码顺序,当前slice中包含的第一个宏块在整帧中的位置;分片的量化器的值。
pic_parameter_set_id:当前slice所依赖的pps的id;
colour_plane_id:当标识位separate_colour_plane_flag为true时,colour_plane_id表示当前的颜色分量,0、1、2分别表示Y、U、V分量。
field_pic_flag:场编码标识位。当该标识位为1时表示当前slice按照场进行编码;该标识位为0时表示当前slice按照帧进行编码。
bottom_field_flag:底场标识位。该标志位为1表示当前slice是某一帧的底场;为0表示当前slice为某一帧的顶场。
idr_pic_id:表示IDR帧的序号。某一个IDR帧所属的所有slice,其idr_pic_id应保持一致。该值的取值范围为[0,65535]。
pic_order_cnt_lsb:表示当前帧序号的另一种计量方式。
delta_pic_order_cnt_bottom:表示顶场与底场POC差值的计算方法,不存在则默认为0;
H264的编解码框架?

编码:
档案帧Fn如果是I帧,那么就会选择帧内预测(Intra prediction),然后再生成和原始数据的残差值。经过变换,量化,重排序,熵编码形成所需要的数据。
当前帧如果是P B 帧,和参考帧进行对比,经过Me(宏匹配)运动估计,然后再加上MC运动补偿然后再加上残差值,在进行变化,量化,重排序和熵编码形成所需要的数据。
解码
先经过熵编码的解压缩,再进行排序,逆量化,逆变换后,将残差值和预测值叠加形成没有滤波的帧,再经过滤波器重构出输出图像。
H264的码流结构?

H264当中是一个一个NALU单元。
NALU包含一个NALU Header和一个NALU Body
NALU Header是一个字节,第一位是禁止位,第二三位是重要性标志位,数值越大越重要,第三到七位是NALU类型。
NALU Body中是RBSP数据,RBSB 是按字节算的,SODB是原始bit数据,按位存储。为了便于后续处理,所以就在SODB后加上一个1,多个0。让数据按字节对齐形成了RBSP。
SODB分为Slice Header Slice Data。
SliceData当中存的是一个一个宏块。每个宏块又包含宏块类型,宏块预测,残差值。
什么是PPI 什么DPI?
PPI 每英存上拥有的像素数
DPI 每英存上用用的点数。
超过300PPi 就是视网膜屏幕了。