前言
一段1080P,60帧的视频,一秒钟应该占多少空间?
- 一帧像素为:1920×1080 ≈ 200万
- 每个像素算3Byte
- 一帧画面:200万 × 3 ÷ 1024 ÷ 1024 ≈ 5.7M
- 理论上一秒60帧的视频:5.7M × 60 = 342MB
实际上不可能这么大,为什么没有这么大就是视频压缩的功劳了!平时看的视频都是经过压缩的所以一秒钟视频才1~2MB,所以视频压缩才是真牛逼啊!
分辨率
什么是分辨率:横向多少个像素X纵向多少个像素=分辨率
- 4K:3840x2160
- 2K:2560x1440
- Full HD:1920x1080
- HD:1280x720
1080p 和 1080i的区别
- 1080p:p–Progressive Scanning:逐行扫描
- 1080i:i–Interlace Scanning:隔行扫描
显像管时代,CRT显示器的画面是通过显像管里面的电子枪一行一行的打过去的,这个就是逐行扫描。一开始这样做是没有问题的,直到电视台决定增加画面的清晰度,这样可以让观众看得更加舒服;但是这样问题就来了,增加清晰度的同时,通到观众家里的“水管”还是这么小–带宽就不够用了!那时的研发人员就想到了一个“馊主意”:我们把屏幕上方扫描到屏幕下方而获得的一个画面叫做一个“场”,逐行扫一轮下来的场就是一帧完整的画面。他们把一帧画面分割成两个场来扫描但它们都是隔一行才扫描一次的,如下图:
先扫描奇数场再扫描偶数场,然后再把两个场的画面拼起来就得到了一个完整的画面了;这就是隔行扫描。隔行扫描相比逐行扫描带宽降低了一半,这样就可以在相同的带宽下获得更高的清晰度了,隔行扫描主要是电视节目。(渲染视频的时候容易搞错场序~~)
视频格式
视频格式是由:封装格式 + 编码格式
常见的封装-编码格式表
封装 | 编码格式 |
---|---|
MP4 | H.264,H.265,MPEG-4 … |
AVI | H.264,AC-1,MPEG-2 … |
MOV | H.264,XVID,MPEG-2 … |
WMV | WMV,AC-1 … |
WebM | VP8,VP9 … |
RM/RMVB | RV,RM … |
TS/PS | H.264,MPEG-2,MPEG-4 … |
MKV | 可以封装所有的视频编码格式 |
码率(bitrate)
视频速率,视频每秒所包含的数据量、信息量,码率直接影响到视频的大小。
H.264编码标准
压缩方法:
- 帧内压缩
- 帧间压缩
帧内压缩
压缩原理:把视频内的每一帧画面都压缩成 JPEG这类有损的图像格式,JPEG图像格式的对比如下:
JPEG是最流行也是最讨巧(耍流氓)的图片压缩方法,它就是利用了我们人眼对于亮度(明度)非常的敏感,但是对于颜色比较麻木的这种特性,将图片里面的亮度信息尽量的保留下来,然后对颜色信息进行大幅度的压缩;尤其是画面中颜色比较复杂的部分。JPEG图像压缩的效率非常的高以至于在视频压缩的这个领域,光是把无损视频里面的每一帧都用JPEG压缩就缩小了90%的视频体积。
## 帧间压缩
但就是JPEG压缩的效率已经这么高了,对于视频来说还是远远不够!看的视频中如1080P 60帧的视频来说,其实只有几张关键的图片是“原生的JPEG图像”其他都是计算机通过算法脑补出来的如下:
意思就是说:我们只要记录关键的几帧画面再加上当中的画面变化的一些小细节,以及物体的运动轨迹就好了,根本就不需要记录中间的这些画面,这样就大大的减少了视频的占用空间,这就是帧间压缩的基本原理了。
对应到H.264中就有了:I帧,P帧,B帧
I帧(关键帧) 和 P帧(预测帧)
I帧是完整的关键帧,先把I帧分割成很多个8x8或者16x16像素的“宏块”如上图,然后对I帧和下一个帧里面每一个对应的“宏块”进行比较如下图,如果发现这前后两帧“宏块”是有关联性的、有规律可循的,可能有几个“宏块”是完全一样的或者说是细微的变了一下位置,那么就是说下一帧是可以通过预测得出来的如下下图,就可以把下一帧叫做P帧–预测帧,对于P帧里面没有变化的在编码的时候就可以直接写上照抄I帧就可以了。
对于前后没有变化的“宏块”直接照抄上一帧的
对于前后发生了变化的“宏块”就记录变化的信息:是否变了颜色?是否移动了位置?还是消失了?编码的时候把这些变化记录下来,解码的时候在预测回去这就是P帧。P帧相对于I帧可以节约一半以上的空间。
B帧(双向预测帧)
B帧是在I帧和P帧的基础上再进行预测,而且B不仅参考前面的帧而且还参考后面的帧;B帧相比P帧能再节省一半以上的空间。
我们的视频就是由这些I帧、B帧和P帧组合起来的,这就是为什么一部视频一秒钟理论上明明占用300多M的空间,但实际上十分钟都不一定要占300M的空间,这就是视频编码的魅力!
问题
但是这样的编码方式也会带来问题,当视频里面加入很多五颜六色的特效或者复杂的动态场景,这时视频的信息量就太大了,小码率就根本塞不下,其次电脑也根本没办法预测下一帧那些五颜六色的像素会走到哪里,这种情况下,就需要更高的画质预设和可变码率来进行编码。
关于H.264的一些基本知识
GOP
GOP (Group of Picture):每一组IPB帧序列包含了多少帧,即一个I帧之后要经过多少帧才会出现下一个I帧如下图,同码率下,GOP值越大,B帧与P帧越多,视频质量就越高。
## 三个控制码率的参数:CBR(固定码率)、VBR(可变码率)、CRF(固定质量)
参数 | |||
---|---|---|---|
CBR | 文件大小可预期 | 编码压力小,直播常用 | 空间利用率最低的一种方法 |
VBR | 码率可变,按需分配 | 简单场景码率低,复杂场景码率高,还可以选择渲染两遍来提高视频质量 | 空间利用率最低的一种方法 |
CRF | 固定质量模式 | CRF值越低,视频看起来质量越高,反之亦然以观感画质为目标 | 码率、文件大小不可预期 |