精华内容
下载资源
问答
  • SPS PPS

    2017-04-22 10:20:42
     NALU_TYPE_PPS =8,  NALU_TYPE_AUD =9,  NALU_TYPE_EOSEQ = 10,  NALU_TYPE_EOSTREAM = 11,  NALU_TYPE_FILL =12, #if (MVC_EXTENSION_ENABLE)  NALU_TYPE_PREFIX = 14,  NALU_...

    这是一段H264码流,00 00 00 01这是对应forbidden_zero_bit的f(1),接着后面的nal_ref_idc的u(2),这个怎么解呀,有点晕。刚接触不久,nal_unit_type的u(5),后面的profile_idc的u(8)指的是那几个,是多少?

    满意回答

    00 00 00 01Start code后面的ox67 0110 0111

    forbidden_zero_bit 是禁止位,应该是第一位即f(1)=01为语法有错误

    nal_ref_idc是参考级别,代表被其它帧参考情况,u(2)= 11 = 3最(0为无参考,详见规范)

    nal_unit_type是该帧的类型,为剩下的5位,u(5)= 0 0111 = 7

     

    NOTE:这是NALU类型,非Slice类型,这里只能判断NALU类型,不能继续判断是普通i还是pslice类型

     

    NALU类型:

    目前类型有:

    //H264定义的类型 values for nal_unit_type

    typedef enum {

     NALU_TYPE_SLICE    = 1,

     NALU_TYPE_DPA      =2,

     NALU_TYPE_DPB      =3,

     NALU_TYPE_DPC      =4,

     NALU_TYPE_IDR      =5,

     NALU_TYPE_SEI      =6,

     NALU_TYPE_SPS      =7,

     NALU_TYPE_PPS      =8,

     NALU_TYPE_AUD      =9,

     NALU_TYPE_EOSEQ    = 10,

     NALU_TYPE_EOSTREAM = 11,

     NALU_TYPE_FILL     =12,

    #if (MVC_EXTENSION_ENABLE)

     NALU_TYPE_PREFIX   = 14,

     NALU_TYPE_SUB_SPS  = 15,

     NALU_TYPE_SLC_EXT  = 20,

     NALU_TYPE_VDRD     =24  // View and Dependency Representation Delimiter NAL Unit

    #endif

    } NaluType;

    可以看出是NALU_TYPE_SPS  sequence parameter sets

     

    H264档次: 

    profile_idcu(8)则是后面的“64”转化为十进制则是100

    66 Baseline

    77 Main

    88 Extended

    100 High (FRExt)

    110 High 10 (FRExt)

    122 High 4:2:2 (FRExt)

    144 High 4:4:4 (FRExt)

     

    100High (FRExt)

    展开全文
  • 本文档讲叙如何从mp4文件中查找 sps pps等和h264编码信息相关的内容,同时介绍了h264 raw 流中 naul单元的分类。
  • c++提取spspps

    2017-02-18 23:29:10
    c+提取h264的sps pps,从ffmpeg中提取出来的,亲测可用
  • spspps头.zip

    2019-08-08 15:31:48
    内含30w、720p、1080p图像的sps pps头,可用来给解码器解码,只需把内容复制到码流的最前面就可以了
  • h264协议sps pps解析

    2016-09-02 14:46:51
    h264协议sps pps解析
  • SPS PPS详解

    千次阅读 2018-02-23 11:18:11
    https://zhuanlan.zhihu.com/p/27896239https://zhuanlan.zhihu.com/p/27896239首发于DaveBobo的多媒体...2 SPSPPS中的每个参数起什么作用?3 如何解析SDP中包含的H.264的SPSPPS串?1 客户端抓包在做客户端视...

    https://zhuanlan.zhihu.com/p/27896239

    https://zhuanlan.zhihu.com/p/27896239


    H264码流中SPS PPS详解

    H264码流中SPS PPS详解

    DaveBobo DaveBobo
    7 个月前
    • 1 SPS和PPS从何处而来?
    • 2 SPS和PPS中的每个参数起什么作用?
    • 3 如何解析SDP中包含的H.264的SPS和PPS串?

    1 客户端抓包

    在做客户端视频解码时,一般都会使用Wireshark抓包工具对接收的H264码流进行分析,如下所示:

    在这里我们可以看到对解码视频起关键作用的SPS和PPS。

    双击SPS内容如下:

    双击PPS内容如下:

    那么从上面的sps中我们知道图像的宽,高。

    宽=(19+1 )*16=320

    高=(14+1)*16=240

    为什么?参考下面

    2 SPS PPS详解

    2.1 SPS语法元素及其含义

    在H.264标准协议中规定了多种不同的NAL
    Unit类型,其中类型7表示该NAL Unit内保存的数据为Sequence Paramater
    Set。在H.264的各种语法元素中,SPS中的信息至关重要。如果其中的数据丢失或出现错误,那么解码过程很可能会失败。SPS及后续将要讲述的图像参数集PPS在某些平台的视频处理框架(比如iOS的VideoToolBox等)还通常作为解码器实例的初始化信息使用。

    SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded
    video
    sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。一般情况SPS和PPS的NAL
    Unit通常位于整个码流的起始位置。但在某些特殊情况下,在码流中间也可能出现这两种结构,主要原因可能为:

    • 解码器需要在码流中间开始解码;
    • 编码器在编码的过程中改变了码流的参数(如图像分辨率等);

    在做视频播放器时,为了让后续的解码过程可以使用SPS中包含的参数,必须对其中的数据进行解析。其中H.264标准协议中规定的SPS格式位于文档的7.3.2.1.1部分,如下图所示:

    其中的每一个语法元素及其含义如下:

    (1) profile_idc:

    标识当前H.264码流的profile。我们知道,H.264中定义了三种常用的档次profile:

    基准档次:baseline profile;

    主要档次:main profile;

    扩展档次:extended profile;

    在H.264的SPS中,第一个字节表示profile_idc,根据profile_idc的值可以确定码流符合哪一种档次。判断规律为:

    profile_idc = 66 → baseline profile;

    profile_idc = 77 → main profile;

    profile_idc = 88 → extended profile;

    在新版的标准中,还包括了High、High 10、High 4:2:2、High 4:4:4、High 10 Intra、High
    4:2:2 Intra、High 4:4:4 Intra、CAVLC 4:4:4 Intra等,每一种都由不同的profile_idc表示。

    另外,constraint_set0_flag ~ constraint_set5_flag是在编码的档次方面对码流增加的其他一些额外限制性条件。

    在我们实验码流中,profile_idc = 0x42 = 66,因此码流的档次为baseline profile。

    (2) level_idc

    标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。

    当前码流中,level_idc = 0x1e = 30,因此码流的级别为3。

    (3) seq_parameter_set_id

    表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。

    (4) log2_max_frame_num_minus4

    用于计算MaxFrameNum的值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 +
    4)。MaxFrameNum是frame_num的上限值,frame_num是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段。

    (5) pic_order_cnt_type

    表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。

    (6) log2_max_pic_order_cnt_lsb_minus4

    用于计算MaxPicOrderCntLsb的值,该值表示POC的上限。计算方法为MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)。

    (7) max_num_ref_frames

    用于表示参考帧的最大数目。

    (8) gaps_in_frame_num_value_allowed_flag

    标识位,说明frame_num中是否允许不连续的值。

    (9) pic_width_in_mbs_minus1

    用于计算图像的宽度。单位为宏块个数,因此图像的实际宽度为:

    frame_width = 16 × (pic\_width\_in\_mbs_minus1 + 1);

    (10) pic_height_in_map_units_minus1

    使用PicHeightInMapUnits来度量视频中一帧图像的高度。PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:

    PicHeightInMapUnits = pic\_height\_in\_map\_units\_minus1 + 1;

    (11) frame_mbs_only_flag

    标识位,说明宏块的编码方式。当该标识位为0时,宏块可能为帧编码或场编码;该标识位为1时,所有宏块都采用帧编码。根据该标识位取值不同,PicHeightInMapUnits的含义也不同,为0时表示一场数据按宏块计算的高度,为1时表示一帧数据按宏块计算的高度。

    按照宏块计算的图像实际高度FrameHeightInMbs的计算方法为:

    FrameHeightInMbs = ( 2 − frame_mbs_only_flag ) * PicHeightInMapUnits

    (12) mb_adaptive_frame_field_flag

    标识位,说明是否采用了宏块级的帧场自适应编码。当该标识位为0时,不存在帧编码和场编码之间的切换;当标识位为1时,宏块可能在帧编码和场编码模式之间进行选择。

    (13) direct_8x8_inference_flag

    标识位,用于B_Skip、B_Direct模式运动矢量的推导计算。

    (14) frame_cropping_flag

    标识位,说明是否需要对输出的图像帧进行裁剪。

    (15) vui_parameters_present_flag

    标识位,说明SPS中是否存在VUI信息。

    2.2 PPS语法元素及其含义

    除了序列参数集SPS之外,H.264中另一重要的参数集合为图像参数集Picture Paramater
    Set(PPS)。通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL
    Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。

    在H.264的协议文档中,PPS的结构定义在7.3.2.2节中,具体的结构如下表所示:

    其中的每一个语法元素及其含义如下:

    (1) pic_parameter_set_id

    表示当前PPS的id。某个PPS在码流中会被相应的slice引用,slice引用PPS的方式就是在Slice header中保存PPS的id值。该值的取值范围为[0,255]。

    (2) seq_parameter_set_id

    表示当前PPS所引用的激活的SPS的id。通过这种方式,PPS中也可以取到对应SPS中的参数。该值的取值范围为[0,31]。

    (3) entropy_coding_mode_flag

    熵编码模式标识,该标识位表示码流中熵编码/解码选择的算法。对于部分语法元素,在不同的编码配置下,选择的熵编码方式不同。例如在一个宏块语法元素中,宏块类型mb_type的语法元素描述符为“ue(v)
    | ae(v)”,在baseline profile等设置下采用指数哥伦布编码,在main profile等设置下采用CABAC编码。

    标识位entropy_coding_mode_flag的作用就是控制这种算法选择。当该值为0时,选择左边的算法,通常为指数哥伦布编码或者CAVLC;当该值为1时,选择右边的算法,通常为CABAC。

    (4) bottom_field_pic_order_in_frame_present_flag

    标识位,用于表示另外条带头中的两个语法元素delta_pic_order_cnt_bottom和delta_pic_order_cn是否存在的标识。这两个语法元素表示了某一帧的底场的POC的计算方法。

    (5) num_slice_groups_minus1

    表示某一帧中slice group的个数。当该值为0时,一帧中所有的slice都属于一个slice group。slice group是一帧中宏块的组合方式,定义在协议文档的3.141部分。

    (6) num_ref_idx_l0_default_active_minus1、num_ref_idx_l0_default_active_minus1

    表示当Slice Header中的num_ref_idx_active_override_flag标识位为0时,P/SP/B
    slice的语法元素num_ref_idx_l0_active_minus1和num_ref_idx_l1_active_minus1的默认值。

    (7) weighted_pred_flag

    标识位,表示在P/SP slice中是否开启加权预测。

    (8) weighted_bipred_idc

    表示在B Slice中加权预测的方法,取值范围为[0,2]。0表示默认加权预测,1表示显式加权预测,2表示隐式加权预测。

    (9) pic_init_qp_minus26和pic_init_qs_minus26

    表示初始的量化参数。实际的量化参数由该参数、slice header中的slice_qp_delta/slice_qs_delta计算得到。

    (10) chroma_qp_index_offset

    用于计算色度分量的量化参数,取值范围为[-12,12]。

    (11) deblocking_filter_control_present_flag

    标识位,用于表示Slice header中是否存在用于去块滤波器控制的信息。当该标志位为1时,slice header中包含去块滤波相应的信息;当该标识位为0时,slice header中没有相应的信息。

    (12) constrained_intra_pred_flag

    若该标识为1,表示I宏块在进行帧内预测时只能使用来自I和SI类型宏块的信息;若该标识位0,表示I宏块可以使用来自Inter类型宏块的信息。

    (13) redundant_pic_cnt_present_flag

    标识位,用于表示Slice header中是否存在redundant_pic_cnt语法元素。当该标志位为1时,slice header中包含redundant_pic_cnt;当该标识位为0时,slice header中没有相应的信息。

    3 解析SDP中包含的H.264的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进行解析,下载地址:download.csdn.net/downl

    用法是在命令行中输入:

    spsparser sps.txt pps.txt output.txt

    例如sps.txt中的内容为:

    Z0LgFNoFglE=

    pps.txt中的内容为:

    aM4wpIA=

    最终解析得到的结果为:

    这里需要特别提一下这两个参数

    pic_width_in_mbs_minus1 = 21

    pic_height_in_mbs_minus1 = 17

    分别表示图像的宽和高,以宏块(16x16)为单位的值减1

    因此,实际的宽为 (21+1)*16 = 352 高为 (17+1)*16 = 288

    到这里应该知道第一部分客户端抓包计算图像宽高遗留下来的问题了吧。

    Reference:

    cnblogs.com/lidabo/p/65

    blog.csdn.net/heanyu/ar

    blog.csdn.net/shaqoneal

    blog.csdn.net/shaqoneal


    如果文章对更多的朋友有益,请分享到朋友圈。【视音频图像技术干货,流媒体、图像算法、


    展开全文
  • H264 sps pps解析

    热门讨论 2013-01-18 16:35:24
    可在linux下编译通过的c++ sps pps解析类。读取文件(包中有测试文件),解析结果显示在打印里。可自行修改。
  • c+提取h264的sps pps

    2017-02-18 23:34:08
    c+提取h264的sps pps,从ffmpeg中提取出来的,亲测可用
  • H264码流中SPS PPS详解

    千次阅读 2017-07-12 21:25:56
    1 SPSPPS从何处而来?2 SPSPPS中的每个参数起什么左右?3 如何解析SDP中包含的H.264的SPSPPS串? 1 客户端抓包  在做客户端视频解码时,一般都会使用Wireshark抓包工具对接收的H264码流进行分析,如下所示: ...
    • 1 SPS和PPS从何处而来?
    • 2 SPS和PPS中的每个参数起什么作用?
    • 3 如何解析SDP中包含的H.264的SPS和PPS串?
    1 客户端抓包
        在做客户端视频解码时,一般都会使用Wireshark抓包工具对接收的H264码流进行分析,如下所示:

    在这里我们可以看到对解码视频起关键作用的SPS和PPS。
    双击SPS内容如下:

    双击PPS内容如下:

    那么从上面的sps中我们知道图像的宽,高。
    宽=(19+1 )*16=320
    高=(14+1)*16=240
    <
    展开全文
  • 这是由Java脚本编写的解析器,用于解析H.26 sps / pps。 简介 以在线解析器为例
  • H264 sps pps 解析

    2017-08-08 10:39:31
    这里介绍一个简单的方法:通过webrtc实现sps pps的解析; 当前的webrtc版本是58; 可以参考: h264_bitstream_parser_unittest.cc 文件,示例说明; 主要解析实现:h264_bitstream_parse

    关于H264的结构解析,最基本的方法就是根据官方文档自己根据标准解析;

    或者从网上直接找到开源函数解析出结构体;


    这里介绍一个简单的方法:通过webrtc实现sps pps的解析;

    当前的webrtc版本是58;


    可以参考: h264_bitstream_parser_unittest.cc 文件,示例说明;


    主要解析实现:h264_bitstream_parser.h 和 h264_bitstream_parser.cpp;


    展开全文
  • VPS SPS PPS

    千次阅读 2019-09-03 23:20:39
    注意:对于一个视频序列,无论它每一层的SPS是否相同,都参考相同的VPS。 序列参数集SPS SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的...
  • sps pps分析

    千次阅读 2017-05-23 11:37:33
    264码流的开始部分必须要有spspps,否则解析不了。 1.00 00 00 01 67 SPS 2.00 00 00 01 68 PPS 3.00 00 00 01 65 I帧 下面实际的打印信息: E/ScreenRecord( 7386): INFO_FORMAT_CHANG
  • FFmpeg 获取H264流中的sps pps

    千次阅读 2017-11-08 19:02:44
    原文地址:... FFmpeg 获取H264流中的sps pps 原创 2015年02月03日 13:45:15 标签:ffmpeg /sps /pps H.264的SPSPPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的p
  • H264码流中SPS PPS

    2019-03-22 16:49:29
    转载地址:https://www.cnblogs.com/wainiwann/p/7477794.html 1 SPSPPS从何处而来? 2 SPSPPS中的每个参数起什么作用? 3 如何解析SDP中包含的H.264的SPSPPS串?
  • h264 sps pps详解

    万次阅读 2017-03-03 23:21:14
    1、学习路线 step1、初步了解h264,了解h264数据帧分类和识别 step2、h264专业名词解析 step3、spspps帧语法定义 2、h264简介   3、h264名词解析   4、sps语法   5、pps语法
  • SPS PPS介绍

    2016-03-03 13:46:00
    H.264码流第一个 NALU 是 SPS(序列参数集Sequence Parameter Set) H.264码流第二个 NALU 是 PPS(图像...H.264的SPSPPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的...
  • H264码流中NALU sps pps IDR帧的理解 1、概念 什么是NALU? H264码流可以分为两层,VCL层和NAL层,NAL的全称是Network abstraction layer,叫网络抽象层,它保存了H264相关的参数信息和图像信息,NAL层由多个...
  • SPS PPS NALU

    2016-07-11 17:14:50
    转自http://www.cnblogs.com/Hatim/p/5238284.html ...。。 H.264码流第一个 NALU 是 SPS(序列参数集Sequence Parameter Set) H.264码流第二个 NALU 是 PPS(图像参
  • h264 sps pps笔记

    2017-01-13 15:41:17
    SPS(序列参数集Sequence Parameter Set) PPS(图像参数集Picture Parameter Set) ... 由结构分析可知NALU header(Start Code后的下一个字节)占1个字节,其中NALU Type位于低5位,sps=7,pps=8 所以判断
  • 本文内容是ffmpeg通过spspps的信息解析视频宽高和yuv格式,ffmpeg对这个支持没有对外接口,可以参考下面文章。 http://ffmpeg.org/pipermail/ffmpeg-devel/2015-July/176434.html。 如果想解析请看下面: /* ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,321
精华内容 2,928
关键字:

SPS、PPS