MPEG编解码格式
历史
ITU-T制定的编解码标准是H.xxx。
而MPEG制定的编解码标准是MPEG-x。
后面两个组织从H262/MPEG-2开始统一制定标准,但是在自己标准中延续自己组织的命名。
对应关系
组织 | 标准 | 标准 | 标准 |
---|---|---|---|
ITU-T | H.262 | H.264 | H.265 |
ISO | MPEG-2 | MPEG-4 AVC | HEVC |
!!注意:
常说的MPEG-4指的是MPEG-4 part2,而AVC是MPEG-4 part10(MPEG-4 part的扩展),两者是不同的。
H264编解码原理
视频数据能被大量压缩的原因
主要有以下四点:
- 时间冗余:视频相邻的两帧之间内容相似,存在运动关系
- 空间冗余:视频的某一帧内部的相邻像素存在相似性
- 视觉冗余:观众的视觉系统对视频中不同的部分敏感度不同
- 编码冗余:视频中不同数据出现的概率不同
H264视频编码常见名词
帧(frame)
- 帧是指一副图像的一场或一帧可用来产生一个编码图像。
- 帧有以下几种类型:
I帧:能够独立完成编解码的视频帧
P帧:参考此帧之前的帧进行编解码的视频帧
B帧:参考此帧前后的帧进行编解码的视频帧
场(field)
- 在早期电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场(Top field, Bottom field)。
- 根据编码单位分为帧编码和场编码。
在帧编码中,参考单位为帧图像,采用帧运动补偿,两个场是联合编码;
在场编码中,参考单位为场图像,采用场运动补偿,两个场分别编码。
以下是逐行扫描和隔行扫描的数据存储方式:
片(slice)
- 每帧图像(frame)被编码成一个或多个片。一个片通常被打包进一个NALU中。
- 片分为I片、B片、P片、SP片(按照不同参考帧重构出相同的图像帧,用于不同编码码流间的切换)和SI片(特殊类型的编码宏块)。
I片:只包含I宏块,只能帧内预测。 P片:只包含P宏块和I宏块,可以帧内预测和帧间预测。 B片:只要包含B宏块,可以帧内预测和帧间预测。 SP片:包含P宏块,有可能有I宏块,用于不同编码流之间进行切换。 SI片:包含SI宏块(一种特殊类型的帧内编码宏块),用于不同编码流之间进行切换。
- 片的目的是为了限制误码的扩散和传输,使同一帧图像的编码片间是独立的。
帧内某片的预测不能以其它片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去。(??)
宏块(macro block)
- 宏块是H.264编码的基本单位,一个片通常划分成若干宏块组成。一个宏块由一个16×16像素点组成。
- 分为I、P、B宏块:
I 宏块 : 利用从 当前片中已解码的像素 作为参考进行帧内预测。
(也就是不能取其它片中的已解码像素作为参考进行帧内预测)
P宏块: 利用 前面已编码图象 作为参考图象进行 帧间预测。
B宏块: 利用 双向的参考图象(前面帧和后面帧)进行帧间预测。
序列(GOP)
- 序列是指一组内容差异不大的图像编码后生成的一串数据流。
何为内容差异不大? -->相邻的几幅图像,(数量上)只有 10% 以内的像素有差别,且亮度差值变化不超过2%,而色度差值的变化只有1%以内
- 一个序列的第一个图像通常为IDR图像(立即刷新图像)
序列参数集 SPS(Sequence Parameter Set )
描述一个连续编码视频序列的参数。
如标识符 seq_parameter_set_id、帧数及POC的约束、参考帧数目、分辨率、帧率和帧场编码模式选择标识等等。