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

每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
二、实验结果 

1. SPS

PS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。

视频的SPS参数:

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

基准档次:baseline profile;

主要档次:main profile;

扩展档次:extended profile;

在H.264的SPS中,第一个字节表示profile_idc,根据profile_idc的值可以确定码流符合哪一种档次。根据新的标准规定,我们的实验码流中,profile_idc =100,说明码流的档次为High。

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

当前码流中,level_idc = 31,因此码流的级别为3.1,可看出支持720p

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

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

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

log2_max_pic_order_cnt_lsb_minus4
用于计算MaxPicOrderCntLsb的值,该值表示POC的上限。

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

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

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

frame_width = 16 × (pic_width_in_mbs_minus1 + 1);

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

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

按照宏块计算的图像实际高度FrameHeightInMbs的计算方法为:
FrameHeightInMbs = ( 2 − frame_mbs_only_flag ) * PicHeightInMapUnits

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

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

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

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

2. PPS

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

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

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

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

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

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

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

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。

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

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

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

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

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

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

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

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

pic_scaling_matrix_present_flag
等于 1 表示存在用来修改在序列参数集中指定的缩放比例列表的参数,等于 0 表示用于该图像中的缩放比例列表应等于由序列参数集规定的。当 pic_scaling_matrix_present_flag 不存在时,默认其值为 0。
3. GOP结构
GOP(Group of Pictures,图像组)是将一个图像序列中连续的几个图像组成的一个小组,是对编码后的视频码流进行编辑、存取和压缩编码的基本单元,包含不同种类编码的帧。增大GOP或提高GOP中P/B帧的占比,可以提高压缩比,降低码率。因此一般而言,在码率一定的条件下,GOP越大,图像质量越好(P/B帧的比重更大);在图像质量一定的条件下,GOP越大,码率越低。

红色表示I帧 蓝色表示P帧 绿色表示B帧

第二个GOP的起始帧:

第三个GOP的起始帧:

由此两个I帧的序号得到,GOP的长度为30。

将一个GOP内每个帧的编码比特数保存成.cvs文件,如下所示:其中可以看出每帧的类型(I / B / P 帧)和size。

画出图表:

I / P / B 帧分析

I帧

该帧全部为Intra类型,也就是帧内编码帧。编码时多采用8 × 8 、16 × 16 的宏块,细节部分也有采用4 × 4 的宏块。

P帧

该帧内有帧内编码帧,即粉红色区域;也有帧间编码帧,即绿色区域。

B帧

查看某一宏块的信息:

实验7 H.264码流分析仪相关推荐

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

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

  2. H.264码流分析仪

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

  3. H.264码流分析及编解码调试

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

  4. H.264码流的分析

    一 .实验原理 1. H.264编码原理 H.264相比于之前讲过的MPEG-2来说,注重实用,采用更成熟的技术,要求更高的编码效率和简洁的表现形式.与此同时,在混合编码器的基本框架下,H.264对M ...

  5. H.264码流结构解析

    大概前五六年之前写过的一个大体分析H.264格式,不是很详细,可以大致看看有哪些格式.  H.264码流结构解析 那个时候上传的百度文库,以前记得有多积分,现在都不能下载了,还要充钱才可以.真是~~~ ...

  6. 使用 ortp 发送原始 H.264 码流

    oRTP 是一个 RTP (Real-time Transport Protocol (RFC 3550)) 协议的库实现,它完全以 C 语言来实现,因此方便应用于各种不同的平台.本文分享用 oRTP ...

  7. 原始 H.264 码流播放

    我们平时遇到的视频文件各式各样,五花八门.通常它们会根据格式的不同,而有着不同的扩展名,比如 avi,rmvb,mkv,mp4 等等等.这些格式代表的都是 封装格式. 这些文件通常产生的过程是这样的: ...

  8. H.264码流解析 一个SPS的nalu及获取视频的分辨率

    00 00 00 01 67 42 00 28 E9 00   A0 0B 77 FE 00 02 00 03 C4 80   00 00 03 00 80 00 00 1A 4D 88   10 9 ...

  9. 我的开源项目:H.264码流分析器

    本文介绍一个自己的开源小项目:H.264码流分析器.在学习过程中,从开源社区获得了很多的资源,在此也算是对开源社区的回馈了. 我这个项目规模不大,主要可以用来学习H.264码流结构.使用VC 2010 ...

最新文章

  1. 折叠屏就要来了,适配逼死 Android 开发?
  2. 每日一皮:我一般不担心警告,只担心错误...
  3. 10岁对c语言特别感兴趣,山东男孩,8岁懂电脑编程,10岁考上南科大,最后为何惨遭退学?...
  4. pythonista安卓版下载-pythonista 3ios
  5. vscode如何搜索?ctrl+shift+p
  6. P1468 派对灯 Party Lamps(BIG 模拟)
  7. 2022大厂面试必问要点总结
  8. git常用命令让你几步摆脱图形工具提交项目
  9. python一共多少模块,python常见模块有哪些
  10. C# Remoting理解
  11. Nmap扫描机器开放的端口
  12. 两个重要极限 常用等价无穷下小 泰勒展开 麦克劳林公式
  13. iOS 开发 Provisioning Profile(描述文件) 详解
  14. C语言 投票选举问题
  15. 方法重载时,需要遵循以下三条原则
  16. ZOJ1111 - Poker Hands
  17. int / int(double); java保留小数
  18. 简单理解:第一类错误,第二类错误,统计显著性,空假设和P值
  19. stream之group分组
  20. 广东工业大学2017新生赛(决赛)-网络同步赛 1007 白色相簿的季节【全错位排列】

热门文章

  1. 正点原子imx6ull开发板视频监控项目实战系列5: 摄像头(V4L2)和声卡(ALSA)接口简介
  2. C++实现单例模式,保证线程安全
  3. Matlab基于人工鱼群算法求解TSP问题
  4. 跨境电商如何使用WhatsApp Business与客户沟通?这几个错误需要避免
  5. 1.1.6 插入脚注后,正文空一行
  6. 读书百客:《白雪歌送武判官归京》赏析二
  7. 软件工程-软件系统设计
  8. lammps 编译安装测试说明
  9. Windows下使用python3 + selenium实现网页自动填表功能
  10. Docker3 - Dockerfile 配置文件