Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192607
  • 博文数量: 71
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-13 14:49
文章分类
文章存档

2017年(1)

2015年(5)

2014年(10)

2013年(55)

我的朋友

分类: LINUX

2015-08-07 17:06:30

原文地址:H264相关知识 作者:poseidonqiu

使用RTSP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter Set (PPS) 需要用到,那么这两项从哪里获取呢?答案是从H264码流中获取.在H264码流中,都是以"0x00 0x00 0x01"或者"0x00 0x00 0x00 0x01"为开始码的,找到开始码之后,使用开始码之后的第一个字节的低5位判断是否为7(sps)或者8(pps), 及data[4] & 0x1f == 7 || data[4] & 0x1f == 8.然后对获取的nal去掉开始码之后进行base64编码,得到的信息就可以用于sdp.sps和pps需要用逗号分隔开来.


H.264 PPS成员值含义

1. pic_parameter_set_id
pic_parameter_set_id指明了在切片头中对应的某个psp.pic_parameter_set_id的值应该在0到255,包括0和255
2. seq_parameter_set_id
set_parameter_set_id表示激活的sps.seq_parameter_set_id应该取值在0到31之间,包括边界值.
3. entropy_coding_mode_flag
entropy_coding_mode_flag决定了在解码方法上使用的方法.
如果entropy_coding_mode_flag为0的话,就使用Exp-Golomb编码方法
如果entropy_coding_mode_flag为1的话,就使用CABAC方法.
4. pic_order_present_flag
pic_order_present_flag等于1表示在切片头中图像顺序值存在,pic_order_present_flag为0表示切片头中的图像顺序值不存在
5. num_slice_groups_minus1
num_slice_groups_minus1加上1表示一个图像中的切片组数目.当num_slice_groups_minus1为0时,图象所有的切片属于同一组.
6. slice_group_map_type
slice_group_map_type表示从切片组单到切片组的映射方法.slice_group_map_type的值可以取0到6.
slice_group_map_type=0表示插值切片组.
slice_group_map_type=1表示分散切片组映射
slice_group_map_type=2表示一个或多个"前景"切片组和一个"剩余"切片组.
slice_group_map_type=3,4,5时,表示变换切片组.当num_slice_groups_minus1不不1时,slice_group_map_type应该不为3,4,5.
slice_group_map_type=6时,表示从外部对对于每个切片组单元进行外部的切片赋值.
如果frame_mbs_only_flag为0而且mb_adaptive_frame_field_flag为1且编码图像是一帧的话,切片组映射单元是宏块对
如果frame_mbs_only_flag为1而且mb_adaptive_frame_field_flag为1且编码图像是一场的话,切片组映射单元是宏块
其他的情况下,切片组单元是两个宏块,它们在一帧宏块对中是垂直连续的
7.run_length_minus1[i]
被用来赋给在光栅扫描中第i个切片组指明连续切片组单元的数量.run_length_minus1[i]的取值应为0到PicSizeInMapUnits-1.
top_left[ i ] and bottom_right[ i ] specify the top-left and bottom-right corners of a rectangle, respectively. top_left[ i ] and bottom_right[ i ] are slice group map unit positions in a raster scan of the picture for the slice group map units. For each rectangle i, all of the following constraints shall be obeyed by the values of the syntax elements top_left[ i ] and bottom_right[ i ]
8.top_left[i] and bottom_right[i]
top_left[i] and bottom_right[i]指出了矩形区左上角和右下角.top_left[i] and bottom_right[i]是对于一个切片组的图像的光栅扫描位置.对于每个矩形i,top_left[i] and bottom_right[i]应该满足所有的以下的约束:

