往往就是这样,不知不觉 已经到了四月了; 算了 不矫情了 正文开始…

其实大家都知道,视频之所以会动,就和它每秒传输的画面数息息相关,也就是帧数(fps)了,相信玩游戏的Gamer一定对这个参数再熟悉不过了。

但事情可不止这么简单,先举个栗子🌰来说吧。

如果我们要播放1080p 60帧的视频那么,一秒钟应该占用多少空间呢?


不妨按照我们正常理解的先算下。

一帧 1920*1080约等于 200万像素,按照正常三基色显示,每个像素算3个字节,那么一帧就占用(200w*3)/1024/1024 约等于 5.7m的空间。

1秒60帧 理论5.7m*60 = 342mb 

是不是觉得那里不对,如果视频无损,不压缩的情况下 没准就这么大。

正常我们看的视频,基本都是通过压缩的,所以一秒只有在1~2m左右;

那么问题来了,从342mb到2mb左右空间,这么神奇的x操作是怎么做到的呢?

那么就来聊聊与视频相关的那些事~

首先列举下和视频相关的属性,看有没有哪些是熟悉的。

1080p ,分辨率 ,H.264 , 码率 , 帧率 , GOP , MP4 , I\P\B帧 , CBR

接下来由浅入深,先从简单开始吧。

  • 1920*1080

分辨率再熟悉不过了,横向有多少像素乘以纵向多少像素,得到就是分辨率。分辨率越高画面越清晰。

  • 1080P

如果以为是1920*1080的缩写,那就太容易了,其实除了1080p还有1080i。 其实1080p和1080i分别指的是 逐行扫描(Progressive)和隔行扫描(Interlace)。

这个也很像图片渲染的相关原理,有空再开个“图片”是怎么来的专题 👻 。

在显像管时代,CRT显示器显示是通过电子枪一行一行扫描显示视频信息的,这就是逐行扫描;一开始这样做没有问题,后来电视台想增加画面的清晰度,让观众看得更舒服,这样问题就来了。增加清晰度的同时传输的数据也相应个增多,但是观众的带宽还是这么小,问题带宽不够用。

后面电视台出了个注意,把从屏幕上方扫到下方称之为 “场”,逐行扫描是将一帧完整的画面按照顺序,一行接一行扫描来形成的画面,得到的就是一帧完整画面。而隔行扫描是把一帧画面分成两个次来扫描,每个场都是隔一行扫描一次,先扫描奇数场,再扫描偶数场,把两个场的画面拼起来,就得到一张完整的画面,这就是隔行扫描。

相比逐行扫描,在相同的带宽,隔行扫描在降低画面质量的情况下,带来更高的带宽以及画面流畅度。

其实隔行扫描小时候很常见

隔行扫描

在现在,我们所使用的设备中不用担心这种遗留问题,也很少用到隔行扫描,但是在视频编辑软件中,需要注意导出场序

  • 60FPS

帧率 应该都懂,这里只讲一个问题,为什么很多视频会有29.97和59.94这样奇怪的帧数,为什么不是整数?这个算是历史遗留问题。

这问题就关乎于电视的制式,NTSC 简称N制与PAL 简称P制。

在很久之前,在美国黑白电视都是30帧,525线分辨率,到了50年代,开始打造彩色电视,也就是N制,用于从黑白电视转到彩色电视。为了解决在信号传输过程中,由于彩色信号,亮度信号和音频信号之间互相干扰,且又能向下兼容黑白电视,于是工程师们想出个办法,就是将画面的帧率做0.1%比例的缩减,避免两者之间的干扰。因此彩色电视机的帧率从60帧每秒下降到59.94每秒,30帧每秒下降到29.97每秒,这就是这些数字的由来,而这个标准就是NTSC标准。在美国,加拿大,日本,韩国等地区 都是这个标准,而中国和欧使用PAL标准也就是25帧。

不过现在都9021年了 为什么还是这种奇怪的帧数,因为现在的摄像机和后期编辑软件依然是基于NTSC打造的,所以一旦标准定下来就很难改变了。

现在电影制作也试图使用,60帧,或者120帧,来减少画面动态模糊,来创造出更加流畅的画面,毕竟帧率越高画面也就更流畅。比如由李安导演的2016年上映《比利林恩的中场战事》就是采用120帧所拍摄。

当然电影120帧,见仁见智,个人觉得不像是在看电影,而是游戏里开场动画特效。120帧固然很好,但是也就舍弃了,24帧独有的电影感。

  • MP4

