H264基础简介

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H264基础简介相关的知识,希望对你有一定的参考价值。

参考技术A

H264是属于视频的编码层的标准格式,视频编码显然是为了压缩大小。
我们看下一个完全没压缩的视频数据大小。假设视频是高清(1280 * 720),每秒30帧,也就是每秒的数据

那么90分钟的电影就要16.7GB,这个数据量显然在当前网络下是不现实的。

组成:
H264功能分为两层,VCL(视频编码层)和 NAL(网络提取层).

一个原始的NALU单元结构如下
[StartCode][NALU Header][NALU Payload]三部分。

1. NAL Header

头信息协议如上图。

下面是RBSP序列的描述

下面我们挨个来看每层的结构.

可以看到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的功能

宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。

宏块分类:

I宏块: 帧内预测

P宏块: 利用前帧作为参考进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割

B宏块: 双向参考图像(前帧和后帧)进行帧内预测

简单总结下帧和片和宏块的概念
1帧 = 1个或n个片
1片 = n个宏块
1宏块 = 16x16yuv数据

如下图所示

宏块的结构如下图所示

I帧: 帧内编码帧,I帧通常是每个GOP的第一帧,适度压缩,类似于图片jpg压缩一样的原理。大约可以得到6:1的压缩比。

P帧: 前向预测编码帧,通过图像序列前面已经编码帧的时间冗余信息压缩,称为预测帧,大约可以得到20:1的压缩比

B帧:双向预测内插编码帧,通过前帧和后帧的时间冗余信息压缩,也叫双向预测帧。大约可以得到50:1的压缩比

IDR帧: I帧的一种特殊帧,一个序列的第一个图像叫做 IDR 图像(立即刷新图像)

DTS: (Decode Time Stamp) 用于视频的解码序列
PTS: (Presentation Time Stamp)用于视频的显示序列。

正因为有B帧这样的双向预测帧的存在,某一帧的解码序列和实际的显示序列是不一样的。如下图所示

GOP: (Group of Picture)两个I帧之间形成的一组图片,就是GOP。一般为编码器设置参数的时候,必须设置gop_size的值,表示两个I帧之间的帧数目,相对来说GOP_size设置越小,画面质量越好。但是相应的容量越大。

参考资料:

关于H264的介绍网络上已经有很多,本文主要是用做笔记记录。

以上是关于H264基础简介的主要内容,如果未能解决你的问题,请参考以下文章

h264编码基础

媒体基础:在没有容器的情况下解码和显示 H264 帧

Android音视频H264编码基础

H264码流结构一探究竟

H264码流结构一探究竟

H264码流结构一探究竟