视频格式
本文大部分参考以及直接引用
http://vcb-s.com/archives/2726
https://help.aliyun.com/document_detail/99380.html
视频的基础参数
分辨率
视频是由连续的图像构成的。每一张图像,我们称为一 帧(frame) 。图像则是由像素(pixel)构成的。一张图像有多少像素,称为这个图像的 分辨率。比如说1920×1080的图像,说明它是由横纵1920×1080个像素点构成。视频的分辨率就是每一帧图像的分辨率。
帧率
一个视频,每一秒由多少图像构成,称为这个视频的 帧率(frame-rate) 。常见的帧率有24000/1001=23.976, 30000/1001=29.970, 60000/1001=59.940, 25.000, 50.000等等。这个数字是一秒钟内闪过的图像的数量。比如23.976,就是1001秒内,有24000张图像。视频的帧率是可以是恒定的(cfr, Const Frame-Rate),也可以是变化的(vfr, Variable Frame-Rate)
码率
码率 的定义是视频文件体积除以时间。单位一般是Kbps(Kbit/s)或者Mbps(Mbit/s)。注意1B(Byte)=8b(bit)。所以一个24分钟,900MB的视频:
体积:900MB = 900MByte = 7200Mbit
时间:24min = 1440s
码率:7200/1440 = 5000 Kbps = 5Mbps
当视频文件的时间基本相同的时候(比如现在一集番大概是24分钟),码率和体积基本上是等价的,都是用来描述视频大小的参数。长度分辨率都相同的文件,体积不同,实际上就是码率不同。
码率也可以解读为单位时间内,用来记录视频的数据总量。码率越高的视频,意味着用来记录视频的数据量越多,潜在的解读就是视频可以拥有更好的质量。(注意,仅仅是潜在,后文我们会分析为什么高码率不一定等于高画质)
码率控制方法
码率控制是指视频编码中决定输出码率的过程,常用的码率控制方法有:
VBR(Variable Bitrate)
动态比特率,也就是没有固定的比特率,音视频压缩软件在压缩时根据音视频数据的复杂程度即时确定使用什么比特率,这是以质量为前提兼顾文件大小的方式。
相对于CBR来说
适用场景:VBR适用于那些对带宽和编码速度不太限制,但是对质量有很高要求的场景。特别是在运动的复杂场景下也可以保持比较高的清晰度且输出质量比较稳定,适合对延时不敏感的点播,录播或者存储系统。
特点:
- 码率不稳定,质量基本稳定且非常高;
- 编码速度一般比较慢,点播、下载和存储系统可以优先使用,不适合低延时、直播系统;
- 这种模型完全不考虑输出的视频带宽,为了质量,需要多少码率就占用多少,也不太考虑编码速度;
CQP(Constant QP)
应该算编码器实现VBR的方式
固定QP,最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的,既不是码率优先模型也不是质量优先模型,不过是实现最简单的模型;
适用场景:一般不建议使用这种方式,因为这种方式不考虑编码内容的复杂性,用相同的压缩比处理每一帧。出来的视频质量和码率都不固定。个人觉得只有那种非常简单的场景,比如静止不变的场景运动量很小的场景可以尝试用,一遇到复杂场景,码率波动就非常大。或者在算法研究或者验证可以使用。
特点:
- 瞬时码率会随场景复杂度波动;
- 编码速度快,调控最简单,每帧的QP值相同;
CRF(Constant Rate Factor)
应该算编码器实现VBR的方式
恒定码率系数。把某一个”视觉质量”作为输出目标。通过降低那些耗费码率但是又难以用肉眼察觉的帧(高速运动或者纹理丰富)的质量提升那些静态帧的码率来达到此目的。
特点:帧间QP变化,帧内宏块的QP变化,输出码率未知,各帧输出的视觉质量基本恒定,这种方式相当于固定质量模式+限制码率峰值的方式。
适用场景:适用于对视频质量有一定要求的场合,CRF值可以简单理解为对视频质量期望的一个输出固定值,希望无论是在运动复杂场景下还是在静止简单情况下,都希望有一个稳定的主观视频质量可以选择该模式,该模式是视频质量优先模型。视频质量可以简单理解为视频的清晰度,像素的细腻程度和视频的流畅度。
特点:
- 与恒定QP类似,但追求主观感知到的质量恒定,瞬时码率也会随场景复杂度波动,视频帧之间或者内部宏块之间的QP值都不一样;
- 对于快速运动或细节丰富的场景会适当增大量化失真(因为人眼不敏感),反之对于静止或平坦区域则减少量化失真;
CBR(Constant Bitrate)
固定比特率,指文件从头到尾都是一种位速率。相对于VBR和ABR来讲,它压缩出来的文件体积很大,而且视频质量相对于VBR和ABR不会有明显的提高。
特点:
- 码率稳定,但是质量不稳定,带宽有效利用率不高,特别当该值设置不合理,在复杂运动场景下,画面非常模糊,非常影响观看体验;
- 但是输出视频码率基本稳定,便于计算视频体积大小;
ABR(Average Bitrate)
平均比特率,是VBR的一种插值参数。LAME针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。ABR在指定的文件大小内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量,可以做为VBR和CBR的一种折衷选择。
ABR在一定的时间范围内达到设定的码率,但是局部码率峰值可以超过设定的码率,平均码率恒定。ABR是VBR的改良版,能确保输出平均码率在合理范围,且在这个范围内,还是动态根据复杂度编码,
适用场景:ABR在直播和低延时系统用的比较多
特点:
- 视频质量整体可控,同时兼顾了视频码率和速度,是一个折中方案,实际用的比较多;
- 使用过程一般要让调用方设置,最低码率、最高码率和平均码率,这些值要尽可能设置合理点;
图像的表示方法
RGB模型
光的三原色是红(Red)、绿(Green)、蓝(Blue)。现代的显示器技术就是通过组合不同强度的三原色,来达成任何一种可见光的颜色。图像储存中,通过记录每个像素红绿蓝强度,来记录图像的方法,称为RGB模型 (RGB Model)
常见的图片格式中,PNG和BMP这两种就是基于RGB模型的。
比如说原图:
分别只显示R G B通道的强度,效果如下:
三个通道下,信息量和细节程度不一定是均匀分布的。比如说可以注意南小鸟脸上的红晕,在3个平面上的区分程度就不同——红色平面下几乎无从区分,造成区别的主要是绿色和蓝色的平面。外围白色的脸颊,三色都近乎饱和;但是红晕部分,只有红色饱和,绿色和蓝色不饱和。这是造成红色凸显的原因。
YUV模型
除了RGB模型,还有一种广泛采用的模型,称为YUV模型,又被称为亮度-色度模型(Luma-Chroma)。它是通过数学转换,将RGB三个通道,转换为一个代表亮度的通道(Y,又称为Luma),和两个代表色度的通道(UV,并成为Chroma)。
YUV模型干的是类似的事儿。通过对RGB数据的合理转换,得到另一种表示方式。YUV模型下,还有不同的实现方式。举个用的比较多的YCbCr模型:它把RGB转换成一个亮度(Y),和 蓝色色度(Cb) 以及 红色色度(Cr)。转换背后复杂的公式大家不需要了解,只需要看看效果:
只有亮度通道:
只有蓝色色度:
只有红色色度:
在图像视频的加工与储存中,YUV格式一般更受欢迎,理由如下:
人眼对亮度的敏感度远高于色度,因此人眼看到的有效信息主要来自于亮度。YUV模型可以将绝大多数的有效信息分配到Y通道。UV通道相对记录的信息少的多。相对于RGB模型较为平均的分配,YUV模型将多数有效信息集中在Y通道,不但减少了冗余信息量,还为压缩提供了便利
保持了对黑白显示设备的向下兼容
图像编辑中,调节亮度和颜色饱和度,在YUV模型下更方便。
几乎所有的视频格式,以及广泛使用的JPEG图像格式,都是基于YCbCr模型的。播放的时候,播放器需要将YCbCr的信息,通过计算,转换为RGB。这个步骤称为渲染(Rendering)
每个通道的记录,通常是用整数来表示。比如RGB24,就是RGB各8个bit,用0~255 (8bit的二进制数范围)来表示某个颜色的强弱。YUV模型也不例外,也是用整数来表示每个通道的高低。
色深
色深(bit-depth),就是我们通常说的8bit和10bit,是指每个通道的精度。8bit就是每个通道用一个8bit整数(0~255)
代表,10bit就是用10bit整数(0~1023)
来显示。16bit则是0~65535
(注意,上文的表述是不严谨的,视频在编码的时候,并非一定能用到0~255
的所有范围,而是可能有所保留,只用到一部分,比如16~235
。这我们就不详细展开了)
你的显示器是8bit的,代表它能显示RGB每个通道0~255所有强度。但是视频的色深是YUV的色深,播放的时候,YUV需要通过计算转换到RGB。因此,10bit的高精度是间接的,它使得运算过程中精度增加,以让最后的颜色更细腻。
如何理解8bit显示器,播放10bit是有必要的呢:
一个圆的半径是12.33m, 求它的面积,保留两位小数。
半径的精度给定两位小数,结果也要求两位小数,那么圆周率精度需要给多高呢?也只要两位小数么?
取pi=3.14, 面积算出来是477.37平方米
取pi=3.1416,面积算出来是477.61平方米
取pi精度足够高,面积算出来是477.61平方米。所以取pi=3.1416是足够的,但是3.14就不够了。
换言之,即便最终输出的精度要求较低,也不意味着参与运算的数字,以及运算过程,可以保持较低的精度。在最终输出是8bit RGB的前提下,10bit YUV比起8bit YUV依旧具有精度优势的原因就在这里。事实上,8bit YUV转换后,覆盖的精度大概相当于8bit RGB的26%,而10bit转换后的精度大约可以覆盖97%——你想让你家8bit显示器发挥97%的细腻度么?看10bit吧。
8bit精度不足,主要表现在亮度较低的区域,容易形成色带
注意这图右边那一圈圈跟波浪一样的效果。这就是颜色精度不足的表现。
10bit的优势不只在于显示精度的提高,在提高视频压缩率,减少失真方面,相对8bit也有优势。这方面就不展开了。
帧、帧的类型V
电影是由多个“图片”连续播放组成的,每个“图片”被称为帧,电影单位时间内播放的帧的数目称为帧率,常见帧率数值有:23.97、24、29.97等等
相邻连续帧主要部分基本相同,画面中只有部分内容发生运动改变,因此可以对于相似帧只保存变换的内容,用于储存节约空间。
根据帧储存性质,可以分为3类:
I帧(Intracoded帧):此帧是一个独立的帧,它不使用其前后的帧中的任何信息。一般作为参考帧的基础架构,储存完整的帧信息,占用空间较大。
P帧(Predicted帧):P帧又称帧间预测编码帧,需要参考前面的I帧才能进行编码。表示的是当前帧画面与前一帧(前一帧可能是I帧也可能是P帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。与I帧相比,P帧通常占用更少的空间。
B帧(Bi-predictive帧):B帧又称双向预测编码帧,也就是B帧记录的是本帧与前后帧的差别。也就是说要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是对解码性能要求较高。
不同编码根据自己算法,对于一个视频进行压缩编码,不同的编码方式,对于不同帧处理方式不同,有着自己的标准。
GOP(关键帧间隔)
GOP(Group of Pictures)是一组以 MPEG 编码的影片或视讯串流内部的连续图像,以 I 帧开头,到下一个 I 帧结束。一个 GOP 包含如下图像类型:
I 帧(Intra Coded Picture):又称帧内编码帧,为关键帧,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,可以简单理解为一张静态画面。视频序列中的第一个帧始终都是I 帧,每个 GOP 由I 帧开始。
P 帧(Predictive Coded Picture):又称帧间预测编码帧,需要参考前面的I帧才能进行编码。表示的是当前帧画面与前一帧(前一帧可能是I帧也可能是P帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。与I帧相比,P帧通常占用更少的数据位,但不足是,由于P帧对前面的P和I参考帧有着复杂的依赖性,因此对传输错误非常敏感。
B 帧(Bidirectionally Predictive Coded Pictures):又称双向预测编码帧,也就是B帧记录的是本帧与前后帧的差别。也就是说要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是对解码性能要求较高。
GOP值表示关键帧的间隔(即两个关键帧之间的帧数),也就是两个IDR帧之间的距离,一个帧组的最大帧数。一般而言,每一秒视频至少需要使用 1 个关键帧。增加关键帧个数可改善视频质量,但会同时增加带宽和网络负载。GOP值(帧数)除以帧率即为时间间隔,如阿里云视频点播默认的GOP值为250帧,帧率为25fps,则时间间隔为10秒。
GOP值需要控制在合理范围,以平衡视频质量、文件大小(网络带宽)和seek效果(拖动、快进的响应速度)等:
加大GOP值有利于减小视频文件大小,但也不宜设置过大,太大则会导致GOP后部帧的画面失真,影响视频质量。
GOP值也是影响视频seek响应速度的关键因素,seek时播放器需要定位到离指定位置最近的前一个关键帧,如果GOP太大意味着距离指定位置可能越远(需要解码的预测帧就越多)、seek响应的时间(缓冲时间)也越长。
由于P、B帧的复杂度大于I帧,GOP值过大,过多的P、B帧会影响编码效率,使编码效率降低。
但如果设置过小的GOP值,则需要提高视频的输出码率,以确保画面质量不会降低,故会增加网络带宽。
IDR 帧对齐
IDR帧(Instantaneous Decoding Refresh Picture),即时解码刷新帧,是 I 帧的一种。与普通 I 帧的区别在于,一个 IDR 帧之后的所有帧都不能引用该 IDR 帧之前的帧的内容;相反,对于普通的 I 帧,其后的 P 帧和 B 帧可以引用该普通 I 帧之前的其他 I 帧。在编码和解码中为了方便,将首个I帧和其他I帧区别开,称为IDR,这样就方便控制编码和解码流程。
IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而普通I帧不具有随机访问的能力,这个功能是由IDR承担。视频播放时,播放器一般都支持随机seek(拖动)到指定位置,而播放器直接选择到指定位置附近的 IDR 帧进行播放最为便捷,因为可以明确知道该 IDR 帧之后的所有帧都不会引用其之前的其他 I 帧,从而避免较为复杂的反向解析。
在对同一个视频进行多码率转码时,如果指定 IDR 帧对齐(IDR Frame Alignment),则意味着所有输出视频的 IDR 帧在时间点、帧内容方面都保持精确同步,此时播放器便可实现多码率视频平滑切换,从而不会出现较为明显的切换卡顿。
色度半采样
在YUV模型的应用中,Y和UV的重要性是不等同的。图像视频的实际储存和传输中,通常将Y以全分辨率记录,UV以减半甚至1/4的分辨率记录。这个手段被称为色度半采样(Chroma Sub-Sampling)。色度半采样可以有效减少传输带宽,和加大UV平面的压缩率,但是不可避免的会损失UV平面的有效信息。
我们平常的视频,最常见的是420采样。配合YUV格式,常常被写作yuv420。这种采样是Y保留全部,UV只以(1/2) x (1/2)的分辨率记录。比如说1920×1080的视频,其实只有亮度平面是1920×1080。两个色度平面都只有960×540的分辨率。
当然了,你也可以选择不做缩减。这种称为444采样,或者yuv444。YUV三个平面全是满分辨率。
在做YUV->RGB的时候,首先需要将缩水的UV分辨率拉升到Y的分辨率(madVR中允许自定义算法,在Chroma Upscaling当中),然后再转换到RGB。做RGB->YUV的转换,也是先转换到444(YUV的分辨率相同),再将UV分辨率降低。
一般能拿到的片源,包括所有蓝光原盘,都是420采样的。所以成品一般也保留420采样。所以yuv420就表示这个视频是420采样的yuv格式。
将420做成444格式,需要自己手动将UV分辨率拉升2×2倍。在今天madVR等渲染器可以很好地拉升UV平面的情况下,这种做法无异于毫无必要的拉升DVD做成伪高清。
当然了,有时候也需要在444/RGB平面下做处理和修复,常见的比如视频本身RGB平面不重叠(比如摩卡少女樱),这种修复过程首先要将UV分辨率拉升,然后转RGB,做完修复再转回YUV。修复后的结果相当于全新构图,这种情况下保留444格式就是有理由,有必要的。
H264格式编码444格式,需要High 4:4:4 Predictive Profile(简称Hi444pp)。所以看到Hi444pp/yuv444 之类的标示,你就需要去找压制者的陈述,为什么他要做这么个拉升。如果找不到有效的理由,你应该默认作者是在瞎做。
清晰度与画质简述
经常看到的说法:“这个视频清晰度是1080p的”。其实看过上文你就应该知道,1080p只是视频的分辨率,它不能直接代表清晰度——比如说,我可以把一个480p的dvd视频拉升到1080p,那又怎样呢?它的清晰度难道就提高了么?
视频的画质,是由以下几点共同决定的
源的画质。
俗话说的好,上梁不正下梁歪。如果源的画质本身很差,那么再如何折腾都别指望画质好到哪去。所以压制者往往会选择更好的源进行压制——举个栗子,BDRip一般都比TVRip来的好,哪怕是720p。蓝光也分销售地区,一般日本销售的日版,画质上比美版、台版、港版啥的都来得好,所以同样是BDRip,选取更好的源,就能做到画质上优先一步。
播放条件。
观众是否用了足矣支持高画质播放的硬件和软件。这就是为啥我们在发布Rip的同时大力普及好的播放器;有时候一个好的播放器胜过多少在制作方面的精力投入。
码率投入vs编码复杂度。
视频的时间和空间复杂度,并称为编码复杂度。编码复杂度高的视频,往往细节多,动态高(比如《魔法少女小圆剧场版 叛逆的物语》),这样的视频天生需要较高的码率去维持一个优秀的观看效果。
相反,有些视频编码复杂度低(比如《请问今天要来点兔子么》,动态少,线条细节柔和),这种视频就是比较节省码率的。
码率分配的效率和合理度。
同样多的码率,能起到怎样好的效果,被称为效率。比如H264就比之前的RealVideo效率高;10bit比8bit效率高;编码器先进,参数设置的比较合理,编码器各种高端参数全开(通常以编码时间作为代价),码率效率就高。
合理度就是码率在时空分配方面合理与否,合理的分配,给观众的观看效果就比较统一协调。 码率分配的效率和合理度,是对制作者的要求,要求制作者对片源分析,参数设置有比较到位的理解。
码率分配和合理度做的好,就常常能做出低码率高画质的良心作品。
编码前的预处理。预处理分三种:
客观修复。强调修复片源固有的瑕疵,比如锯齿,色带,晕轮等等。
主观调整,强调将片源调整的更适合人眼观看,比如适度的锐化,调色(有时候你是可以通过科学方法判定片源的颜色有问题,然后针对的做修复的)。
移除无效高频信息,比如降噪,避免码率浪费在无效的噪点上
预处理做的好,往往能达到画质上超越片源,或是在几乎不牺牲清晰度的前提下,节省码率开销。
但是预处理是一把双刃剑,优化的同时,可能引入副效果。降噪、抗锯齿、去晕轮等操作会不可避免的损失一些有效细节(或多或少,取决于制作者水准);主观调整很可能 会引入副效果(比如过度锐化会导致锯齿和晕轮),或是变成了作者的自我满足,形成对观众的欺骗。
综上,一个优秀的画质,是由片源、制作者、观看者共同决定的;码率高低也只是部分因素,并非决定性的效果。