H.264码流分析

文章目录

  • H.264码流分析
    • H.264介绍
    • H.264的语法结构
    • 码流分析
      • SPS
      • PPS
      • 其他
        • summary
        • MB info
        • Pixel info
      • GOP
        • 每个图像帧的类型、所用的编码比特数、QP值
        • I帧
        • P帧
        • B帧
        • test.264分析
          • I帧
          • P帧
          • B帧

H.264介绍

H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC).

H.264的语法结构

其中Network Abstraction Layer,也就是常说的NAL,用于定义适合于任何信道传输和存储的数据格式,并提供头信息,从而为视频编码提供与外界的统一接口。
所有的数据都包含于NAL单元(NAL units)中,每个NAL单元包含整数个字节的数据。如果在有效载荷中包含位错误,则在NALU的头部设置标识。

码流分析

实验中使用视频如下:

SPS

SPS是指Sequence parameter set,即序列参数集

本次实验所用视频的SPS参数如下:

  1. profile_idc

    标识当前H.264码流的profile。

    H.264中定义了三种常用的档次profile:

    profile_idc = 66 → baseline profile;

    profile_idc = 77 → main profile;

    profile_idc = 88 → extended profile;

    观察上图可知profile_idc=100,查阅官方手册可知这段视频的格式是高级

  2. level_idc

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

    观察上图可知level_idc=31,也就是level=31

  3. seq_parameter_set_id

    表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。seq_parameter_set_id 的值应在 0-31 的范围内,包括 0 和 31。

    观察上图可知序列参数集id=0

  4. chroma_format_idc

    与亮度取样对应的色度取样。chroma_format_idc 的值应该在 0到 3 的范围内(包括 0 和 3)。当 chroma_format_idc 不存在时,应推断其值为 1( 4:2:0 的色度格式)。

    观察上图可知chroma_format_idc=1,推断为420色度格式

  5. bit_depth_luma_minus8

    指亮度队列样值的比特深度以及亮度量化参数范围的取值偏移。当 bit_depth_luma_minus8 不存在时,应推定其值为 0。bit_depth_luma_minus8 取值范围应该在 0 到 4 之间(包括 0 和 4)。

    观察上图可知该值为0

  6. bit_depth_chroma_minus8

    指色度队列样值的比特深度以及色度量化参数范围的取值偏移。当 bit_depth_chroma_minus8 不存在时,应推定其值为 0。bit_depth_chroma_minus8 取值范围应该在 0 到 4 之间(包括 0 和 4)。

    观察上图可知该值为0

  7. log2_max_frame_num_minus4

    用于计算MaxFrameNum的值,公式为: M a x F r a m e N u m = 2 ( l o g 2 _ m a x _ f r a m e _ n u m _ m i n u s 4 + 4 ) MaxFrameNum=2^{(log2\_max\_frame\_num\_minus4+4)} MaxFrameNum=2(log2_max_frame_num_minus4+4),MaxFrameNum是frame_num的上限值,frame_num是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段。

    观察上图可知 M a x F r a m e N u m = 2 ( l o g 2 _ m a x _ f r a m e _ n u m _ m i n u s 4 + 4 ) = 2 2 + 4 = 2 6 MaxFrameNum=2^{(log2\_max\_frame\_num\_minus4+4)}=2^{2+4}=2^6 MaxFrameNum=2(log2_max_frame_num_minus4+4)=22+4=26

  8. pic_order_cnt_type

    指解码图像顺序的计数方法,取值范围是0~2

    观察上图可知该值为0

  9. log2_max_pic_order_cnt_lsb_minus4

    用于计算MaxPicOrderCntLsb的值,该值表示POC的上限。计算方法为 M a x P i c O r d e r C n t L s b = 2 ( l o g 2 _ m a x _ p i c _ o r d e r _ c n t _ l s b _ m i n u s 4 + 4 ) MaxPicOrderCntLsb = 2^{(log2\_max\_pic\_order\_cnt\_lsb\_minus4 + 4 )} MaxPicOrderCntLsb=2(log2_max_pic_order_cnt_lsb_minus4+4) pic_order_cnt_type

    **观察上图可知 M a x P i c O r d e r C n t L s b = 2 ( l o g 2 _ m a x _ p i c _ o r d e r _ c n t _ l s b _ m i n u s 4 + 4 ) = 2 3 + 4 = 2 7 MaxPicOrderCntLsb = 2^{(log2\_max\_pic\_order\_cnt\_lsb\_minus4 + 4 )}=2^{3+4}=2^7 MaxPicOrderCntLsb=2(log2_max_pic_order_cnt_lsb_minus4+4)=23+4=27 **

  10. num_ref_frames

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

    观察上图可知该值为16

  11. pic_width_in_mbs_minus1

    用于计算图像的宽度。单位为宏块个数。