a) top_left[i]应该比bottom_right[i]小或等于,bottom_right[i]应该比PicSizeInMapUnits的值小.
b) (top_left[i]%PicWidthInMbs)应该比(bottom_right[i]%PicWidthInMbs)的值小或等于.
9. slice_group_change_direction_flag
在slice_group_map_type为3,4,5时跟slice_group_map_type一块儿来提取生成映射类型,
10.slice_group_change_rate_minus1
slice_group_change_rate_minus1用来指明SliceGroupChangeRate变量的 值.SliceGroupChangeRate指出当切片组的大小对于每个图像来说都不同的时候,对切片组数目的运算的乘 数.slice_group_change_rate_minus1取值范围为0到PicSizeInMapUnits-1:
SliceGroupChangeRate = slice_group_change_rate_minus1+1;
11. pic_size_in_map_units_minus1
pic_size_in_map_units_minus1用来指明在一个图象中使用的切片组映射单元的数目.pic_size_in_map_units_minus1应该等于PicSizeInMapUnits-1.
12. slice_group_id[i]
slice_group_id[i]说明了切片组单元中由光栅扫描顺序指定的第i个切片组.slice_group_id[i]应该取0到num_slice_groups_minus1.
13. num_ref_idx_l0_active_minus1
指明了参考图像列表0中的最大参考索引值,它被用来解码图像的每一个切片,列表0在num_ref_idx_active_override_flag值 为0的时候被使用.当MbaffFrameFlag值为1时,num_ref_idx_l0_active_minus1是解码帧宏块的最大索引值,而2 * num_ref_idx_10_active_minus1 + 1是解码场宏块的最大索引值.num_ref_idx_l0_active_minus1的取值为0到31.
14. num_ref_idx_l1_active_minus1与num_ref_idx_l0_active_minus1
有相同的语义,只不过它是针对列表1来说的.
15.weighted_pred_flag
weighted_pred_flag=0表示加权预测在P和SP切片中没有被使用
weighted_pred_flag=1表示加权预测在P和SP切片中有使用.
16. weighted_bipred_idc
weighted_bipred_idc=0表示默认的加权预测被应用到B切片中.
weighted_bipred_idc=1表示外部的加权预测被应用到B切片中.
weighted_bipred_idc=2表示内部的加权预测被应用到B切片中.
weighted_bipred_idc的取值为0,1,2.
17.pic_init_qp_minus26
指出了对于每个切片来说的SliceQPY的初始值减26.初始值在切片层中当非0的slice_qp_delta被解码后时改变,在非0的mb_qp_delta值被在宏块层解码时再次被改变.pic_init_qp_minus26应该取-26到+25.
18. pic_init_qs_minus26
pic_init_qs_minus26指出了对于SP或SI切片中的SliceQSY的被始值减26.这个初始值在切片层中当一个非0的slice_qs_delta被解码的时候被修改.pic_init_qs_minus26的取值为-26到25.
19.chroma_qp_index_offset
chroma_qp_index_offset表示在查QPC表时,对于QPY和QSY应该加上的偏移量.chroma_qp_index_offset取值为-12到12
20. deblocking_filter_control_present_flag
deblocking_filter_control_present_flag=1表示在切片头处用来控制解块滤波的特征值是存在的.
deblocking_filter_control_present_flag=0表示在切片头处用来控制解块滤波的特征值是不存在的.
21. constrained_intra_pred_flag
constrained_intra_pred_flag=0表示在帧内预测的时候允许剩余数据和邻近宏块解码采样.
constrained_intra_pred_flag=1表示在受限的帧内预测,对宏块预测中使用帧内宏块预测模式只使用剩余数据和从I和SI宏块类型中的解码采样值.
22. redundant_pic_cnt_present_flag
redundant_pic_cnt_present_flag=0表示redundant_pic_cnt在切片头中,数据分区B和数据分区C中不存在.
redundant_pic_cnt_present_flag=1表示redundant_pic_cnt在所有切片头中,数据分区B和数据分区C中存在.


H.264有四种画质级别
分别是BP、EP、MP、HP:

  1、BP-Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
  2、EP-Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;
  3、MP-Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),
    也支持CAVLC 和CABAC 的支持;
  4、HP-High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、
    无损视频编码和更多的YUV 格式;

想要说明H.264 HP与H.264 MP的区别就要讲到H.264的技术发展了。JVT于2003年完成H.264基本部分标准制定工作,包含Baseline profile、Extended profile和Main profile,分别包括不同的编码工具。之后JVT又完成了H.264 FRExt(即:Fidelity Range Extensions)扩展部分(Amendment)的制定工作,包括High profile(HP)、High 10 profile(Hi10P)、High 4:2:2 profile(Hi422P)、High 4:4:4 profile(Hi444P)4个profile。

  H.264 Baseline profile、Extended profile和Main profile都是针对8位样本数据、4:2:0格式的视频序列,FRExt将其扩展到8~12位样本数据,视频格式可以为4:2:0、4:2:2、 4:4:4,设立了High profile(HP)、High 10 profile(Hi10P)、High 4:2:2 profile(Hi422P)、High 4:4:4 profile(Hi444P) 4个profile,这4个profile都以Main profile为基础。

在相同配置情况下,High profile(HP)可以比Main profile(MP)节省10%的码流量,比MPEG-2 MP节省60%的码流量,具有更好的编码性能。根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域,High profile则多应用于广电和存储领域。

H.264 Baseline Profile对应MPEG-4 SP
H.264 Main Profile对应MPEG-4 ASP
H.264 Extended Profile对应MPEG-4 ARTS or FGS
H.264 Baseline Profile对应MPEG-4 Studio。

I帧 P帧 B帧概念

简单的说,就是三种不同预测帧.
I帧:只作为参考帧 采用帧内预测
P帧:只能以前面的I帧或P帧作为参考帧
B帧:以它前面的I帧或P帧和后面的P帧作为参考帧

H264 中的 SP/SI

SP和SI是在h264中引入的新技术,其目的是为了适应视频流的带宽自适应性和抗误码性能的要求,以更好的提供流媒体服务!

而所谓的SP帧其实就是能够参照不同的参考帧重构出相同的图像帧!(SI与SP的不同在于SI是基于帧内预测,而SP是基于帧间预测)
这里必须要提下流媒体服务的一些特征,因为网络的状况是一直在变化着的,有些时候比较繁忙,有些时候则比较空闲,针对不同的
网络条件,服务器端可能会提供好几路不同质量的数据服务,当网络堵塞时,提供比较差但码率较低的服务,当网络空闲的时候,则
提供码率高但质量优良的服务,而由于视频压缩是基于参考帧预测的基础之上,在不同条件下切换时,很可能出现参考帧丢失的问题,
如:

序列1    A1  A2  A3  A4  A5  SA  A6  A7  A8
                  Sab
序列2  B1  B2  B3  B4  B5  SB  B6  B7  B8

在序列1传输完A5之后,接下来想切换到序列2上去,那么会有一个问题,序列2中的B6很可能是参考的B1-B5 SB中的一帧,而由于这些
帧之前并没有接收到,所以B6无法正确解码,而且会进一步影响到后面参考B6预测出来的其它帧!
而此时引入SP/SI技术,B6可以根据A5以及Sab来得到!根据相同原理,SP/SI技术还可以应用到拼接,随机接入以及错误恢复等各个
领域中去!

在基本档和主要档中,并没有引入SP/SI,只有在扩展档中才有应用!


阅读(1802) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~