H.265/HEVC结构

SPS解析:

一段HEVC码流可能包含一个或者多个编码视频序列CVS,每个CVS由一个随机接入点开始,即IDR/BLA/CRA。在H.264和HEVC中,序列参数集SPS包含该CVS中所有slice需要的信息。SPS的内容大致可以分为几个部分:

1、自引ID;

2、解码相关信息,如档次级别、分辨率、子层数等;

3、某档次中的功能开关标识及该功能的参数;

4、对结构和变换系数编码灵活性的限制信息;

5、时域可分级信息;

6、VUI。

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

以下是对每一个语法元素的讨论解释:

1、sps_video_parameter_set_id :指定了当前活动的VPS的ID号,当前例子的取值为0,这也与前文的VPS解析的结果一直;

2、sps_max_sub_layers_minus1 : 该值+1表示引用该SPS的CVS所包含的最大时域子层数,取值范围0-6;本例取值为0,即只有1个时域子层;

3、sps_temporal_id_nesting_flag :标识时域可分级中的帧间预测参考帧的限制信息;此处该值取0【好像与标准文档里写的有点矛盾啊……】;

4、sps_seq_parameter_set_id :【其实在这个参数之前码流中还有很多数据没有解释清楚,留到以后看吧】本SPS的ID值,此处取0;

5、chroma_format_idc:色度采样格式,此处取值为1,代表采用4:2:0格式;

6、separate_colour_plane_flag :这个参数是4:4:4格式专用的,在本例中不存在;

7、pic_width_in_luma_samples和pic_height_in_luma_samples :图像的分辨率信息,用指数哥伦布编码,本例取176*144;

8、conformance_window_flag :指示一致窗口裁剪偏移参数conformance cropping window offset parameters的信息;此处取值为1,表示后续几位为conf_win_left_offset、conf_win_right_offset、conf_win_top_offset、conf_win_bottom_offset等参数;

9、bit_depth_luma_minus8 :指定了亮度矩阵的比特深度以及亮度量化参数范围偏移量;此处取0,表示每个亮度像素用8为表示,QpBdOffset参数为0;

10、bit_depth_chroma_minus8 :与bit_depth_luma_minus8类似,只不过是针对色度的;

11、log2_max_pic_order_cnt_lsb_minus4 :负责计算变量MaxPicOrderCntLsb的值【这个值是干嘛的……】;

12、sps_sub_layer_ordering_info_present_flag :时域子层顺序标识开关,该值取1,表示后续几位分别是sps_max_dec_pic_buffering、sps_num_reorder_pics、sps_max_latency_increase等参数;

13、log2_min_coding_block_size_minus3 :用于计算最小亮度CB的尺寸,此处取0;

14、log2_diff_max_min_coding_block_size :用于计算最大最小亮度CB尺寸的差值,此处取3;

15、log2_min_transform_block_size_minus2:用于计算最小TB尺寸,此处取0;

16、log2_diff_max_min_transform_block_size :用于计算最大最小TB尺寸的差值,此处取3;

17、max_transform_hierarchy_depth_inter :帧间模式CB中TB的最大层级深度,此处为2;

18、max_transform_hierarchy_depth_intra ::帧内模式CB中TB的最大层级深度,此处为2;

19、scaling_list_enabled_flag:标识是否在变换系数量化中使用量化列表,此处取0;

20、amp_enabled_flag :标识是否使用不对称运动划分,此处为1;

21、sample_adaptive_offset_enabled_flag :标识是否使用SAO,此处为1;

22、pcm_enabled_flag :标识是否使用PCM,此处为0,即不实用PCM数据;

23、num_short_term_ref_pic_sets :指示SPS中short_term_ref_pic_set( )这个结构的数目,此处为1;

24、long_term_ref_pics_present_flag :指示帧间预测中是否使用长期参考帧,此处为1,即使用长期参考帧;

25、sps_temporal_mvp_enable_flag :标识CVS中非IDR帧的条带头中是否包含slice_temporal_mvp_enabled_flag标识,此处为1,即含有;

26、sps_strong_intra_smoothing_enable_flag :标识平滑滤波过程中是否使用双线性差值方法,此处为1,即使用;

27、vui_parameters_present_flag :标识是否有vui_parameters()结构体,此处为0,即没有;

28、sps_extension_flag:sps扩展信息,取0,没有扩展。

从 AVCodecContext中获取sps,pps(FFmpeg)

我们需要明白我们需要的是什么?sps,pps!(他们不包括起始符0x00 00 00 01)

// 假设extradata数据为 0x01 64 00 0A FF E1 00 19 67 64 00 00...其中67开始为SPS数据,68开始为pps数据,67或者68的前一位为他们的size,如67的前一位19,它就是SPS的size ,因为是16进制,即25.

获取sps和pps

ffmpeg中的h265解析文件:hevc.c或者hevc_parse.c,mediacodecdec.c

如果你对音视频开发感兴趣,或者对本文的一些阐述有自己的看法,可以在下方的留言框给我留言,一起探讨。

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值