**观察上图可知以宏块为单元的图像宽度$PicWidthMbs=39+1=40$,亮度分量的图像宽度为$PicWidthInSamples_L=40*16=640$**
  1. pic_height_in_map_units_minus1

    度量视频中一帧图像的高度。并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。

  2. frame_mbs_only_flag

    等于 0 表示编码视频序列的编码图像可能是编码场或编码帧, 等于 1 表示编码视频序列的每个编码图像都是一个仅包含帧宏块的编码帧。

    观察上图可知pic_height_in_map_units_minus1=22,frame_mbs_only_flag=1,因此 F r a m e H i d g h t I n M b s = ( 2 − 1 ) ∗ 23 FrameHidghtInMbs=(2-1)*23 FrameHidghtInMbs=(2−1)∗23,图像的实际高度为 23 ∗ 16 = 368 23*16=368 23∗16=368

  3. direct_8x8_inference_flag

    表示在 规定的 B_Skip、B_Direct_16x16 和 B_Direct_8x8 亮度运动矢量的计算过程使用的方法。

    观察上图可知该值为1

  4. frame_cropping_flag

    等于 1 表示帧剪切偏移参数遵从视频序列参数集中的下一个值。frame_cropping_flag 等于 0 表示不存在帧剪切偏移参数。

    观察上图可知该值等于0

  5. vui_parameters_present_flag

    等 于 1 表示存在 vui_parameters( ) 语法结构。等于 0 表示不存在 vui_parameters( ) 语法结构。

    观察上图可知该值等于1

    帧 率 = t i m e _ s c a l e / n u m _ u n i t s _ i n _ t i c k 帧率=time\_scale/num\_units\_in\_tick 帧率=time_scale/num_units_in_tick,本文件的帧率为96Hz

PPS

PPS是指Picture Parameter Set,即图像参数集

  1. pic_parameter_set_id

    标识在条带头中提到的图像参数集。变量 pic_parameter_set_id 的值应该在 0 到 255 的范围内(包括 0 和 255)。某个PPS在码流中会被相应的slice引用,slice引用PPS的方式就是在Slice header中保存PPS的id值。

    观察上图可知该值为0

  2. seq_parameter_set_id

    表示当前PPS所引用的激活的SPS的id。通过这种方式,PPS中也可以取到对应SPS中的参数。 变量 seq_parameter_set_id 的值应该在 0 到 31 的范围内(包括 0 和 31)

