1. 视频中的SPS/PPS
使用RTP传输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需要用逗号分隔开来。
SDP中的H.264的SPS和PPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。
由于SDP中的SPS和PPS都是BASE64编码形式的,不容易理解,附件有一个工具软件可以对SDP中的SPS和PPS进行解析。
Start dumping SPS:
profile_idc = 66 // 77 means: main profile,
constrained_set0_flag = 1
constrained_set1_flag = 1
constrained_set2_flag = 1
constrained_set3_flag = 0
level_idc = 20 // level=3.1 support 720pHD format,enable interface support 27648000 sampeles/sec
seq_parameter_set_id = 0
chroma_format_idc = 1 // 色彩格式 0:单色模式,1:yuv420,2:yuv422 3:yuv444
bit_depth_luma_minus8 = 0 // 指定了亮度矩阵的比特深度及亮度量化参数范围偏移量;此处取0,表示每个亮度像素用8位表示,QpDboffset为0;
bit_depth_chroma_minus8 = 0 // 与bit_depth_luma_minus8类似,不过针对的是色度
seq_scaling_matrix_present_flag = 0 //
log2_max_frame_num_minus4 = 0 // frame_num 所能达到的最大值,MaxFrameNum = 2*exp(log2_max_frame_num_minus4 + 4)
pic_order_cnt_type = 2 //
log2_max_pic_order_cnt_lsb_minus4 = 0
delta_pic_order_always_zero_flag = 0
offset_for_non_ref_pic = 0
offset_for_top_to_bottom_field = 0
num_ref_frames_in_pic_order_cnt_cycle = 0
num_ref_frames = 1
gaps_in_frame_num_value_allowed_flag = 0
pic_width_in_mbs_minus1 = 21
pic_height_in_mbs_minus1 = 17
frame_mbs_only_flag = 1
mb_adaptive_frame_field_flag = 0
direct_8x8_interence_flag = 0 // 用于指明B片的直接和skip模式下运动矢量的预测方法
frame_cropping_flag = 0 // 用于指明解码器是否要将图像裁剪后输出,如果是的话,后面紧跟着的四个左右、上下裁剪的宽度。
frame_cropping_rect_left_offset = 0
frame_cropping_rect_right_offset = 0
frame_cropping_rect_top_offset = 0
frame_cropping_rect_bottom_offset = 0
vui_parameters_present_flag = 0 // 指明vui子结构是否出现在码流中,vui 用以表征视频格式等额外信息
Start dumping PPS:
pic_parameter_set_id = 0 // 指明了在切片头中对应的某个SPS,值应该在[0,255]
seq_parameter_set_id = 0 // 表示激活SPS,值应该在[0,31]
entropy_coding_mode_flag = 0 // 解码方法上使用的方法。0:表示使用Exp-Golomb编码方式, 1:表示使用CABAC方法
pic_order_present_flag = 0 // 1:切片头中图像顺序值存在,0:表示不存在
num_slice_groups_minus1 = 0 // 加上1表示一个图像中的切片组数目,为0时,图像所有切片属于同一组
slice_group_map_type = 0 // 表示从切片组单到切片组的映射方法,值可以取[0,6],0表示插值切片组
num_ref_idx_l0_active_minus1 = 0 // 指明参考图像列表0中的最大参考索引值,它被用来解码图像的每一个切片,列表0在此值为0时被使用,
// 当MbaffFrameFlag为1时,解码帧宏块的最大索引值.....啥几把..........
num_ref_idx_l1_active_minus1 = 0 // 针对列表1来说的
weighted_pref_flag = 0 // 0:表示加权预测在P和SP切片中没有被使用. 1:表示被使用
weighted_bipred_idc = 0 // 0:表示默认的加权预测被应用到B切片中,表示外部的加权预测被应用到B切片中,
//2:表示内部的加权预测被应用到B切片中
pic_init_qp_minus26 = 0 // 指出了对于每个切片来说的SliceQPY的初始值减26,初始值在切片层中当非0的slice_qp_delta被解码后时改变,
//在非0的mb_qp_delta值被在宏块层解码时再次被改变,值应该取-26到+25。
pic_init_qs_minus26 = 0 // 指出了对于SP或SI切片中的SliceQSY的被始值减26.这个初始值在切片层中当一个非0的slice_qs_delta被解码的时候被修改。
// 值的取值为[-26,25]
chroma_qp_index_offset = 10 // 表示在查QPC表时,对于QPY和QSY应该加上的偏移量。值为[-12,12]
deblocking_filter_control_present_flag = 1 // 1:表示在切片头处用来控制解块滤波的特征值是存在的.0:表示在切片头处用来控制解块滤波的特征值是不存在的
constrained_intra_pred_flag = 0 // 0:表示在帧内预测的时候允许剩余数据和邻近宏块解码采样,1:表示在受限的帧内预测,对宏块预测中使用帧内宏块预测模式只使用剩余数据和从I和SI宏块类型中的解码采样值.
redundant_pic_cnt_present_flag = 0 // 0:表示redundant_pic_cnt在切片头中,数据分区B和数据分区C中不存在. 1:表示redundant_pic_cnt在所有切片头中,数据分区B和数据分区C中存在.
transform_8x8_mode_flag = 0 // 1:代表亮度宏块以及4:4:4的色度宏块会采用8x8的DCT,此时亮度宏块以及4:4:4的色度宏块的滤波边界会把宏块分割成8x8的块。
pic_scaling_matrix_present_flag = 0 // 0:表示SPS中不存在修改scaling_list的参数
second_chroma_qp_index_offset = 10 // 表示在查QPC表时,对于QPY和QSY应该加上的偏移量,值应该在[-12,12]