一. H.264
视频传输离不开编码,编码过程可以理解为数据压缩过程,由于原始的视频数据太过于庞大,直接传输对带宽的占用太大,因此通过一种压缩方式来进行处理,最常用的是我们常说的H.264标准,也是安防监控领域实际的行业标准。
H.264 是属于 FPEG-4 的一种标准编解码格式,要理解 编解码原理 首先要理解 I帧 | P帧 | B帧 的概念:
> I帧
I 帧(Independent)是指 关键帧,保留了完整的图片信息,不需要参考其他帧。
解码时 只需要当前帧数据就可以完成解码,数据量比较大。
> I帧
P 帧(Prev) 是指 前向预测编码帧,只记录变化部分像素信息(增量信息)。
解码时 需要参考前面的 I帧或P帧 来完成解码,因此如果出现前面 P帧部分丢失,会影响解码质量。
由于只记录了 部分增量信息,因此数据量很小。
> B帧
B 帧 是指 双向编码帧,既需要参考前面的 I/P 帧,也可以参考后面的 I/P 帧,相对比较复杂。
B帧 压缩率比较高,相应的计算量也大,目前 B帧已经用的比较少了,简单了解即可。
在现代的监控编码中,主要是使用 I帧/P帧 进行编码的方式,这里要说明的一个概念就是 I帧间隔,I帧间隔 是作为一个编解码过程的起始,也就是最初参考帧,从一个I帧开始 到下一个I帧 成为一个 GOP(运动序列)。
由于H.264 是基于运动编码,因此变化不能太大,对应 GOP 的长度不能太大,否则会严重影响编码质量,通常的 GOP大小(I帧间隔)不超过25帧。
一个 GOP 可以描述为:
二. PS封包
PS 是 GB28181 规定的标准封包格式(也是存储格式),在讲 PS 之前,先介绍几种相关的 数据格式概念:
1)ES
基本流 (Elementary Streams)是直接从编码器出来的数据流,也成为净荷数据。ES是编码后的视频流(比如H.264),音频数据流(如AAC),和其他编码数据流的统称。
ES是只包含一种内容的数据流(比如纯粹的视频或音频),每个ES都由若干个存取单元(AU)组成,每个视频AU或音频AU都是由头部和编码数据两部分组成,1个AU相当于编码的1幅视频图像或1个音频帧,也可以说,每个AU实际上是编码数据流的显示单元,即相当于解码的1幅视频图像或1个音频帧的取样。
2)PES
打包的ES(Packetized Elementary Streams),是用来传递ES的一种数据结构。是ES流经过 PES打包形成的数据流,即将ES流分组、打包、加入包头信息,是对ES流的第一次打包。
PTS - 显示时间戳(Presentation Time Stamp),用来表示显示单元出现在系统目标解码器的时间。
DTS - 解码时间戳(Decoding Time Stamp),用来表示将存取单元全部字节从解码缓存取走的时间。
PTS/DTS 这两个参数是解决音视频同步显示,防止解码器输入缓存上溢或下溢的关键。每一个 I帧 | P帧 | B帧 的包头都有一个PTS和DTS。
3)PS
一个PS包 由若干个 PES 包组成,PS包头包含了同步信息与时钟恢复信息。
一个PS包 最多可包含具有同一时钟基准的16个视频PES包和32个音频PES包。
PS包是针对 ES净荷数据 的第二次封装。
PS 包中的流类型( stream type )的取值如下:
MPEG-4
视频流
H.264
视频流
SVAC
视频流
G.711
音频流
G.722.1
音频流
G.723.1
音频流
G.729
音频流
SVAC
音频流
0x10
0x1B
0x80
0x90
0x92
0x93
0x99
0x9B
来看一下 PS包头:
注意:这里面有一个 System Header,位于 PS包头之后,当且仅当第一个数据包时 该Header存在。
在文件开头封包格式为:PS头 + System 头 + PES头 + H264流
非文件开头格式: PS头 + PES头 + H264流