观察上图可知该值为0

  1. entropy_coding_mode_flag

    用于选取语法元素的熵编码方式,在语法表中由两个标识符代表,具体如下:

    如果entropy_coding_mode_flag 等于0,那么采用Exp-Golomb编码或CAVLC;如果entropy_coding_mode_flag 等于1,就采用CABAC。

    观察上图可知该值为1

  2. pic_order_present_flag

    等于 1 表示与图像顺序数有关的语法元素将出现于条带头中,等于 0 表示条带头中不会出现与图像顺序数有关的语法元素。

    观察上图可知该值为0

  3. num_slice_groups_minus1

    表示一个图像中的条带组数(slice group)。 num_slice_groups_minus1 等于 0 时,图像中所有的条带属于同一个条带组。

    观察上图可知该值为0,说明此时只有一个slice group

  4. num_ref_idx_l0_active_minus1、num_ref_idx_l1_active_minus1

    num_ref_idx_l0_active_minus1 表示参考图像列表 0 的最大参考索引号,该索引号将用来在一幅图像中num_ref_idx_active_override_flag 等于 0 的条带使用列表 0 预测时,解码该图像的这些条带。

    num_ref_idx_l1_active_minus1 与 num_ref_idx_l0_active_minus1 具有同样的定义,只是分别用 11 和列表 1取代 10 和列表 0。

    观察上图可知num_ref_idx_l0_active_minus1=15,num_ref_idx_l1_active_minus1=0

  5. weighted_pred_flag

    等于 0 表示加权的预测不应用于 P 和 SP 条带。weighted_pred_flag 等于 1 表示在 P 和 SP条带中应使用加权的预测。

    观察上图可知该值为1

  6. weighted_bipred_idc

    等于 0 表示 B 条带应该采用默认的加权预测。weighted_bipred_idc 等于 1 表示 B 条带应该 采 用具体指 明 的 加 权 预 测 。 weighted_bipred_idc 等 于 2 表 示 B 条 带 应 该 采 用 隐 含 的 加 权 预 测 。

    观察上图可知该值为2

  7. pic_init_qp_minus26、pic_init_qs_minus26

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

    观察上图可知这两个值均为0

  8. chroma_qp_index_offset

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

    观察上图可知该值为-2

  9. deblocking_filter_control_present_flag

    等于 1 表示控制去块效应滤波器的特征的一组语法元素将出现在条带头中,等于 0 表示控制去块效应滤波器的特征的一组语法元素不会出现在条带头中

    观察上图可知该值为1

  10. constrained_intra_pred_flag

    等于 0 表示帧内预测允许使用残余数据,且使用帧内宏块预测模式编码的宏块 的预测可以使用帧间宏块预测模式编码的相邻宏块的解码样值;等于 1 表示受限制的帧内预测,在这种情况下,使用帧内宏块预测模式编码的宏块的预测仅使用残余数据和来自 I 或 SI 宏块类型的解码样值

    观察上图可知该值为0

  11. redundant_pic_cnt_present_flag

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

    观察上图可知该值为0

  12. transform_8x8_mode_flag

    等 于 1 表 示 8x8 变 换 解 码过程可能正 在使用,等于 0 表示未使用 8x8 变换解码过程。当 transform_8x8_mode_flag 不存在时,默认其值为 0。

    观察上图可知该值为1

  13. pic_scaling_matrix_present_flag

    等于 1 表示存在用来修改在序列参数集中指定的缩放比例列表的参数,等于 0 表示用于该图像中的缩放比例列表应等于由序列参数集规定的。当 pic_scaling_matrix_present_flag 不存在时,默认其值为 0。

    观察上图可知该值为0

其他

利用H264Visa软件查看一下其他部分的内容

summary

  • picture

  • stream

  • statistics

MB info

随机选中一块MB( MacroBlock ,宏块),查看信息

  • MB info

  • pred info

Pixel info

  • Final

GOP

GOP(Group of Pictures,图像组)是将一个图像序列中连续的几个图像组成的一个小组,是对编码后的视频码流进行编辑、存取和压缩编码的基本单元,包含不同种类编码的帧。

增大GOP或提高GOP中P/B帧的占比,可以提高压缩比,降低码率。因此一般而言,在码率一定的条件下,GOP越大,图像质量越好(P/B帧的比重更大);在图像质量一定的条件下,GOP越大,码率越低。

实验中使用视频如下:

以第二个GOP为例

当前位置是第二个GOP的I帧,也就是第二个GOP的开始,I帧在流中的顺序和它的显示顺序是形同的,都为30,帧的顺序是从0开始的,所以第一个GOP的长度为30帧。同时,因为GOP的数字是从0开始,因此第二个GOP的序号是1。

