H264编解码参数说明

  • 一、H264码流分层
    • 1、NAL层
      • ①、如何判断帧类型(是图像参考帧还是I、P帧等)?
      • ②、 帧格式
      • ③、 [SPS格式解析代码分析 ParseAndRewriteSps方法 ](https://github.com/chensongpoixs/cwebrtc/blob/chensong/common_video/h264/sps_vui_rewriter.cc)
    • 2、 VCL层
    • 3、 码流基本概念
      • ①、 SODB(String Of Data Bits)
      • ②、 RBSP(Raw Byte Sequence Payload)
      • ③、 NALU 单元
      • ④ SPS/PPS/Slice Header
      • ⑤ [webrtc中对应RBSP的代码 段 方法SpsVuiRewriter::ParseAndRewriteSps](https://github.com/chensongpoixs/cwebrtc/blob/chensong/common_video/h264/sps_vui_rewriter.cc)
  • 二, SPS中两个重要的参数分别是 Profile 与 Level
    • 1、 H264 Profile
    • 2、 H264 Level
    • 3、 分辨率
    • 4、 帧相关的
      • ①、 帧数 log2_max_frame_num_minus4
      • ②、 参考帧数 max_num_ref_frames
      • ③、 显示帧序号 pic_order_cnt_type
    • 5、 帧率的计算
  • 三、 PPS与 Slice Header
    • 6、Slice Header
      • ①、 帧类型
      • ②、 GOP中解码帧序号
      • ③、 预测权重
      • ④、 滤波

音视频基础学习实验地址:https://github.com/chensongpoixs/caudio_video

一、H264码流分层

1、NAL层

Network Abstraction Layer,视频数据网络抽样层。

①、如何判断帧类型(是图像参考帧还是I、P帧等)?

NALU类型是我们判断帧类型的利器,从官方文档中得出如下图:

我们还是接着看最上面图的码流对应的数据来层层分析,以00 00 00 01分割之后的下一个字节就是NALU类型,将其转为二进制数据后,解读顺序为从左往右算,如下:
(1)第1位禁止位,值为1表示语法出错
(2)第2~3位为参考级别
(3)第4~8为是nal单元类型

例如上面00000001后有67,68以及65

其中0x67的二进制码为:
0110 0111
4-8为00111,转为十进制7,参考第二幅图:7对应序列参数集SPS

其中0x68的二进制码为:
0110 1000
4-8为01000,转为十进制8,参考第二幅图:8对应图像参数集PPS

其中0x65的二进制码为:
0110 0101
4-8为00101,转为十进制5,参考第二幅图:5对应IDR图像中的片(I帧)

所以判断是否为I帧的算法为: (NALU类型 & 0001 1111) = 5 即 NALU类型 & 31 = 5

比如0x65 & 31 = 5

②、 帧格式

H264帧由NALU头和NALU主体组成。
NALU头由一个字节组成,它的语法如下:

±--------------+
|0|1|2|3|4|5|6|7|
±±±±±±±±+
|F|NRI| Type |
±--------------+

F: 1个比特.
forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.

NRI: 2个比特.
nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放,0~3,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。

Type: 5个比特.
nal_unit_type. 这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用,简述如下:

0:未规定
1:非IDR图像中不采用数据划分的片段
2:非IDR图像中A类数据划分片段
3:非IDR图像中B类数据划分片段
4:非IDR图像中C类数据划分片段
5:IDR图像的片段
6:补充增强信息(SEI)
7:序列参数集(SPS)
8:图像参数集(PPS)
9:分割符
10:序列结束符
11:流结束符
12:填充数据
13:序列参数集扩展
14:带前缀的NAL单元
15:子序列参数集
16 – 18:保留
19:不采用数据划分的辅助编码图像片段
20:编码片段扩展
21 – 23:保留
24 – 31:未规定
NAL的头占用了一个字节,按照比特自高至低排列可以表示如下:

③、 SPS格式解析代码分析 ParseAndRewriteSps方法

2、 VCL层

VIdeo Coding Layer, 视频数据编码层。

3、 码流基本概念

①、 SODB(String Of Data Bits)

原始数据比特流,长度不一定是8的倍数,故需要补齐。它是由VCL层产生的。

②、 RBSP(Raw Byte Sequence Payload)

SODB+trailing bits

算法是如果SODB最后一个字节不对齐,则补1和多个0.

③、 NALU 单元

NAL Header(1byte) + RBSP

NALUnit.png

h264_slice_block.png

h264_slice.png

h264_rtp_annexb.png

④ SPS/PPS/Slice Header

webrtc中对应RBSP的代码 段 方法SpsVuiRewriter::ParseAndRewriteSps

二, SPS中两个重要的参数分别是 Profile 与 Level

1、 H264 Profile

h264_profile.png

h264_profile_main_high.png

对视频压缩特性的描述,Profile越高,就说明采用了越高级的压缩特性

2、 H264 Level

h264_level.png

Level是对视频的描述,Level越高,视频的码率、分辨率、fps越高

3、 分辨率

pic_width_in_mbs_minues1 图像宽度包括的宏块个数-1
pic_heigh_in_mbs_minus1 图像高度包括的宏块个数-1
frame_mbs_only_flag 帧编码还是场编码 (场是隔行扫描、产生两张图)
frame_cropping_flag 图像算法需要裁剪
frame_crop_left_offset 减去左侧的偏移量
frame_crop_right_offset 减去右侧的偏移量
frame_crop_top_offset 减去顶部的偏移量
frame_crop_bottom_offset 减去底部的偏移量

4、 帧相关的

①、 帧数 log2_max_frame_num_minus4

②、 参考帧数 max_num_ref_frames

解码设置缓冲区大小的

③、 显示帧序号 pic_order_cnt_type

解码

5、 帧率的计算

framerate = (float)(sps->vui.vui_time_scale)/(float)(sps->vui.vui_num_units_in_tick)/2;

三、 PPS与 Slice Header

entropy_coding_mode_flag 熵编码,1表示使用CABAC编码
num_slice_groups_minus1 分片数量
weighted_pred_flag 在P/SP Slice中开启权重预测
weighted_bipred_idc 在B Slice中加权预测的方法
pic_init_qp_minus26/pic_init_qs_minus26 初始化量参数,实际参数在Slice header
chroma_qp_index_offset 用于计算色度分量的量化参数
deblocking_filter_control_present_flag 表示Slice header中是否存在用于去块滤波器控制的信息
constrainged_intra_pred_flag 若该标识为1,表示I宏块在进行帧内预测时只能使用来自I和SI类型宏块的信息
redundant_pic_cnt_preset_flag 用于表示Slice Header中是否存在redundant_pic_cnt语法元素

6、Slice Header

①、 帧类型

②、 GOP中解码帧序号

③、 预测权重

④、 滤波

H264编解码SPS、PPS参数说明相关推荐

  1. 音视频系列--H264编解码总结

    一.概述 H264,通常也被称之为H264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 对摄像头采集的每一帧视频需要进行编码,由于视频中存在空间和时间的冗余,需要 ...

  2. 音视频开发系列--H264编解码总结

    一.概述 H264,通常也被称之为H264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 对摄像头采集的每一帧视频需要进行编码,由于视频中存在空间和时间的冗余,需要 ...

  3. ffmpeg H264 编解码配置

    ffmpeg H264编解码前面有文章介绍下,本文主要介绍一些参数配置. 编码: int InitEncoderCodec( int iWidth, int iHeight) {AVCodec * p ...

  4. WebRTC android 端支持H264编解码

    一.WebRTC源码中默认使用的H264编解码的库 1.WebRTC源码的video_coding模块中,包含了H264编解码相关的类 打开画红线的两个头文件,分别可以看到解码类中导入了ffmpeg的 ...

  5. TightVNC H264编解码(一)

    时光流逝,时间过的真快啊!疲于工作,发现近一个多月没写文章了.此文算是对最近的工作做个总结吧.经过尽二个月的不断摸索,TightVNC终于支持H264编解码了,前期真正编写H264编解码器只花了一周左 ...

  6. webrtc默认使用h264编解码

    webrtc默认选择的是vp8编解码,要修改为默认h264编解码,则需要编码和解码都修改,需要做到下面三步 编译支持 编译时候增加属性 proprietary_codecs,设为true 例如: /. ...

  7. CrossWalk WebView添加支持WebRTC及H264编解码

    前言 1.WebView简介 WebView是Android平台上的一个非常重要的系统组件,用于将一个显示浏览器页面的窗口嵌入到应用程序,并提供一组接口让开发者定制一些页面加载及JavaScript对 ...

  8. [H264编解码参数] SPS

    #前言 RTP完整流程 已经 解释了协议 所以要涉及具体的log分析 分为: SPS \ PPS\I帧\非I帧\FU-A SPS 序列参数集合 SPS 属于 [RTP header] + 单一NAL单 ...

  9. h264 sei信息 解码_关于H264编码数据中SPS,PPS,SEI,IDR等内容的问题

    群内的朋友们好! 我使用的平台是ipnc rdk 3.8 , 我在h264编码的有关NALU参数设置如下: staticParams->nalUnitControlParams.naluCont ...

最新文章

  1. doT.js-doT模板方便快捷的组织页面DOM
  2. jQuery 选择器模糊匹配
  3. python导入openpyxl报错问题,终于解决啦
  4. 关于PHPExcel导出Excel时身份证,数字会导出为科学计数的处理方法
  5. Xshell通过SSH连接阿里云报错“服务器发送了一个意外的数据包” xshell连接ubuntu
  6. python集成工具包_pyBit
  7. exe编辑器_【小功能】Unreal Editor中调用exe
  8. Spring集成Mybatis多数据源配置
  9. 【数据结构与算法】算法的时间复杂度
  10. php laravel mix,引入 Laravel Mix 管理前端资源
  11. ONLYOFFICE 如何连接集成到 Wordpress 上
  12. VMware VMFS分区表恢复
  13. vue element-ui实现金额数字添加千分位并保留两位小数
  14. jeecms oracle v5_jeecms二次开发总结
  15. 在iOS设备上进行抓包(补充)
  16. 应届生想做产品经理该怎么走?
  17. 感性VS理性-处世之道
  18. Windows XP 下载
  19. APE文件学习——文件头(1)
  20. 怎么把录音转文字?这些方法值得收藏

热门文章

  1. java 网络编程详细解析
  2. 华北电力大学计算机学院复试,2014年华北电力大学(北京)控制与计算机学院考研复试办法...
  3. OSChina 周三乱弹 —— 多情自古空余恨,此恨绵绵无绝期
  4. Java获取指定日期的本月,上月,下月的最后一天
  5. QSS 自定义QMessageBox
  6. 脉脉林凡:职场社交突破点在于行业间的融合
  7. 2007中国IT产业10大丑闻
  8. Win10修改msconfig后无法开机怎么办?
  9. android设置webview光标颜色,CSS自定义设置元素闪烁光标颜色
  10. js实现表格的增添和删除操作