一、实验课要求

  1. 选择一个.mp4或者.264文件。
  2. 在码流分析仪软件中打开该文件,从几个层次进行分析:
  • 分析SPS和PPS里都包含哪些主要的信息,给出参数值。(例如分辨率、帧率、GOP结构等等)
  • 以一个GOP为例,分析如下信息:
    1. 每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
    2. 以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
    3. 以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
    4. 以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。

二、实验内容


首先是SPS:
profile_idc:

(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。

constraint_set0_flag ~ constraint_set5_flag

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

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

level_idc

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

当前码流中,level_idc =31,对应表如下:


表示该H264码流支持到720p 高清格式,支持隔行扫描,每秒的样点数是27648000

seq_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是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段。

在本例中,MaxFrameNum = 2 ^ ( 4 + 4 ) = 256

pic_order_cnt_type

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

gaps_in_frame_num_value_allowed_flag

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

在本例中, gaps_in_frame_num_value_allowed_flag = 0,表示不允许不连续的值。

pic_width_in_mbs_minus1

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

frame_width = 16 × (pic_width_in_mbs_minus1 + 1);

(54+1)*16=880

pic_height_in_map_units_minus1

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

PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1;

pic_height_in_map_units_minus1 为29 故高度为30

frame_mbs_only_flag

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

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

FrameHeightInMbs = ( 2 − frame_mbs_only_flag ) * PicHeightInMapUnits

故FRameHeightInMbs为30

mb_adaptive_frame_field_flag

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

direct_8x8_inference_flag

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

frame_cropping_flag

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

vui_parameters_present_flag

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

PPS

本例中的pps如下:

可知图像分辨率:
pic_width_in_mbs_minusl=39 实际宽度(39+1)*40=640
pic_height_in_map_units_minus1=22
frame_mbs_only_flag=1 表示所有宏块都采用帧编码,同时也表示一帧数据按宏块计算的高度,即按宏块计算的实际高度16 × 23 = 368
GOP结构:
num_slice_groupes_minusl=0 该图像帧中只有一个Slice group

以一个GOP为例,以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。

可知第一个GOP长度为165,导出其statistic数据可知比特数;H264Visa的statistics窗口可看到mean QP值。

输出帧号为0-164的数据并做图:(按解码时间DTS排列:IPBBPB…)

查找0-164每一帧的QP并记录:(以显示时间PTS排序:IBBPBPB…)

每帧所用比特数曲线:

以帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。


大部分为8x8和16x16的宏块,细节较多的地方用更细的4x4:


大部分为p_skip宏块,因为前后图像变化不大,也有个别采用前向预测(I帧)和帧内编码以弥补差异较大的细节部分。

三、参考:

https://blog.csdn.net/heanyu/article/details/6204414
https://zhuanlan.zhihu.com/p/27896239

【数据压缩】H.264文件解析和码流分析相关推荐

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

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

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

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

  3. 完成一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  4. 一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  5. 音视频方案,音视频扩展内容- 音视频数据解析,码流分析及质量评价(笔记)3

    -- 音视频编解码流程如下图: -- 关于音频各种参数: freq:音频数据的采样率.常用的有48000,44100等. format:音频数据的格式.举例几种格式: AUDIO_U16SYS:Uns ...

  6. 利用FFmpeg将H.264文件读入内存,再输出封装格式文件

    /***先将H.264文件读入内存,*再输出封装格式文件.*/ #include "stdafx.h"#define __STDC_CONSTANT_MACROSextern &q ...

  7. (推荐阅读)H264, H265硬件编解码基础及码流分析

    需求 在移动端做音视频开发不同于基本的UI业务逻辑工作,音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性,码流的结构,码流中一些重要信息如sps,pps,v ...

  8. H.264官方软件JM源代码简单分析-解码器ldecod

    ===================================================== H.264/H.265 官方源代码分析文章: H.264官方软件JM源代码简单分析-编码器l ...

  9. H.264官方软件JM源代码简单分析-解码器ldecod(转载)

    转载自 雷霄骅 大神博客 https://blog.csdn.net/leixiaohua1020 ================================================== ...

最新文章

  1. 白盒测试实践-任务完成
  2. android 编译过程
  3. 接口中不能有方法体吗-------不是
  4. Hark的数据结构与算法练习之图书馆排序
  5. Introduction for i-Teams
  6. MySQL优化group by和distinct
  7. JavaScript 继承
  8. 微软 2018 Build 大会前瞻:AI、Azure、Windows 10 都在!
  9. 与同步传递相关的获取-释放序列
  10. D3D中材质通过D3DMATERIAL9结构说明
  11. 程序中使用log4J打印信息的两种方式
  12. 数学概率之z=x+y和z=x-y和z=x/y的分布
  13. 现阶段选择ArcMap还是ArcGIS Pro
  14. 基于Netty和Java的GUI界面实现在线聊天室软件
  15. 颜值即正义的时代,你还不懂直播特效的实现原理与难点?
  16. 威富通实现微信支付概述
  17. matlab kdj,kdj指标详什么时候买入,kdj指标详解四大绝技
  18. HDU5745 La Vie en rose
  19. 我与北窗青年的2020丶
  20. 吴恩达 - 卷积神经网络 学习笔记(一)

热门文章

  1. 人生苦短,我用 Python,如何学习 Python 网络爬虫?
  2. [BZOJ4455][UOJ185][Zjoi2016]小星星(树形DP+容斥)
  3. wave6000可以c语言编程吗,WAVE6000使用方法
  4. Freeline配置使用过程
  5. windows系统打开conf文件
  6. 带您盘点全球T20生命科学仪器公司
  7. 【实践】mysql解决特生僻汉字插入问题
  8. 欧尼酱讲JVM(17)——方法区详解有图有真相
  9. 本科计算机数据库应用,数据库计算机论文,关于计算机数据库的管理应用相关参考文献资料-免费论文范文...
  10. Migrating from REDWOOD CRONACLE TO CA WORKLOAD AUTOMATION GUIDE