GitHub代码地址:点击这里

H.264中的条带(Slice)

1. Slice的概念

我们已经知道,整个H.264的码流结构可以分为两层:网络抽象层NAL和视频编码层VCL。在NAL层,H.264的码流表示为一系列的NAL Units,不同的NAL Units中包含不同类型的语法元素。前面两篇中所解析的序列参数集SPS和图像参数集PPS就是其中重要的两个部分,其中包含了控制解码过程的一些通用的参数。

实际保存原始视频的图像数据的部分保存在其他的VCL层的NAL Units中。这部分数据在码流中称作是条带(Slice)。一个Slice包含一帧图像的部分或全部数据,换言之,一帧视频图像可以编码为一个或若干个Slice。一个Slice最少包含一个宏块,最多包含整帧图像的数据。在不同的编码实现中,同一帧图像中所构成的Slice数目不一定相同。

在H.264中设计Slice的目的主要在于防止误码的扩散。因为不同的slice之间,其解码操作是独立的。某一个slice的解码过程所参考的数据(例如预测编码)不能越过slice的边界。

2. Slice的类型

根据码流中不同的数据类型,H.264标准中共定义了5总Slice类型:

  • I slice: 帧内编码的条带;
  • P slice: 单向帧间编码的条带;
  • B slice: 双向帧间编码的条带;
  • SI slice: 切换I条带,用于扩展档次中码流切换使用;
  • SP slice: 切换P条带,用于扩展档次中码流切换使用;

在I slice中只包含I宏块,不能包含P或B宏块;在P和B slice中,除了相应的P和B类型宏块之外,还可以包含I类型宏块。

3. Slice的组成

每一个Slice总体来看都由两部分组成,一部分作为Slice header,用于保存Slice的总体信息(如当前Slice的类型等),另一部分为Slice body,通常是一组连续的宏块结构(或者宏块跳过信息),如下图所示:

4. Slice Header结构

Slice header中主要保存了当前slice的一些全局的信息,slice body中的宏块在进行解码时需依赖这些信息。其中比较常见的一些语法元素有:

  1. first_mb_in_slice: 当前slice中包含的第一个宏块在整帧中的位置;
  2. slice_type:当前slice的类型;
  3. pic_parameter_set_id:当前slice所依赖的pps的id;
  4. colour_plane_id:当标识位separate_colour_plane_flag为true时,colour_plane_id表示当前的颜色分量,0、1、2分别表示Y、U、V分量。
  5. frame_num:表示当前帧序号的一种计量方式。
  6. field_pic_flag:场编码标识位。当该标识位为1时表示当前slice按照场进行编码;该标识位为0时表示当前slice按照帧进行编码。
  7. bottom_field_flag:底场标识位。该标志位为1表示当前slice是某一帧的底场;为0表示当前slice为某一帧的顶场。
  8. idr_pic_id:表示IDR帧的序号。某一个IDR帧所属的所有slice,其idr_pic_id应保持一致。该值的取值范围为[0,65535]。
  9. pic_order_cnt_lsb:表示当前帧序号的另一种计量方式。
  10. delta_pic_order_cnt_bottom:表示顶场与底场POC差值的计算方法,不存在则默认为0;
  11. slice_qp_delta:用于计算当前slice内所使用的初始qp值。

整个slice header的结构如下表所示: 
 
 

十一、H.264的Slice Header解析相关推荐

  1. H.264码流结构解析

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

  2. H.264/H265的NAL解析

    1.H.264的NAL解析 在有序字节流格式的H.264码流中,我们可以根据前缀起始码0x 00 00 01或0x 00 00 01获取到一个完整的NAL Unit所包含的的字节数据.H.264码流中 ...

  3. H.264/H265码流解析

    H.264/H265码流解析 一.H.264码流解析 一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成 一个原始的 ...

  4. 基于android手机实时监控ipcam视频之三:H.264的RTP打包解析

    因为项目中,ipcam的视频编码方式主要是基于H.264,因此ipcam出来的H.264码流会按照协议rfc3984来打包,mediastream2中收到rtp recv filter的数据后,必须先 ...

  5. 视音频数据处理入门:H.264视频码流解析(java)

    参考文献 : 视音频数据处理入门:H.264视频码流解析 测试文件:H264文件 链接:https://pan.baidu.com/s/1eRTJwTsXTgHf2Ez8Inab1A  提取码:1c7 ...

  6. 视音频数据处理入门:H.264视频码流解析

    ===================================================== 视音频数据处理入门系列文章:视音频数据处理入门:RGB.YUV像素数据处理视音频数据处理入门 ...

  7. 【H.264】码流解析 annexb vs avcc

    H264码流解析及NALU AVCC和ANNEXB 前者是FLV容器.mp4 常用的. 后者 是实时传输使用,所以是TS 一类的标准. VLC显示AVC1就是AVCC AVCC格式 也叫AVC1格式, ...

  8. 【音视频数据数据处理 12】【H.264篇】解析H.264原始码流中的I帧 / P帧 / B帧数据(暂未解决,本文先放着,来日更新)

    [音视频数据数据处理 12][H.264篇]解析H.264原始码流中的I帧 / P帧 / B帧数据 一.如何判断是 I帧 / P帧 / B帧 1.1 slice_type 1.2 slice_head ...

  9. H.264/AVC视频编解码技术详解-殷汶杰-专题视频课程

    H.264/AVC视频编解码技术详解-46880人已学习 课程介绍         H.264/AVC是目前业界应用为广泛的视频压缩编码标准,包含了先进而且较为成熟的视频编码技术.本课程将从原理.标准 ...

最新文章

  1. 微软开发x86模拟器,让Windows for ARM能运行x86应用
  2. import win32api 安装pip install pypiwin32
  3. finally 关键字
  4. mybatis和ehcache整合
  5. Java数据保留小数
  6. 解决:缺少aclocal、autoconf、automake
  7. 计算机操作系统(7):进程的基本概念
  8. 微服务之旅的经验分享
  9. Unity3D之移植学习笔记:移植到Android平台
  10. 《Elementary Methods in Number Theory》勘误
  11. 云端软件平台 封装了诺基亚PC套件无法找到驱动怎么办
  12. 物联网技术是怎么分类的,物联网主要面临哪些难题?
  13. 串口调试助手fx2n_PLC串口调试助手
  14. NOIP提高组【JZOJ4809】挖金矿
  15. Mvp+OkHttp+XRecyclerView------上拉加载下拉刷新
  16. oracle读写速率,Oracle、PostgreSQL与Mysql数据写入性能对比
  17. 苏宁618强势出圈,差异化竞争能力是杀手锏
  18. jlink怎么调试linux程序_Ubuntu12.10 使用JLink连接开发板用arm-gdb调试ARM程序
  19. 第031讲:永久存储,腌制一缸美味的泡菜 | 学习记录(小甲鱼零基础入门学习Python)
  20. Django和Vue搭建前后端分离框架

热门文章

  1. Java 实现滑动时间窗口限流算法,你见过吗?
  2. 100G 免费技术学习资料大全分享 (2020 年最新)
  3. 也许,这样理解 HTTPS 更容易!
  4. Containers vs Serverless:怎么选择?
  5. 死磕Java并发:J.U.C之阻塞队列:ArrayBlockingQueue
  6. 英文关键词计算tf-idf 余弦相似度_TFIDF原理与实践
  7. ERROR: tensorboard 1.14.0 has requirement setuptools=41.0.0, but you'll have setuptools 39.1.0 whic
  8. google手势检测
  9. Softmax函数详解与推导
  10. PyTorch学习笔记(二)——回归