当前选择的位置是第三个GOP的I帧,它所在的GOP为2,它的显示顺序和在流中的顺序都是60,说明第二个GOP的长度也为30帧

每个图像帧的类型、所用的编码比特数、QP值

将视频的信息保存成.csv文件,查看结果:

以图像帧号为横坐标,每帧所用比特数为纵坐标绘制第二个GOP的曲线图:

由上图可知,I帧的比特数是最多的,P帧次之,B帧最少。

量化参数QP是量化步长Qstep的序号。

  • 对于亮度(Luma)编码而言,量化步长Qstep共有52个值,QP取值0-51
  • 对于色度(Chroma)编码,QP的取值0-39。
  • QP取最小值0时,表示量化最精细,相反,QP取最大值时,表示量化是最粗糙的。
  • QP和Qstep具有线性相关性,Qstep随着QP的增加而增加,每当QP值增加6,Qstep便增加一倍。

记录每帧的QP,并绘制曲线图

由上图可知,I帧的QP值比较小,也就是说明量化比较精细,B帧和P帧的量化比较粗糙

I帧

该GOP的I帧

可以看到该帧全部为Intra类型,也就是帧内编码帧

P帧

I帧后的第一个P帧

其中黄点表示P_Skip,说明该块的预测误差是0,通过与I帧的对比也可以看出这些位置几乎没有变化。

蓝色是Inter类型,也就是帧间编码帧,通过与I帧的相同位置对比能够发现,这些地方有少量的变化

红色是Intra帧内编码帧,这些位置帧内的相关性更高,因此采用帧内编码效果更好

B帧

随机选择一个B帧

红色仍表示帧内编码帧,观察这些位置的空间相关性更高

黄色是帧间编码帧,也是B_Skip,说明该块的预测误差是0

蓝色和绿色分别表示不同模式的帧间编码帧

蓝色:

绿色:

test.264分析

因为test.264文件在ESEyE软件中没有办法选择具体的某帧(可能是我电脑的原因?),而南京博物馆又没有办法在H264Visa中打开,因此,为了进一步看出I、B、P帧编码的区别,在H264Visa中查看test.264进一步分析

I帧

以全视频的第一个I帧进行分析

查看宏块的统计信息

其中一个宏块的信息:

I帧都是帧内编码帧,但是会有不同的模式,可以看到,纹理越复杂的地方,采用的预测模式越精细,像衣服与背景交界的地方、领带处等细节丰富的地方多采用I_4x4模式,而对于背景多采用I_16x16的模式,还有很多地方采用了I_8x8的模式

P帧

分析上一帧后面的第一个P帧

通过上面的标注可以看到,这是第4帧,但是是第2个解码的。

查看宏块统计信息

其中一个宏块的信息:

查看运动矢量:

对于P帧来说,大部分采用了帧间编码的方式,而且还出现了P_Skip帧,说明这些位置的预测误差几乎为0,这样做可以降低码率,观察发现这些位置与I帧的差别并不是很大,从运动矢量也可以看出

P帧中的有些位置也采用了帧内编码的方式,可能对于这些位置来说空间比时间的相似性要大

B帧

随机选取一个B帧分析

添加运动矢量:

查看宏块统计信息:

查看某一个宏块的信息:

对于这一个B帧来说,也有很多的B_Skip宏块,说明这些位置的预测误差接近于0,其他位置,B帧采用前向+后向的预测编码方式