这个应该再熟悉不过了,视频格式,但是视频的格式是有封装格式和编码格式之分的,而MP4就属于一种封装格式,一种容器,它规定了视频的外在,换句话说MP4是一层皮,要和编码格式配合起来,才会有我们所看到的视频。除了MP4 常见的封装格式有 FLV,AVI,MOV 等等。

  • 6000kbps

码率(bitrate),对于视频来说这个就极其关键了,直译过来就是“数据速率”意思,就是每秒钟视频包含的信息和数据量,所以码率的大小,就很大程度上影响视频的质量和存储大小,毕竟信息量大了,就有办法展示更多画面细节了,无论直播还是视频网站,多少都有相应的码率的限制。一:考虑服务器存储空间问题,码率大了,文件内存相应也会增加,毕竟存在服务器文件也是要钱的。二:观看用户的网速可能也没有这么快,而且还要考虑流量的问题。

往往视频直播网站会有码率的限制,而视频网站也会有根二压线来控制码率,一旦超过会进行二次压缩。例如B站,视频码率最高6Mbps,峰值24Mbps,超过的都会被二次压缩。作为作者要做的就是在有限码率内,尽可能压缩出更高质量的视频,而作为主播,就要在有限的码率尽可能提高直播的画质,同时还要照顾机器的性能。

要做到以上那些压缩的事情就要考虑到下面这个了 H.264 等这类编码格式

bilibili

腾讯视频

  • H.264

一种编码格式,一开始就说了 如果1080p 一秒60帧视频不压缩的话 就要占300M空间,这显然是不现实。所以我们基本看到的视频都是被压缩的,而视频通过什么方式去压缩,靠的就是像H.264这样的编码标准实现的。对于H.264等现代的编码格式来说,视频压缩是由“帧内压缩”和“帧间压缩”两种方式相结合的。

帧内压缩: 就是把视频里的每个画面都压缩成JPEG这类有损图像;它就是利用我们人眼对亮度非常敏感,但是对于颜色比较麻木的特性,将图片里的亮度信息尽可能保留下来,然后对颜色信息进行大幅度压缩,尤其是画面中颜色比较复杂的细节,反正你也不仔细看😝,不要罢了。 如果视频里的每一帧都用JPEG压缩下 就已经缩小视频90%的体积了。但是还是远远不够。

帧间压缩: 看到的视频每秒60帧的画面里面,其实只有那么几帧是原生JPEG图像,剩下全是通过算法脑补出来的。意思就是记录视频里面关键的几帧画面,再加上画面里面变化的小细节和物体运动轨迹就可以了。

反应到h.264里 就有了 I帧,P帧,B帧的概念,其中I帧就是关键帧, 我们把关键帧分割成16*16的宏块,然后将I帧和下一个帧对应的宏块进行对比,如果画面的动画是有规律可循的或者说只是细微的变了下位置,那我们就知道 下一帧是可以预测的 那我们就把下一帧称之为P帧(预测帧),对于P帧宏块,如果没有变化的宏块,编码的时候可以直接写上照抄I帧,对于有变化的宏块,我们就比较前后两帧的变化,记录下变化的信息。B帧(双向预测帧) 它是在I帧和P帧的基础上再进行预测,它不仅参考前面的帧,还参考后面的帧,相比P帧,更大大的节省了空间。

h.264的成功导致开发组开始尝试新的编码优化,h.265就是所产生下一代编码格式,整体架构在h.264编码上优化,主要也包括 帧内压缩和帧间压缩 以及 转换,量化,去区块滤波器等。

比起h.264,h.265 提供了更多的选择来降低码率,h.264中每个宏块都是固定的 16*16,而h.265可以选择从最小8*8到64*64。同时h.265帧间压缩模式提供了33种方向(h.264只支持8种),提供了更好的运动补偿和矢量预测方法。

总之,种种优化和提升带来了在相同图像质量下 h.265较比h.264大约42%的提升。

换言之,在相同的视频空间大小下,h.265质量要更为清晰,体验更好。

除了h.265,还有Google所推的webM/vp9格式,其输出上和h.264相当。

 

延展阅读:

WebM vs. H.264: A First Look

Programmer’s Guide to Video Systems

献给好奇心旺盛者的找资源教程(MAD教程第0期)

https://images.guide/

JPEG-Wikipedia