H.264 详解
一、MPEG-4说明
1、VOP视频编码技术
VO(Video Object):视频对象,它是场景中的某个物体,最简单的情况下就是矩形框,它是有生命期的,由时间上连续的许多帧构成。
VOP(Video Object Plane):视频对象平面,它可以看作是VO在某一时刻的采样,即一帧VO。
2、运动估计与运动补偿技术
I-VOP、P-VOP、B-VOP三种帧格式来表征不同的运动补偿类型。
帧内VOP(I-VOP):一个VOP与其他VOP分开编码。
预测VOP(P-VOP):VOP可以基于前一个解码后的VOP进行预测(利用运动补偿)。
双向内插VOP(B-VOP):VOP可以用过去的和未来VOP进行预测,B-VOP只能基于I-VOP和P-VOP进行插值。
二、H264说明
1、H264编码的框架分两层
VCL(Video Coding Layer):负责高效的视频内容表示
NAL(Network Abstraction Layer):负责以网络所要求的恰当的方式对数据进行打包和传送
2、重要变化
在H264中完全没有I帧、P帧、B帧、IDR帧的概念,之所以沿用这些说法是为了表明数据的编码模式。数据的组织形式从大到小排序是:序列(sequence)、图像(frame/field-picture)、片组(slice group)、片(slice)、宏块(macroblock)、块(block)、子块(sub-block)、像素(pixel)。
3、数据组织形式
片(slice):图像分成一帧(frame)或两场(field),而帧又可以分成一个或几个片(slice),片由宏块组成。宏块是编码处理的基本单元。一个slice编码之后被打包进一个NALU,NALU除了容纳slice还可以容纳其它数据,如SPS、PPS、SEI等
4、编码相关术语
NALU:H264编码数据存储或传输的基本单元,一般H264码流最开始的两个NALU是SPS和PPS,第三个NALU是IDR。SPS、PPS、SEI这三种NALU不属于帧的范畴。
SPS(Sequence Parameter Sets):序列参数集,作用于一系列连续的编码图像。
PPS(Picture Parameter Set):图像参数集,作用于编码视频序列中一个或多个独立的图像。
SEI(Supplemental enhancement information):附加增强信息,包含了视频画面定时等信息,一般放在主编码图像数据之前,在某些应用中,它可以被省略掉。
IDR(Instantaneous Decoding Refresh):即时解码刷新
HRD(Hypothetical Reference Decoder):假想码流调度器
5、帧编码模式
| 帧类型 | 描述 | 支持的框架 |
| I(Intra) | 只包含帧内预测的宏块(I) | 全部 |
| P(Predicted) | 包含帧间预测宏块(P)和I型宏块 | 全部 |
| B(Bi-Predictive) | 包含帧间双向预测宏块(B)和I型宏块 | 扩展和主 |
| SP(Switching P) | 利于在编码的比特流中切换,包括I和P宏块 | 扩展 |
| SI(Switching I) | 利用在编码的比特流中切换,包含SI宏块(一种特殊的帧内编码宏块) | 扩展 |
5.1、码流总体结构:
h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL)。H.264 的编码视频序列包括一系列的NAL 单元,每个NAL 单元包含一个RBSP。一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示这是一个NALU 单元的开始,必须是"00 00 00 01" 或"00 00 01"。
其中RBPS有分为几种类型:
NAL的解码单元的流程如下:
5.2 NAL Header:
占一个字节,由三部分组成forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)。
forbidden_bit:禁止位。
nal_reference_bit:当前NAL的优先级,值越大,该NAL越重要。
nal_unit_type :NAL类型。参见下表
几个例子:
6、H264和AVC1的差异
FOURCC AVC1:H264 bitstream without start codes
FOURCC H264:H264 bitstream with start codes
带有开始码的H264视频一般是用于无线发射、有线广播或者HD-DVD中,这些数据流的开始都有一个开始码0x000001或者0x00000001,“NALU”是NAL(网络适配层)以网络所要求的恰当方式对数据进行打包和发送的基本单元;
没有开始码的H264视频主要是存储在MP4格式的文件中,它的数据流的开始是1、2或者4个字节表示长度数据,“NALU”简单说是H264格式中的最基本的单元,是一个数据包。
三、H.264、x264、H264、AVC1区别和联系
1、H.264是MPEG4的第十部分,是一个标准。
国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC。
2、x264是一个编码器,他参照的标准是H.264。
H.264是需要付费的编码格式,而x264是符合H.264标准的一个开源项目,是免费的,也就是H264的一个简化版,不支持某些高级特性。但x264非常优秀,并不比H264的商业编码器差。
3、h264与AVC1都是FourCC(他俩通常在什么情况下使用呢?)
FOURCC为AVC1,没有开始码的H.264视频,主要就是用MP4或MKV等封装的文件,也就是你平时在电脑上看的那种,它的数据流开始是1、2或者4个字节表示长度数据。x264编码出来的都是这种。
FOURCC为H264,是带有开始码的H.264视频,一般是用于无线发射、有线广播或者HD-DVD中的。这些数据流的开始都有一个开始码:0x000001 或者 0x00000001。
4、如果在编码符合H.264标准的文件时,如果没有用到x264编码器,那么通常使用的是哪个编码器?(就是那个支持显卡加速的那个)
符合H.264标准的编码器,也就是H.264的商业编码器,和免费的x264了。
至于支持显卡加速的编码格式,根据显卡不同,支持的也不一样。大概也就是H264(x264/AVC1)、VC-1、MPEG-1、MPEG-2、MPEG-4、WMV3。。。当然除了H264(x264/AVC1),其他都不是H.264标准的
文章大部分引用自:
http://blog.csdn.net/alien75/article/details/38399399
http://blog.csdn.net/chenchong_219/article/details/37990541
这里有一个雷博解析H.264的源代码,大家可以下载下来看看。
http://download.csdn.net/detail/leixiaohua1020/9422409
H.264 详解的更多相关文章
- CGGeometry.h 文件详解
这些是在CGGeometry.h里的 CGPoint.CGSize.CGRect.CGRectEdge实际上都是结构体 struct CGPoint { CGFloat x; CGFloat y; } ...
- math.h库详解
sin(double) cos(double) tan(double) 分别返回正弦,余弦,正切 #include<iostream> #include<math.h> usi ...
- UIKit继承结构和UIView.h文件详解
@interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem> ...
- Arduino String.h库函数详解
此库中包含 1 charAT() 2 compareTo() 3 concat() 4 endsWith() 5 equals() 6 equalslgnoreCase() 7 getBytes() ...
- iOS开发CATransform3D.h属性详解和方法使用
1.CATransform3D简介 layer有个属性transform,是CATransform3D类型.可以使其在三维界面作平移.缩放和旋转单独或组合动画! CATransform3D结构体: / ...
- H.264 基础及 RTP 封包详解
转自:http://my.oschina.net/u/1431835/blog/393315 一. h264基础概念 1.NAL.Slice与frame意思及相互关系 1 frame的数据可以分为多个 ...
- 转:MediaCoder H.264格式编码参数设置及详解
转: http://mediacoder.com.cn/node/81 由于现在大部分视频转码都选择H.264格式进行编码,同时CUDA编码的画质还达不到x264软编码的质量(如果你对画质无要求,可以 ...
- 直播一:H.264编码基础知识详解
一.编码基础概念 1.为什么要进行视频编码? 视频是由一帧帧图像组成,就如常见的gif图片,如果打开一张gif图片,可以发现里面是由很多张图片组成.一般视频为了不让观众感觉到卡顿,一秒钟至少需要16帧 ...
- H.264帧结构详解
6.1.2.源码简单浏览 6.1.3.重点1:h.264帧结构6.1.4.重点2:帧结构分析软件的使用6.1.5.重点3:rtsp网络编程6.1.6.重点4:wireshark网络抓包工具的使用 6. ...
随机推荐
- dev exception 2018
java.lang.IllegalArgumentException: Circular placeholder reference 'trace.enable' in property defini ...
- Manifest merger failed with multiple errors, see logs
Manifest merger failed with multiple errors, see logs 错误解决 合并 manifest 错误. https://blog.csdn.net/u01 ...
- kafka可视化工具安装及简单使用
一.安装 双击kafkatool_64bit.exe安装kafka可视化工具,并且C:\Windows\System32\drivers\etc配置HOSTS,打开HOSTS并添加: HOSTS添加: ...
- Android系统服务 —— WMS与AMS
“可以毫不夸张的说,Android的framework层主要是由WMS.AMS还有View所构成,这三个模块穿插交互在整个framework中,掌握了它们之间的关系和每一个逻辑步骤,你对framewo ...
- linux下如何查看当前内核的配置?
答: zcat /proc/config.gz 当然有个前提条件,需要打开内核的以下两个选项(CONFIG_IKCONFIG和CONFIG_IKCONFIG_PROC): General setup ...
- Ansible批量自动化管理工具 roles标准化
批量管理服务器的工具,无需部署代理,通过ssh进行管理,是python写的 ansible 常用模块 : (1)shell命令模块执行命令 (2)copy模块批量下发文件或文件夹 (3)script模 ...
- 映射器Mapping
1) org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping(核心) 将程序员定义的Action所对应的<bean& ...
- java(SSM)上传文件到七牛云(对象存储)
项目中会用到大量的图片和小视频,为了分担服务器压力,将文件都放在七牛云.这里的思路很简单, 就是移动端.pc端把文件上传到服务器,服务器做一个临时缓存,保存必要的信息到数据库后, 将文件上传到七牛云, ...
- js 笔记整理
Js中for.for-in.forEach以及for-of的用法及特性对比 for-in for...in以任意顺序遍历一个对象的可枚举属性.所以for-in不适合用来迭代一个Array.同时,for ...
- HP LaserJet M602 更換碳粉盒CE390XC
HP LaserJet M602 原裝碳粉盒為 CE390A 且容量小不夠用,故更換大號的 CE390XC ,需要將 CE390XC 外面的所有橙色部件去掉(取走上面一條帶2個凸起的遮罩,左側有一個耳 ...