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:

  1. profile_idc = 66 // 77 means: main profile,
  2. constrained_set0_flag = 1
  3. constrained_set1_flag = 1
  4. constrained_set2_flag = 1
  5. constrained_set3_flag = 0
  6. level_idc = 20 // level=3.1 support 720pHD formatenable interface support 27648000 sampeles/sec
  7. seq_parameter_set_id = 0
  8. chroma_format_idc = 1 // 色彩格式 0:单色模式,1:yuv420,2:yuv422 3:yuv444
  9. bit_depth_luma_minus8 = 0 // 指定了亮度矩阵的比特深度及亮度量化参数范围偏移量;此处取0,表示每个亮度像素用8位表示,QpDboffset0;
  10. bit_depth_chroma_minus8 = 0 // bit_depth_luma_minus8类似,不过针对的是色度
  11. seq_scaling_matrix_present_flag = 0 //
  12. log2_max_frame_num_minus4 = 0 // frame_num 所能达到的最大值,MaxFrameNum = 2*exp(log2_max_frame_num_minus4 + 4)
  13. pic_order_cnt_type = 2 //
  14. log2_max_pic_order_cnt_lsb_minus4 = 0
  15. delta_pic_order_always_zero_flag = 0
  16. offset_for_non_ref_pic = 0
  17. offset_for_top_to_bottom_field = 0
  18. num_ref_frames_in_pic_order_cnt_cycle = 0
  19. num_ref_frames = 1
  20. gaps_in_frame_num_value_allowed_flag = 0
  21. pic_width_in_mbs_minus1 = 21
  22. pic_height_in_mbs_minus1 = 17
  23. frame_mbs_only_flag = 1
  24. mb_adaptive_frame_field_flag = 0
  25. direct_8x8_interence_flag = 0 // 用于指明B片的直接和skip模式下运动矢量的预测方法
  26. frame_cropping_flag = 0 // 用于指明解码器是否要将图像裁剪后输出,如果是的话,后面紧跟着的四个左右、上下裁剪的宽度。
  27. frame_cropping_rect_left_offset = 0
  28. frame_cropping_rect_right_offset = 0
  29. frame_cropping_rect_top_offset = 0
  30. frame_cropping_rect_bottom_offset = 0
  31. vui_parameters_present_flag = 0 // 指明vui子结构是否出现在码流中,vui 用以表征视频格式等额外信息

Start dumping PPS:

  1. pic_parameter_set_id = 0 // 指明了在切片头中对应的某个SPS,值应该在[0,255]
  2. seq_parameter_set_id = 0 // 表示激活SPS,值应该在[0,31]
  3. entropy_coding_mode_flag = 0 // 解码方法上使用的方法。0:表示使用Exp-Golomb编码方式, 1:表示使用CABAC方法
  4. pic_order_present_flag = 0 // 1:切片头中图像顺序值存在,0:表示不存在
  5. num_slice_groups_minus1 = 0 // 加上1表示一个图像中的切片组数目,为0时,图像所有切片属于同一组
  6. slice_group_map_type = 0 // 表示从切片组单到切片组的映射方法,值可以取[0,6],0表示插值切片组
  7. num_ref_idx_l0_active_minus1 = 0 // 指明参考图像列表0中的最大参考索引值,它被用来解码图像的每一个切片,列表0在此值为0时被使用,
  8. // MbaffFrameFlag1时,解码帧宏块的最大索引值.....啥几把..........
  9. num_ref_idx_l1_active_minus1 = 0 // 针对列表1来说的
  10. weighted_pref_flag = 0 // 0:表示加权预测在PSP切片中没有被使用. 1:表示被使用
  11. weighted_bipred_idc = 0 // 0:表示默认的加权预测被应用到B切片中,表示外部的加权预测被应用到B切片中,
  12. //2:表示内部的加权预测被应用到B切片中
  13. pic_init_qp_minus26 = 0 // 指出了对于每个切片来说的SliceQPY的初始值减26,初始值在切片层中当非0slice_qp_delta被解码后时改变,
  14. //在非0mb_qp_delta值被在宏块层解码时再次被改变,值应该取-26到+25
  15. pic_init_qs_minus26 = 0 // 指出了对于SPSI切片中的SliceQSY的被始值减26.这个初始值在切片层中当一个非0slice_qs_delta被解码的时候被修改。
  16. // 值的取值为[-26,25]
  17. chroma_qp_index_offset = 10 // 表示在查QPC表时,对于QPYQSY应该加上的偏移量。值为[-12,12]
  18. deblocking_filter_control_present_flag = 1 // 1:表示在切片头处用来控制解块滤波的特征值是存在的.0:表示在切片头处用来控制解块滤波的特征值是不存在的
  19. constrained_intra_pred_flag = 0 // 0:表示在帧内预测的时候允许剩余数据和邻近宏块解码采样,1:表示在受限的帧内预测,对宏块预测中使用帧内宏块预测模式只使用剩余数据和从ISI宏块类型中的解码采样值.
  20. redundant_pic_cnt_present_flag = 0 // 0:表示redundant_pic_cnt在切片头中,数据分区B和数据分区C中不存在. 1:表示redundant_pic_cnt在所有切片头中,数据分区B和数据分区C中存在.
  21. transform_8x8_mode_flag = 0 // 1:代表亮度宏块以及4:4:4的色度宏块会采用8x8DCT,此时亮度宏块以及4:4:4的色度宏块的滤波边界会把宏块分割成8x8的块。
  22. pic_scaling_matrix_present_flag = 0 // 0:表示SPS中不存在修改scaling_list的参数
  23. second_chroma_qp_index_offset = 10 // 表示在查QPC表时,对于QPYQSY应该加上的偏移量,值应该在[-12,12]