目录

  • 工具
  • 原理
    • NALU
    • SPS
    • PPS
  • 实例视频二进制数据
  • SPS分析
    • nal_header
    • profile_idc
    • level_idc
    • seq_parameter_set_id
    • chroma_format_idc
    • residual_colour_transform_flag
    • bit_depth_luma_minus8
    • bit_depth_chroma_minus8
    • qpprime_y_zero_transform_bypass_flag
    • seq_scaling_matrix_present_flag
    • log2_max_frame_num_minus4
    • pic_order_cnt_type
    • log2_max_pic_order_cnt_lsb_minus4
    • num_ref_frames
    • pic_width_in_mbs_minus1
    • pic_height_in_map_units_minus1
  • PPS
  • SEI
  • 总结

工具

任意二进制工具
雷神作品:SpecialVH264.exe

原理

NAL Unit结构分析

NALU

nalu语法图

nalu_type

SPS

PPS

实例视频二进制数据

每一个NALU以0x00 00 00 01为起始码,也作为分隔

SPS分析

nal_header

先分析第一个NALU
size是14byte,起始码之后正好是14byte
第一个字节是NAL的header

  • forbidden_zero_bit : 0
    静止位固定是0,也就是第7位为0
  • nal_ref_idc : 3
    第5第6位是11
  • header低5位表示类型,这里是SPS
    即低5位是7

于是第一个nalu header
二进制为:0110 0111
十六进制为0x67,和二进制解析一致


profile_idc

既然知道了这个NALU表示SPS,那么就以SPS的方式去进行解析,SPS语法见上方给出的sps语法表

实际视频的第2个字节

  • profile_idc : 43
    第二个42是指profile,表示profile是66(十进制),即baseline profile
    H264中的profile与level
    profile的值在H264标准文档附件A中可查

profile_idc = 66 —— basline
profile_idc = 77 —— main
profile_idc = 88 —— extend
profile_idc = 100 —— high


实际视频数据的第三个字节

  • constraint_set0_flag~constraint_set5_flag
    给当前帧加一些限制性条件,具体参考h264标准文档,在附录A中列出和各种profile对应的情况

level_idc

实际视频数据的第四个字节

  • level_idc : 31
    当前码流中,level对应3.1,即720p,30fps,和sample中对应(h264的level表在H264中的profile与level)

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


seq_parameter_set_id

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


chroma_format_idc

  • chroma_format_idc : 1
    表示色度采样结构,示例的视频流为yuv420


residual_colour_transform_flag

  • residual_colour_transform_flag = 0
    值等于1时,应 用 264文档8.5节规定的残余颜色变换 。
    residual_colour_transform_flag 等于 0 时则不使用残余颜色变换。当 residual_colour_transform_flag 不存在时,默认其值为 0

bit_depth_luma_minus8

  • bit_depth_luma_minus8 = 0

是指亮度队列样值的比特深度以及亮度量化参数范围的取值偏移 QpBdOffsetY ,如下所示

  • BitDepthY = 8 + bit_depth_luma_minus8
  • QpBdOffsetY = 6 * bit_depth_luma_minus8

当 bit_depth_luma_minus8 不存在时,应推定其值为 0。bit_depth_luma_minus8 取值范围应该在 0 到 4 之间(包括 0 和 4)。


bit_depth_chroma_minus8

  • bit_depth_chroma_minus8 = 0

是指色度队列样值的比特深度以及色度量化参数范围的取值偏移 QpBdOffsetC ,
如下所示

  • BitDepthC = 8 + bit_depth_chroma_minus8
  • QpBdOffsetC = 6 * ( bit_depth_chroma_minus8 + residual_colour_transform_flag )

当 bit_depth_chroma_minus8 不存在时,应推定其值为 0。bit_depth_chroma_minus8 取值范围应该在 0 到 4 之间(包括 0 和 4)。


qpprime_y_zero_transform_bypass_flag

  • qpprime_y_zero_transform_bypass_flag : 0

等于 1 是指当 QP’Y 等于 0 时变换系数解码过程的变换旁路操作和图像构建过程将会在H264文档第 8.5 节给出的去块效应滤波过程之前执行qpprime_y_zero_transform_bypass_flag 等于 0 是指变 换 系 数 解 码 过 程 和 图 像 构 建 过 程 在 去 块 效 应 滤 波 过 程 之 前 执 行 而 不 使 用 变 换 旁 路 操 作 。
当qpprime_y_zero_transform_bypass_flag 没有特别指定时,应推定其值为 0


seq_scaling_matrix_present_flag

  • seq_scaling_matrix_present_flag : 0

等 于 1 表 示 存 在 i=0…7 的 标 志 seq_scaling_list_present_flag[ i ] 。
seq_scaling_matrix_present_flag 等于 0 则表示不存在这些标志并且由 Flat_4x4_16 表示的序列级别的缩放比例列表应被推断出来(对应 i=0…5),由 Flat_8x8_16 表示的序列级别的缩放比例列表应被推断出来(对应 i=6…7)。当seq_scaling_matrix_present_flag 没有特别指定时,应推定其值为 0。


log2_max_frame_num_minus4

  • log2_max_frame_num_minus4 : 6

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


pic_order_cnt_type

  • pic_order_cnt_type : 2

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

log2_max_pic_order_cnt_lsb_minus4

  • log2_max_pic_order_cnt_lsb_minus4 : 0

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

num_ref_frames

规定了可能在视频序列中任何图像帧间预测的解码过程中用到的短期参考帧和长期参考帧、互补参考场对以及不成对的参考场的最大数量。num_ref_frames 字段也决定了 8.2.5.3 节规定的滑动窗口操作的大小。num_ref_frames 的取值范围应该在 0 到 MaxDpbSize (参见 A.3.1 或 A.3.2 节的定义)范围内,包括 0 和MaxDpbSize 。

