1、为什么要进行视频编码?
视频是由一帧帧图像组成,就如常见的 gif 图片,如果打开一张 gif 图片,可以发现里面是由很多张图片组成。一般视频为了不让观众感觉到卡顿,一秒钟至少需要 16 帧画面(一般是 30 帧),假如该视频是一个 1280x720 分辨率的视频,那么不经过编码一秒钟的大小:
结果:1280x720x60≈843.75M
所以不经过编码的视频根本没法保存,更不用说传输了。
2、视频压缩编码标准
视频中存在很多冗余信息,比如图像相邻像素之间有较强的相关性,视频序列的相邻图像之间内容相似,人的视觉系统对某些细节不敏感等,对这部分冗余信息进行处理的过程就是视频编码。
H.26X系列(由ITU[国际电传视讯联盟]主导)
H.261:主要在老的视频会议和视频电话产品中使用
H.263:主要用在视频会议、视频电话和网络视频上
H.264:H.264/MPEG-4第十部分,或称AVC(Advanced Video Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。
H.265:高效率视频编码(High Efficiency Video Coding,简称HEVC)是一种视频压缩标准,H.264/MPEG-4 AVC的继任者。可支持4K分辨率甚至到超高画质电视,最高分辨率可达到8192×4320(8K分辨率),这是目前发展的趋势,尚未有大众化编码软件出现
MPEG系列(由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发)
MPEG-1第二部分:MPEG-1第二部分主要使用在VCD上,有些在线视频也使用这种格式
MPEG-2第二部分(MPEG-2第二部分等同于H.262,使用在DVD、SVCD和大多数数字视频广播系统中
MPEG-4第二部分(MPEG-4第二部分标准可以使用在网络传输、广播和媒体存储上
3、编码流程
在进行当前信号编码时,编码器首先会产生对当前信号做预测的信号,称作预测信号(predicted signal)
预测的方式:
时间上的预测(interprediction),亦即使用先前帧的信号做预测
空间上的预测 (intra prediction),亦即使用同一张帧之中相邻像素的信号做预测
得到预测信号后,编码器会将当前信号与预测信号相减得到残余信号(residual signal),并只对残余信号进行编码, 如此一来,可以去除一部份时间上或是空间上的冗余信息。
编码器并不会直接对残余信号进行编码,而是先将残余信号经过变换(通常为离散余弦变换)然后量化以进一步去除空间上和感知上的冗余信息。量化后得到的量化系数会再透过熵编码,去除统计上的冗余信息。
1、H.264 是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称
相关理解:
在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内
所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!
B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。
这段图像我们称为一个序列:序列就是有相同特点的一段数据
当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列
也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容
2、H.264 三种帧
在 H.264 中定义了三种帧:
I 帧:完整编码的帧叫 I 帧
P 帧:参考之前的 I 帧生成的只包含差异部分编码的帧叫 P 帧
B 帧:参考前后的帧编码的帧叫 B 帧
H264 采用的核心算法是帧内压缩和帧间压缩:
帧内压缩是生成 I 帧的算法
帧间压缩是生成 B 帧和 P 帧的算法
压缩方法:
分组: 把几帧图像分为一组 (GOP,也就是一个序列), 为防止运动变化, 帧数不宜取多
定义帧: 将每组内各帧图像定义为三种类型, 即 I 帧、B 帧和 P 帧;
预测帧: 以 I 帧做为基础帧, 以 I 帧预测 P 帧, 再由 I 帧和 P 帧预测 B 帧;
数据传输: 最后将 I 帧数据与预测的差值信息进行存储和传输。
GOP 序列:
在 H264 中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流。
一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像:
a、H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。
b、这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。
c、IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
一个序列就是一段内容差异不太大的图像编码后生成的一串数据流:
a、当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。
b、当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。
在视频编码序列中,GOP 即 Group of picture(图像组),指两个 I 帧之间的距离。
I 帧、P 帧、B 帧实际顺序 && 编码顺序:
H264 算法在概念上分为两层:
VCL:(Video Coding Layer) 视频编码层,负责高效的内容表示。
NAL:(Network Abstraction Layer) 网络提取层,负责以网络所要求的恰当的方式对数据进行打包和传送。
上面所学习的知识都是 VCL 层。
NAL 设计的目的,是根据不同的网络把数据打包成相应的格式,将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中。
NAL 的封装方式:
NAL 是将每一帧数据写入到一个 NAL 单元中,进行传输或存储的
NALU 分为 NAL 头和 NAL 体
NALU 头通常为 00 00 00 01,作为一个新的 NALU 的起始标识
NALU 体封装着 VCL 编码后的信息或者其他信息
NAL 的封装过程:
I 帧、P 帧、B 帧都是被封装成一个或者多个 NALU 进行传输或者存储的
每一个 I 帧开始之前也有非 VCL 的 NAL 单元,用于保存其他信息,它们是 PPS、SPS
PPS(Picture Parameter Sets):图像参数集
SPS(Sequence Parameter Set):序列参数集
在实际的 H264 数据帧中,往往帧前面带有 00 00 00 01 或 00 00 01 分隔符,一般来说编码器编出的首帧数据为 PPS 与 SPS,接着为 I 帧,后续是 B 帧、P 帧等数据
来源: http://www.cnblogs.com/ziyi--caolu/p/8034367.html