现在大家看在线视频动辄1080P甚至4K,一个两小时的高清电影如果不压缩,得有几百个G,根本没法传输和存储。视频压缩技术就是干这个的——在尽量不损失画质的前提下,把视频文件的体积缩小,让我们能顺畅地在线看剧。
视频为什么能压缩?其实就是利用了视频里的冗余信息。第一是空间冗余,同一帧画面里相邻像素的颜色和亮度差不多,比如天空那一大片蓝色,不用每个像素都存一遍。第二是时间冗余,相邻两帧画面大部分内容是一样的,比如人物说话时背景没变,只有嘴在动,那后面的帧可以直接参考前面的帧来重建。第三是视觉冗余,人眼对某些细节不敏感,把这些信息去掉肉眼也看不出来。
H.264(也叫AVC)是目前最通用的视频编码标准,几乎所有设备都支持。它把视频分成I帧、P帧、B帧三种。I帧是关键帧,是一帧完整的图像,不依赖其他帧;P帧是前向预测帧,参考前面的帧来解码;B帧是双向预测帧,同时参考前面和后面的帧,压缩率最高。一部视频里I帧很少,大部分是P和B帧,这样体积就下来了。
H.265(HEVC)是H.264的升级版,同样画质下体积可以减少30%到50%。它的改进主要在这几个地方:块的划分更灵活(从H.264最大的16x16提升到64x64),运动预测更精准,支持更大的分辨率(8K也能搞定)。现在的新手机、智能电视基本都硬解H.265,4K蓝光和在线视频用的也越来越多。
AV1是新一代开源编码,由谷歌、微软、苹果这些公司联合推动,最大的好处是免专利费,不会像H.265那样被专利费卡住。压缩率方面AV1比H.265还要再强一点,同样画质还能再小20%左右。不过AV1的编码速度目前还比较慢,硬件解码支持也在逐步普及,是未来几年的方向。
实际做视频编码的时候,码率控制、GOP长度、参考帧数这些参数也很关键。码率太低会糊成马赛克,太高又浪费带宽。做直播的话一般用CBR(固定码率)保证流畅,做视频点播的话用VBR(可变码率)更省体积。很多视频平台都会根据用户的网络情况自动切换清晰度,背后就是多档码率的编码文件在支撑。