pic_width_in_mbs_minus1

  • pic_width_in_mbs_minus1 : 79

加 1 是指以宏块为单元的每个解码图像的宽度。
PicWidthInMbs = pic_width_in_mbs_minus1 + 1
16是h264中的宏块边长
于是示例视频流中的图像宽度为80 x 16 = 1280

pic_height_in_map_units_minus1

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

PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1
16是h264中的宏块边长
于是示例视频流中的图像宽度为45 x 16 = 720

PPS

分析同SPS

SEI


用于存放payload相关信息

总结

SPS 用于存放视频信息,图像profile、level、chroma、图像长宽等关键信息

SEI存放payload相关信息

  • I帧越大,P帧越小;I帧越小P帧越大
  • I帧大小取决于图像本身内容,和压缩算法的空间部分
  • P帧的大小取决于图像变化的剧烈程度
  • (码率控制模式)CBR和VBR下P帧的大小策略会不同,CBR时P帧大小基本恒定
    CBR是固定码率;VBR是可变码率
    码率的概念就是,沿着时间轴,这些帧的大小。如果每个P帧的大小相差过大,那么网络传输就会很麻烦,带宽可能不够或者闲置
    CBR每一帧的大小是差不多的,主要是为了方便网传
    VBR每一帧大小不稳定,主要是为了维持图像质量稳定
    图像变化是否剧烈,是选择码率控制模式的依据之一

H264——H264码流分析实例(SPS、PPS)相关推荐

  1. 【H264码流分析】 SPS/PPS/Slice Header

    SPS中相关 H264 Profile 对视频压缩特性的描述,Profile越高,就说明采用了越高级的压缩特性 H264 Level Level是对视频的描述,Levrl越高,视频的码率,分辨率,fp ...

  2. 【FFmpeg学习】H264 视频码流分析

    1. H264编码分层 NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的 ...

  3. 【H.264/AVC视频编解码技术】第二章【H264码流分析】

    H264码流分层 NAL层,视频数据网络抽象层,作用是控制二进制数据的传输,主要用于网络传输.  VCL层,视频数据编码层. VCL结构关系 NALU NAL Header (1B)+ RBSP H2 ...

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

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

  5. <整理总结>H264/265码流数据包格式分析(带mp4v2封装H264/265为MP4的源码示例)

    H264/265码流数据包格式分析 前言: 一.H.264码流解析 I帧P帧B帧说明: 二.H.265码流解析 三.主要源码 前言: 最近在学习使用MP4v2将H264/H265码流以及AAC音频封装 ...

  6. H264视频码流结构分析

    目录 前言 H264码流结构 H264帧结构 H264档次介绍 RTSP实时音视频开发实战课程:<RTSP实时音视频开发实战> <YUV编码为H264视频流代码实现>链接: h ...

  7. 从H264/H265码流中获取宽、高及帧率

     在做码流分析时,图像分辨率.帧率这类的基本信息,当然不可少.本文介绍如何从NAL中计算到图像宽.高,还有分辨率.由于H264和H265有相似性,就在一起写了. 一.从码流获得宽.高 1.H264 ...

  8. H264/H265码流类型

    文章目录 H.264码流 H.264码流格式 Annex B AVCC H.265码流 H.264码流 H264中,NALU类型1-5为视频帧,其余则为非视频帧.在解码过程中,我们只需要取出NALU头 ...

  9. NDK学习笔记:RtmpPusher之利用rtmpdump推h264/aac码流

    NDK学习笔记:RtmpPusher之利用rtmpdump推h264/aac码流 本篇将是 RtmpPusher 的最后一篇.在之前的3篇文章里,我们已经把原生的视频YUV格式编码成h264,把音频的 ...

最新文章

  1. C#中String与byte[]的相互转换
  2. android 闪烁发光动画,androidview动画发光效果在imageview上
  3. golang中struct字段
  4. Kubernetes二次开发--Operator的使用
  5. 阶段总结——201511
  6. 知识图谱入门视频(二)
  7. 23. PE结构-PE详解之输出表(导出表)
  8. jQuery-点击按钮页面滚动到顶部,底部,指定位置
  9. css3 flex流动自适应响应式布局样式类
  10. 无线传感网MAC协议
  11. Sniffer报文捕获解析
  12. 阿里的《基于pai的推荐系统》--摘抄笔记
  13. 自动化网络安全防御的问题
  14. linux fedora centos,linux – 我为什么要使用CentOS而不是Fedora
  15. 爱快支持服务器网卡嘛,爱快软路由硬件支持
  16. MQ消息队列中间件:
  17. “云原生”、“大数据”、“云计算”的结合——阿里云的云原生大数据计算服务MaxCompute
  18. android 盒子 airplay,通过airplay连接电视盒子的方法是啥?
  19. 阿里多个App已接入微信支付;Facebook年薪中位数170万元;恶意软件感染超1000万台安卓设备 | EA周报...
  20. python评论情感分析nltk_基于 Python 和 NLTK 的推特情感分析

热门文章

  1. nrf24l01无线通信模块与51单片机工作原理
  2. Python全栈学习笔记day 40.5+:线程池和线程池的Python标准模块--concurrent.futures
  3. CEPH(详解+配置)
  4. 基于51单片机的LED呼吸灯设计(定时器)
  5. 51nod 1113 矩阵快速幂 模板
  6. 信息熵、相对熵和交叉熵
  7. 再度公开少林内修心法 易筋经和洗髓经 欢迎转载 让全人类共享学习 过得更健康
  8. JavaScript内存相关初了解:堆栈、引擎、闭包隐患
  9. POI生成word文档,图片显示为空白或不显示
  10. 富士x-e4参数 怎么样?测评值得买吗?