【数据压缩】第九次作业——码流分析仪相关推荐

  1. 数据压缩第九周作业——码流分析仪

    目录 软件分析 H264Visa(分析图像) Header Info: 分析IBP帧 总结 Eseye_u(分析图像序列) 总结 软件分析 实验用到的两个软件: H264Visa(分析图像) 打开程序 ...

  2. 第九次作业——码流分析仪

    H.264码流分析 H.264是国际标准化组织(ISO)和国际电信联盟(ITU)在2002年12月共同提出的继MPEG-4之后的新一代数字视频压缩格式,其具有更高的编码效率,并注重对移动和IP网络的适 ...

  3. 【数据压缩作业9】H.264码流分析仪

    一.实验要求 选择一个.mp4或者.264文件. 在码流分析仪软件中打开该文件,从几个层次进行分析: 分析SPS和PPS里都包含哪些主要的信息,给出参数值.(例如分辨率.帧率.GOP结构等) 以一个G ...

  4. H.264码流分析仪

    目录 一.实验内容 二.实验结果 1. SPS profile_idc level_idc eq_parameter_set_id log2_max_frame_num_minus4 pic_orde ...

  5. 实验7 H.264码流分析仪

    一.实验内容 1.选择一个.mp4或者.264文件. 2.在码流分析仪软件中打开该文件,从几个层次进行分析: (1)分析SPS和PPS里都包含哪些主要的信息,给出参数值.(例如分辨率.帧率.GOP结构 ...

  6. 蓝拓扑码流分析仪S200使用解析

    TS流具体介绍 点击基本信息功能模块,进入基本信息界面. 在此界面中,可迅速获得TS流的一些基础信息.在这个信息下,可以有目的的去利用TS Analyzer Ⅱ提供的工具,详细地分析该TS流内容. 1 ...

  7. 【数据压缩】第九次作业——H.264码流分析

    目录 1. 选择一个.mp4或者.264文件 2. 在码流分析仪软件中打开该文件,从几个层次进行分析 分析SPS和PPS里都包含哪些主要的信息,给出参数值.(例如分辨率.帧率.GOP结构等等) SPS ...

  8. 【数据压缩】H.264文件解析和码流分析

    一.实验课要求 选择一个.mp4或者.264文件. 在码流分析仪软件中打开该文件,从几个层次进行分析: 分析SPS和PPS里都包含哪些主要的信息,给出参数值.(例如分辨率.帧率.GOP结构等等) 以一 ...

  9. 实现一个avs2码流分析工具

    最近在做avs2编码器项目,但是却没有成熟的码流分析工具,于是抽空学习了QT,业余时间写了一个avs2码流分析工具. 软件的界面如下: 图1.avs2码流分析仪界面 UI的左边框为NAL列表或者语法元 ...

最新文章

  1. Autodesk Cloud Accelerator Program 开始报名
  2. 关于C#写的记事本中一个问题
  3. Boost:双图bimap的范围标准方式的测试程序
  4. React学习:事件绑定、组件定义、for、map循环-学习笔记
  5. SharePoint REST API - 一个请求批量操作
  6. ZigBee TI ZStack CC2530 8.4 如何用高版本IAR打开低版本协议栈
  7. JZ32 从上往下打印二叉树
  8. 【背包问题】基于matlab粒子群算法求解背包问题【含Matlab源码 1343期】
  9. 简单的网站项目开发流程 .
  10. python123期末四题编程题 -无空隙回声输出-文件关键行数-字典翻转输出-《沉默的羔羊》之最多单词
  11. CI/CD的简介以及区别
  12. 基因组测序中N50和N90到底指什么?
  13. windbg分析C++ EH exception
  14. 简单css实现表格头部固定
  15. 村庄规划工作底图制作
  16. gitlab报错 fatal index-pack failed error RPC failed result
  17. Redis常见的八道面试题
  18. 感动世界的50首歌和他们背后的故事1
  19. EasyAR开发教程
  20. c语言程序设计上机实践,C语言程序设计上机实践心得报告

热门文章

  1. 真正正版的WINRAR注册密钥【适用于任何版本】
  2. Visual Studio 2022 自定义头文件源文件切换快捷键
  3. 递归算法遍历文件夹中所有文件递归删除文件夹
  4. JVM学习02——内存加载过程(类加载器)
  5. 微信小程序实现微信登录
  6. 本地 vm - xshell 互通
  7. ORACLE进阶(七)存储过程详解
  8. 【 唯美梦幻之境win7主题】_8.27
  9. 生物信息学有哪些SCI期刊推荐? - 易智编译EaseEditing
  10. java map foreach_java foreach遍历map集合的方法案例