首先,H264是属于视频编码层的标准形式,视频编码显然是为了压缩大小。 看看下一个未压缩视频数据的大小。 假设视频是高清1280 * 720 ),每秒30帧,即每秒的数据
1280 * 720 *30/8 字节/1024 ) kb )/1024 ) MB )=3.11MB
90分钟的电影将达到16.7GB。 这个数据量显然在目前的网络中是不现实的。
视频压缩的原理就是去除视频冗余部分,下面列举下
1、时间冗馀
时间冗馀是序列图像电视图像、视频)和声音数据中经常包含的冗馀。
图像序列中的两个相邻图像在下一图像和上一图像之间存在很大的相关性,反映了时间冗馀。 同样,在语言中,人说话时发出的声音在时间上是冗长的,因为它是连续的渐变过程,而不是完全时间上独立的过程。
2 )空间冗馀和空间冗馀是图像数据中经常存在的冗馀之一。 在同一图像中,规则物体和规则背景规则意味着表面颜色分布是规则的而不是杂乱的)的表面物理特性相关,这些相关的光学成像结构在数字图像中表现为数据的冗馀。
3 )知识的冗长性很多图像的理解与某种基础知识有相当大的相关性。 例如,人脸的图像有一定的结构。 例如,嘴巴上有鼻子。 鼻子上有眼睛,鼻子在正面脸部图像的中线上等。 这种规律性的结构可以从先验知识的背景知识中得到,我们把这种冗馀性称为知识冗馀性。
4 )在结构冗馀的图像中,存在从大的范围来看非常强的纹理结构,例如布纹图像和榻榻米的图像,他们说在结构上是冗馀的。
5 )视觉冗馀的人类视觉系统不是对图像场的任何变化都能感知到的。 例如,在图像的编码/解码处理中,由于噪声比压缩和截断更大,图像会有一些变化,但如果无法视觉识别,图像就会被认为足够好。 实际上,人的视觉系统的一般分辨率约为26级灰度,而一般的图像量化采用28级灰度,这样的冗馀称为视觉冗馀。 通常,人视觉系统对亮度的变化敏感,对色度的变化相对不敏感; 在高亮度区域,人眼对亮度变化的灵敏度降低。 对物体边缘敏感,内部区域相对不敏感; 对整体结构敏感,但对内部细节相对不敏感。
6 )信息熵的冗馀信息熵是指一组数据所拥有的信息量。 一般定义为H=-pilog2pi。 在此,n是符号数,pi是产生符号yi的概率。 如下所述,为了单位数据量d接近或等于h,设d=pibyi )。 这里,b ) yi是被分配给码元yi的比特数,并且理论上应该取-log2pi。 实际上,在APP应用中很难推测{Po、P1、…、PN—1}。 因此,一般为byo ) byo )…=b ) yn-1 ),例如,英文码符号的长度为7比特,即byo ) byo )…=byn-1 )
由H264原始码流结构组成: H264功能分为两层:视频编码层VCL )和网络提取层NAL )。
VCL :包括核心压缩引擎和块、宏块和片的语法级别的定义,其目标是尽可能独立于网络而有效地进行编码。 nal :负责使VCL生成的位字符串适应各种网络和多环境,涵盖了所有切片级别以上的语法级别。 VCL数据在传输或存储之前映射到一个NALU,而H264数据包含一个NALU。 如下图所示
一个NALU=对应于视频编码的一组NALU报头信息,一个RBSP,原始字节顺序码。
原始NALU单元的结构如下[开始代码] [ nalu header ] [ nalu payload ]三部分。
开始代码是NALU单元的开始,必须是00 00 01或00 00 01。
1. NAL Header
标头协议如上图所示。
例如: 1 00 00 00 01 06: SEI信息
200000016733600 x 670 x1 f=0x 073360 SPs 3000000016833600 x 680 x1 f=0x 083360 PPS 40000016533600 x 650 x1 f=0x 05: IDR slice
RBSP
RBSP时序的说明如下所示
H264的码流层次
看看各层的结构吧。
Slice 片)可以看到NALU的主体是Slice。 slice是H264提出的新概念,是对图像编码后进行分割、高效集成的产物。 一个图像有一个或多个slice。 通过NALU装载网络传输。
片段以限制错误代码的扩散和传输为目的,其中编码片段独立于项目,且一个片段的预测不能以另一片段的宏块作为参考图像。 保证
了某一片的预测误差不会传播到别的片。
一个slice同样包含Slice Header + Slice Data
slice有以下五种类型
1) I -slice: slice的全部MB(宏块)都采用intra-prediction(帧内预测)的方式来编码; 2) P-slice: slice中的MB(宏块)使用intra-prediction(帧内预测)和inter-prediction(帧间预测)的方式来编码,但每一个inter-prediction block最多只能使用一个移动向量; 3) B-slice:与P-slice类似,但每一个inter-prediction block可以使用二个移动向量。B-slice的‘B’是指Bi-predictive(双向预测),除了可由前一儒雅的猫咪后一张影像的I或P、B)-slice外,也能从前二张不同影像的I或P、B)-slice来做inter- prediction。 4) SP-slice:即所谓的Switching P slice,为P-slice的一种特殊类型,用来串接两个不同bitrate的bitstream; 5) SI-slice: 即所谓的Switching I slice,为I-slice的一种特殊类型,除了用来串接两个不同content的bitstream外,也可用来执行随机存取random access)来达到网络VCR的功能
宏块Macroblock,MB) 从上面结构图中可以看到片中包含宏块。那什么是宏块呢?
宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。
一个宏块 = 一个16*16的亮度像素 + 一个8×8Cb + 一个8×8Cr彩色像素块组成。YCbCr 是属于 YUV 家族的一员,在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量)
宏块分类:
I宏块: 帧内预测
P宏块: 利用前帧作为参考进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割
B宏块: 双向参考图像(前帧和后帧)进行帧内预测
简单总结下帧和片和宏块的概念 1帧 = 1个或n个片 1片 = n个宏块 1宏块 = 16x16yuv数据
如下图所示
宏块的结构如下图所示
mb_type 确定该 MB 是帧内或帧间P 或 B)编码模式,确定该 MB 分割的尺寸 mb_pred 确定帧内预测模式帧内宏块)确定表 0 或表 1 参考图 像,和每一宏块分割的差分编码的运动矢量帧间宏块,除 8×8 宏块分割的帧内 MB) sub_mb_pred 只对 8×8MB 分割的帧内 MB)确定每一子宏块的子宏 块分割,每一宏块分割的表 0 和/或表 1 的参考图象;每一 宏块子分割的差分编码运动矢量。 coded_block_pattern 指出哪个 8×8 块亮度和彩色)包 编码变换系数 mb_qp_delta 量化参数的改变值 esidual 预测后对应于残差图象取样的编码变换系数
I,P,B,IDR帧,DTS和PTS,GOP
I帧: 帧内编码帧,I帧通常是每个GOP的第一帧,适度压缩,类似于图片jpg压缩一样的原理。大约可以得到6:1的压缩比。
P帧: 前向预测编码帧,通过图像序列前面已经编码帧的时间冗余信息压缩,称为预测帧,大约可以得到20:1的压缩比
B帧:双向预测内插编码帧,通过前帧和后帧的时间冗余信息压缩,也叫双向预测帧。大约可以得到50:1的压缩比
IDR帧: I帧的一种特殊帧,一个序列的第一个图像叫做 IDR 图像(立即刷新图像)
当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样可以避免前一个序列出现重大错误的问题。
DTS: Decode Time Stamp) 用于视频的解码序列 PTS: Presentation Time Stamp)用于视频的显示序列。
正因为有B帧这样的双向预测帧的存在,某一帧的解码序列和实际的显示序列是不一样的。如下图所示
GOP: (Group of Picture)两个I帧之间形成的一组图片,就是GOP。一般为编码器设置参数的时候,必须设置gop_size的值,表示两个I帧之间的帧数目,相对来说GOP_size设置越小,画面质量越好。但是相应的容量越大。
由于解码必须先获取到I帧,才能获得第一张图像,所以直播秒开的原理就是在CDN缓存一个GOP图片组,这样迅速解码出第一帧图。
参考资料:
从零了解H264结构
H.264学习笔记
关于H264的介绍网络上已经有很多,本文主要是用做笔记记录。
极速赛车五码稳赢技巧通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。
一个宏块 = 一个16*16的亮度像素 + 一个8×8Cb + 一个8×8Cr彩色像素块组成。YCbCr 是属于 YUV 家族的一员,在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量)
宏块分类:
I宏块: 帧内预测
P宏块: 利用前帧作为参考进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割
B宏块: 双向参考图像(前帧和后帧)进行帧内预测
简单总结下帧和片和宏块的概念 1帧 = 1个或n个片 1片 = n个宏块 1宏块 = 16x16yuv数据
如下图所示
宏块的结构如下图所示
mb_type 确定该 MB 是帧内或帧间P 或 B)编码模式,确定该 MB 分割的尺寸 mb_pred 确定帧内预测模式帧内宏块)确定表 0 或表 1 参考图 像,和每一宏块分割的差分编码的运动矢量帧间宏块,除 8×8 宏块分割的帧内 MB) sub_mb_pred 只对 8×8MB 分割的帧内 MB)确定每一子宏块的子宏 块分割,每一宏块分割的表 0 和/或表 1 的参考图象;每一 宏块子分割的差分编码运动矢量。 coded_block_pattern 指出哪个 8×8 块亮度和彩色)包 编码变换系数 mb_qp_delta 量化参数的改变值 esidual 预测后对应于残差图象取样的编码变换系数
I,P,B,IDR帧,DTS和PTS,GOP
I帧: 帧内编码帧,I帧通常是每个GOP的第一帧,适度压缩,类似于图片jpg压缩一样的原理。大约可以得到6:1的压缩比。
P帧: 前向预测编码帧,通过图像序列前面已经编码帧的时间冗余信息压缩,称为预测帧,大约可以得到20:1的压缩比
B帧:双向预测内插编码帧,通过前帧和后帧的时间冗余信息压缩,也叫双向预测帧。大约可以得到50:1的压缩比
IDR帧: I帧的一种特殊帧,一个序列的第一个图像叫做 IDR 图像(立即刷新图像)
当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样可以避免前一个序列出现重大错误的问题。
DTS: Decode Time Stamp) 用于视频的解码序列 PTS: Presentation Time Stamp)用于视频的显示序列。
正因为有B帧这样的双向预测帧的存在,某一帧的解码序列和实际的显示序列是不一样的。如下图所示
GOP: (Group of Picture)两个I帧之间形成的一组图片,就是GOP。一般为编码器设置参数的时候,必须设置gop_size的值,表示两个I帧之间的帧数目,相对来说GOP_size设置越小,画面质量越好。但是相应的容量越大。
由于解码必须先获取到I帧,才能获得第一张图像,所以直播秒开的原理就是在CDN缓存一个GOP图片组,这样迅速解码出第一帧图。
参考资料:
从零了解H264结构
H.264学习笔记
关于H264的介绍网络上已经有很多,本文主要是用做笔记记录。