x264中的帧类型、条带类型、数据分区(data partition)
1 条带类型(slice type)
x264的条带有三种基本类型分别为:I(主要用于帧内图像编码)、P(用于帧间前向参考预测图像编码)、B(用于帧间双向参考预测图像编码)、SI与SP(切换码流时用),其中I条带只包括I宏块、P条带除了P宏块还可以是I宏块,B条带除了B宏块也可以是I宏块。
2 帧类型(简单起见不考虑隔行视频情况)
就x264码流结构来说不存在帧这个封装层次,也就没有帧的概念,站在编码角度看,帧类型是编码开始前由应用层手工指定,如果指定会AUTO类型,由编码器在编码的初始化阶段分配帧类型,另外就码流结构来说与帧最接近的码流封装层次是条带,条带又有条带类型,一帧视频图像可以编码出多个条带,为什么这么做呢,主要是为了隔离错误,如果一个条带在类似于UDP这样的非可靠传输中丢失或部分数据出现错误从而解码失败时,不影响其它条带解码。
编码时跟据帧类型确定条带类型,比如I帧的所有的条带类型都是I类型,P帧的所有条带类型都是P类型,B帧的所有条带类型都是P类型,除此之外,在X264还有一个特别的IDR帧(就编码来说其本身就是I帧只是他们的NAL类型不同)与Bref帧(就编码来说其本身就是B帧类型只是其可以做为后序编码帧的参考帧)。解码时反过来即可推出帧类型。
3 NAL类型中的承载条带数据的五种类型
类型1:非IDR图像的编码条带(不分区),包括I(非IDR)、P、B、Bref
类型2:编码条带数据分区A
类型3:编码条带数据分区B
类型4:编码条带数据分区C
类型5:IDR图像的编码条带(不分区),只有IDR,从类型1与5可以分辨出IDR帧,尽一步跟据条带头的类型可以分辨出I帧
为什么要分区?分区是为了对重要程度不同的句法元素采用不同的传输手段,比如片头的句法元素传输时可以要求对方确认,而为了实时性部分编码数据丢失就算了,不重传了。
何为分区呢?就是将片头数据、片里面包括的帧内编码数据、片里面包括的帧间编码数据分成三种封装格式,并分别命名为分类2、分类3、分类4(实际上分类是一种关联手段,比如编码条带数据分区A对应分类2,实际上在句法表中所有标分类为2的句法元素都是是可以并只能包括在编码条带数据分区A中的句法元素),并分别分配NAL类型为类型2、类型3、类型4。类型1可以包括分类2、分类3、类型4的所有句法元素(具体到不同的条带类型,可能只包括分类2与分类3,也可能只包括分类2与分类4,也可能是包括分类2、分类3、分类4),类型5只包括分类2、分类3所有句法元素。
对于I条带来说,可以用类型1的NAL封装,也可以用类型2与类型3这一组合封装。
对于P、B条带来说,可以用类型1的NAL封装,也可以用类型2与类型4这一组合封装,还可以用类型2、类型3与类型4这一组合来封装。
IDR帧的I条带用类型5封装肯定是可以的了,但是如果采用分区机制呢?分区后通过码流如何识别出I帧与IDR帧呢?
x264中的帧类型、条带类型、数据分区(data partition)的更多相关文章
- 将String类型的json数据转换为真正的json数据
问题 在做JavaWeb项目的时候,我们经常需要将Java对象转化为Json数据格式响应到前台页面,但是转化完成之后,看着是Json类型的数据格式,但实际上是字符串类型,在这里说两个方法将String ...
- koa 基础(十)原生node.js 在 koa 中获取表单提交的数据
1.app.js // 引入模块 const Koa = require('koa'); const router = require('koa-router')(); /*引入是实例化路由 推荐*/ ...
- 使用头文件cfloat中的符号常量获知浮点类型数据的表数范围---gyy整理
使用头文件cfloat中的符号常量获知浮点类型数据的表数范围 cfloat头文件包含了系统的浮点数的长度限制 头文件climits中的符号常量是获知整型数据的表数范围,并不能获取浮点类型数据的表数范围 ...
- java中,字符串类型的时间数据怎样转换成date类型。
将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...
- C#中遍历DataTable类型并删除行数据
从数据库中读取出了DataSet类型的数据,通过dataSet.Tables[0]获得DataTable类型的数据. 这时候如果想批量修改dataTable中的内容,比如要删除dataTable中co ...
- NET中的引用类型和值类型 zt
.NET中的类型分为值类型和引用类型,他们在内存布局,分配,相等性,赋值,存储以及一些其他的特性上有很多不同,这些不同将会直接影响到我们应用程序 的效率.本文视图对.NET 基础类型中的值类型和引用类 ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- Scala 深入浅出实战经典 第81讲:Scala中List的构造是的类型约束逆变、协变、下界详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-97讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Python3.x中bytes类型和str类型深入分析
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...
随机推荐
- Java-继承的应用
class array { private int[] temp; private int foot; public array(int len) //为temp数组规定大小,并开辟空间,申 ...
- 【C++自我精讲】基础系列一 指针与引用
[C++自我精讲]基础系列一 指针与引用 一 前言 指针.引用.指针与引用区别. 二 指针 变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...
- 解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND
原文:http://kikoroc.com/2016/05/04/resolve-hexo-DTraceProviderBindings-MODULE-NOT-FOUND.html 今晚折腾hexo的 ...
- Hexo+NextT第三方服务调用【4】
该系列博客列表请访问:http://www.cnblogs.com/penglei-it/category/934299.html 摘要 静态站点与动态站点有很大的不一样,它拥有一定的局 ...
- github 自学文档 希望可以给初学的人一些帮助
一 .git的安装 windows下面的安装:https://git-for-windows.github.io 从这里下载完全无脑安装. 安装完成后,在开始菜单里找到"Git" ...
- Semaphore初探
示例一: package com.smbea.demo.semaphore; import java.util.concurrent.ExecutorService; import java.util ...
- java中的instanceof
instanceof是Java.php的一个二元操作符(运算符),和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实 ...
- Flexible 弹性盒子模型之CSS justify-content 属性
实例 在弹性盒对象的 <div> 元素中的各项周围留有空白: div { display: flex; justify-content: space-around; } 复制 效果预览 浏 ...
- BZOJ1013 [JSOI2008]球形空间产生器sphere(高斯消元)
1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4846 Solved: 2525[Subm ...
- linux 开启防火墙操作
1)在/etc/sysconfig/ 下新建iptables文件,添加如下代码: *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ...