在770版本开发的过程中,有幸与内容组同事一起准备一些新版本上线需要的视频素材,因为需求需要用到透明背景的视频,所以花费了一些时间研究了一些视频相关的知识,这还要从带透明背景的mov压缩转换成mp4之后背景变成了黑色说起…

视频呢就是我们最近H2上线的7.7.0版本「老师陪你」tab默认的引导视频,视频中王老师需要出现在真实的APP界面上方,所以就需要视频只把老师身体部分抠出来,其余部分都需要有透明效果,漏出下方的界面元素。视频组输出的视频效果很棒,在客户端调试看起来也很不错,但是致命的问题就是这个mov格式的视频比较大,需要几十兆的空间,这不管是打包还是远程下载对APP来说都是不现实的,毕竟它只是一个引导视频而已。

所以就要压缩这个视频,得到一个小的版本,很快一个800KB大小的视频就输出了,这个压缩真的很赞,1MB都不到,正在我默默窃喜的时候,技术说这个视频为啥背景是黑色的,然后就开始了一段痛苦的压缩视频之路。因为mov格式用到的视频编码是PNG无损,大家知道,因为PNG格式有透明通道,所以能保留透明信息,但是转换到MP4的H.264压缩编码之后,透明通道就被抛弃了,因为这个编码并不支持透明通道,所以看起来就是黑色的。同样因为H.264是一种有损压缩编码,所以能以极高的压缩比保存视频,使得文件看起来非常小,但是画质也能达到要求。

所以这里就得说说视频压缩的原理了。这之前需要先解释几个概念:
码率(Data Rate):指视频文件在单位时间内使用的数据流量,也叫码流、取样率、码流率,通俗一点的理解就是,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb_s或者Mb_s(这里的b是bit位的意思,而通常我们用的文件大小中的B,是指的byte,1byte=8bit)。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。所以,码流越大,文件体积也越大,其计算公式是文件体积=时间X码率/8。例如,一部90分钟1Mbps码流的720P RMVB格式电影,其体积就=5400秒×1Mb/8=675MB。

帧率(Frame rate):用于测量显示 帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,简称:FPS)或“赫兹”(Hz),这个大家应该就比较熟悉了,例如我们常用的电脑显示器刷新率就是60Hz,而新款iPad pro貌似刷新率达到的120Hz,这就能使得画面看起来非常流畅。但是人眼由于视觉暂留效应,只能感受到24FPS的画面,所以如果某个视频帧率低于24FPS,我们则会很明显发现画面卡顿,反之帧率越高,我们看到的视频就越流畅。说到这里大家应该能明白那些慢动作视频的原理了吧,当原始视频帧率大于24的时候,我们实际上可以将每24帧作为一秒,那么多出来的帧就可以放到下一秒,那么累积下来视频总时长就变长了。我们可以看下自己手机设置中拍摄视频的参数,以iPhone X为例,默认支持4k60fps的视频拍摄,所以选择60fps拍摄之后我们能够后期处理时将视频放慢2.5倍而不损失画面流畅度。

刚才说到4k60fps,那么这个4K其实就是指的分辨率:显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。比如常说的1080P,就是1920X1080的分辨率,在视频长边有1920个像素,短边有1080个像素,每帧就有2073600个像素,那么4k分辨率就是每帧有7680X4320=33177600个像素,看着分辨率差了4倍,实际像素数量早已不在一个数量级。

在理解了分辨率和帧率加上码率之后,想必大家都明白最重要的其实还是码率这个参数,它直接决定了视频的画质和最终的文件大小。打开iPhone相机设置,可以看到有一段文字描述:

我们来看看这个1分钟40MB的730p 30fps的视频码率是多少吧,40/60*8=5.33Mb,这个码率相对来说还是很清晰了。搞懂了这个概念,其实我们就明白码率才是视频清晰度和大小的关键因素,它代表了信息量。所以如果码率相同,其实一个720p视频和1080p视频在观感上其实没有什么区别。

了解了这个基础概念,我们就知道压缩视频实际上重要的是压缩码率,同时将分辨率和fps都调整到可接受的最小程度,那么这个视频一定会是最小的。但是说到压缩,就要提到格式和编码这两个概念了,因为他们决定了一个视频的可压缩程度和可以支持的特性。通常一个格式是指代一种视频标准,而编码则代表了视频内容的存储方式,所以相同格式可以使用不同的编码,相同编码也可以使用不同格式来支持更多封装的特性。例如H.264编码可以在MP4格式和MKV格式中使用,如果使用了MKV格式,那么可以携带字幕文件,而MP4就做不到。

这个东西就比较深奥了,我现在也没有完全了解这里面的玄机,因为每个编码都有其独特的算法和压缩特性,例如现在最常见的H.264编码

H.264/MPEG-4 AVC作为MPEG-4标准的扩展(MPEG-4 Part 10),充分利用了现有MPEG-4标准中的各个环节。H.264/MPEG-4 AVC就在现有MPEG-4 Advanced Simple Profile的基础之上进行发展的。它即保留了以往压缩技术的优点和精华又具有其他压缩技术无法比拟的许多优点。

H.264的技术特点:

H.264 使图像压缩技术上升到了一个更高的阶段,能够在较低带宽上提供高质量的图像传输,该优点非常适合国内运营商用户量大、接入网/骨干网带宽相对有限的状况。 在同等的画质下,H.264 比上一代编码标准MPEG2 平均节约64%的传输码流,而比MPEG4 ASP 要平均节约39%的传输码流。全球很多IPTV业务运营商都将H.264 作为编解码格式的标准,包括比利时电信,荷兰KPN,泰国ADC 电信,中国电信等等。

根据中国电信上海研究院的实际测试结果表明:国内普遍采用的MPEG-4 编码技术在3Mbps 的带宽下尚达不到标清的图像质量,而H.264 编码技术可以在2M 带宽下提供要求的图像效果。因而运营商希望引入更先进的H.264 编码技术,在有限的带宽资源下进一步提高图像质量。其主要的特点是:

1.更高的编码效率:同H.263等标准的特率效率相比,能够平均节省大于50%的码率。

2.高质量的视频画面:H.264能够在低码率情况下提供高质量的视频图像,在较低带宽上提供高质量的图像传输是H.264的应用亮点。和MPEG2和 MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。显然,H.264压缩技术的采 用将大大节省用户的下载时间和数据流量收费。

3.提高网络适应能力:H.264可以工作在实时通信应用(如视频会议)低延时模式下,也可以工作在没有延时的视频存储或视频流服务器中。

4.采用混合编码结构:同H.263相同,H.264也使用采用DCT变换编码加DPCM的差分编码的混合编码结构,还增加了如多模式运动估计、帧内预测、多帧预测、基于内容的变长编码、4x4二维整数变换等新的编码方式,提高了编码效率。

5.H.264的编码选项较少:在H.263中编码时往往需要设置相当多选项,增加了编码的难度,而H.264做到了力求简洁的“回归基本”,降低了编码时复杂度。

6.H.264可以应用在不同场合:H.264可以根据不同的环境使用不同的传输和播放速率,并且提供了丰富的错误处理工具,可以很好的控制或消除丢包和误码。

7.错误恢复功能:H.264提供了解决网络传输包丢失的问题的工具,适用于在高误码率传输的无线网络中传输视频数据。

8.较高的复杂度:264性能的改进是以增加复杂性为代价而获得的。据估计,H.264编码的计算复杂度大约相当于H.263的3倍,解码复杂度大约相当于H.263的2倍。

技术上,它集中了以往标准的优点,并吸收了标准制定中积累的经验。与H.263v2(H.263+) 或MPEG-4简单类(Simple Profile)相比,H.264在使用与上述编码方法类似的最佳编码器时,在大多数码率下最多可节省50%的码率。H.264在所有码率下都能持续提供 较高的视频质量。H.264能工作在低延时模式以适应实时通信的应用(如视频会议),同时又能很好地工作在没有延时限制的应用,如视频存储和以服务器为基 础的视频流式应用。H.264提供包传输网中处理包丢失所需的工具,以及在易误码的无线网中处理比特误码的工具。

在系统层面上,H.264提出了一个新的概念,在视频编码层(Video Coding Layer, VCL)和网络提取层(Network Abstraction Layer, NAL)之间进行概念性分割,前者是视频内容的核心压缩内容之表述,后者是通过特定类型网络进行递送的表述,这样的结构便于信息的封装和对信息进行更好的 优先级控制。

看起来眼花缭乱,比如曾经在Windows上非常常见的WMV格式,其使用的就是微软推出的VC-1编码,有着很好的压缩特性和但是编解码计算要比H.264要小,可以说是一种很均衡的编码,但是现在应用的并不广泛。还有国际标准的MPEG-4编码,mp4格式就是由此而来的。但是这些能成为国际标准的编码可都不是那么简单的,它们都需要收费的。而Google推出的webM格式和VP8编码则是要以免费开源和已经广泛使用的H.264编码对抗。

WebM是一个由Google资助的项目,目标是构建一个开放的、免版权使用费的视频文件格式。该视频文件格式应能提供高质量的视频压缩以配合 HTML 5使用。WebM项目是一个使用BSD许可证的开源项目,它采用了On2 Technologies开发的VP8视频编解码器和Xiph.Org基金会开发的Vorbis音频编解码器(一种开源且无专利限制的音频压缩格式),其 使用的封装格式则以Matroska(MKV)开源格式为基础。

虽然VP8编码和H.264编码相比没有技术上的优势,但是免费开源,而且我发现它还支持H.264不支持的透明通道,这就使得透明视频能获得较高的压缩比成为可能。

虽然最后因为技术原因无法在客户端支持webM格式的视频而告终,但是这个过程不失为一个不错的尝试和学习。

WebM标准的网络视频更加偏向于开源并且是基于HTML5标准的。最为可怕的是WebM标准受到了包括 Opera,Mozilla,adobe等软件巨头和AMD,ARM,NVIDIA,Qualcomm在内硬件巨头的支持,在未来潜力巨大。而且google自己的YouTube目前80%的视频支持全新的WebM标准。