分享

【ACFUN UP专修学院福利】视频编码压制基础

 金刚光 2019-09-25

写在前面

我看上的就是我的

本文面向的读者是 想提高自己上传视频质量的up主、视频搬运工、收藏爱好者、以及单纯想提高一下对于“视频”这一领域的姿势水平的同学们。

我在b站虽然只当了半年多up主,但其实很久以前就开始做视频了(虽然剪辑技术仍然渣渣),所以对于视频的基本性质和视频的编码压制都有一些知识基础。最近突然看到b站宣发中心出了一篇题为“如何避免二压!小丸篇”的教程,我出于兴趣就点进去看了看。看完了发现:这。。。小白怎么可能看得懂啊!能看懂那篇教程的人基本也不太用看那篇教程了。。。看了那底下的评论,我也发现很多“想努力读懂那篇教程”的人其实连一些最基础的知识都不清楚,这样当然不可能懂这种进阶教程啦。在不懂基础知识的情况下照搬那篇教程的参数,我只能说是百害而无一利。尽管如此还是给那篇教程点个赞,作者辛苦了,毕竟研究出那套参数也不容易。于是我便心血来潮给大家简单科普一下基础知识。请不要嫌弃我啰嗦,这一领域本来就需要琐碎的基础知识,想要真正弄懂,必须花时间、付出精力,不存在所谓的“小白速成”、“快速入门”。也请不要评论“看不懂”之类的,这个科普是真正的纯小白入门,只存在“不想看”,不存在“看不懂”。我不是专业人士,所以本文内容仅供参考,如有错误欢迎在评论区指出,不胜感激。

各位在b站上看了这么久视频,不知是否曾有过以下的疑问:

那些号称高画质视频的标题里面的“1080p 60帧”是什么意思?

为什么b站有的视频画质清晰、播放流畅,有的就是av画质?

我上传到b站的视频为何会变成渣画质?如何上传高清视频?

mp4/flv/mkv等等这些格式有什么区别?它们之间是否可区分孰优孰劣?

视频的画质是什么?视频画质由什么决定?

b站上传视频的“1800码率限制”的“码率”是什么意思?

上面说的什么“二压”、什么“参数”到底是什么鬼啦?

视频压制是什么?我到底为何要压制视频?自己直接传上去不是也挺好的吗?

以上问题我都懂,可是b站为何要限制1800码率啊?

以上问题我都懂,可是如何在1800码率的限制下压制出高质量的视频?

那些做MMD的up主到底用了什么黑科技压制出了画质那么好的视频?

如果你不曾有过以上问题(“我就是来b站找找乐子放松放松的、视频能看就行啦,管那么多乱七八糟的干啥”),或者对以上问题的答案丝毫没有兴趣,那么。。。你感谢你 居然看到了这里!走之前别忘了点一下推荐,谢谢!

如果你有过类似的问题,并且很想知道答案,那么恭喜你,你找对地方了,本文将会用通(luo)俗(suo)易懂的语言让你从一脸懵逼变成多脸懵逼一脸装逼。当然,上述问题的答案一言难尽,需要从最基础知识开始科普,毕竟你若想学高等数学,首先还是要知道1+1=2吧?你可能会问:“这些名词难道我不能自己百度吗?”。问的好!有这样的觉悟,说明你已经不再是伸手党了。当然,如果你自己能百度出来,自然也就不需要看我这篇科普。不过,有很多时候,你百度一个名词,会看见10个新的陌生名词,这10个新的名词会阻碍你对于想要知道的名词的理解,于是你又开始百度那10个陌生名词。。。所以,一下午过去了,不仅原来的名词的意思没查出来,倒是又多了一堆不懂的东西。不用担心,本文会从零开始给你打基础,从地基开始垒砖砌瓦,只要你有小学数学水平,初中英语水平,以及——最重要的——兴趣,那么你就一定可以看懂。基础打牢了之后,再去看其他教程就会轻松很多,就会明白为什么要那么设置参数,而不是照着别人的方法依葫芦画瓢;也就能分辨出来哪些教程是好教程,哪些教程是不懂装懂、误人子弟的教程了。

正文

本文不会牵扯到视频剪辑技巧,因为视频剪辑依赖软件,不同软件各有利弊,而万变不离其宗的是关于视频的最最基础的知识,无论你用什么剪辑软件,都不可避免地要涉及这些基础知识,并且了解这些基础知识对于你的视频剪辑(尤其是第一步“选择视频模板”和最后一步“输出视频”)、P图、以及纯音频制作都是极其有帮助的。我相信看到这里的朋友已经明白自己为什么要看,并且拿好小本子准备记笔记了。那么废话到此为止,准备上干货。

首先,产生以上种种问题的根本原因,就是因为我们并非在现实世界中用眼睛去看、用耳朵去听,而是在借助电脑这一工具。当然,电脑不可能把一张张的图片印在硬盘里,电脑储存信息的方法是将一切转化为数据,储存在硬盘中。你在电脑上显示器上看到的图片,本质上都是储存在硬盘里的一串串数字,只不过在你想查看它们的时候电脑帮你把这一堆数字解读出来并转化为显示器上的光而已。而电脑储存数据的空间(容量)又是有限的。所以,如何利用有限的空间来储存更多的信息,便是一个很重要的课题。此外,对于图像和声音信息的储存,电脑是无法100%还原现实世界的,这个很好理解,因为现实中的景物、声波都是有无限细节的,你离某个景物越近,看到的细节越多;而电子设备在对其进行记录时当然不可能很精确,你放大电脑中的任何一张照片时,到最后都会看到一个个像素块。在介绍电脑具体如何储存图像、音频数据之前,我们先来复习一下电脑储存数据的最最最最基本的知识:

电脑储存数据的最小单位:比特(bit),又称“”,简称b(小写字母b)。每个比特储存的数据为1或者0

稍大一点的单位:字节(Byte),简称B(大写字母B)。1 Byte = 8 bit。(1字节=8比特)

(数据量这一概念,我有时会称它为“空间”,有时叫它“体积”、“大小”之类的。在这里先消一下歧义。)

例:

假设我要储存一个数字,并且我确定这个数字是0到31之间的其中一个整数,那么我可以预备5bit的空间来储存这个数。比如1可以被储存为00001;而2可以被储存为00010;30可以被储存为11110等等,每个数字我都有一种记录方法与之对应,来者不拒。

电脑中以1个字节的长度(8bit)来储存一个字符,共可以储存256种不同的字符。(拓展阅读:ASCII)

其他基本单位:

 = K

 = M = K的平方

 = G = K的立方

注意,K有时等于1000(此时M=1,000,000,G=1,000,000,000),有时等于1024(此时M=1024^2, G=1024^3)

比如,windows系统记录储存文件的大小时,K通常表示1024,且通常与Byte连用:

KB(千字节)=1024Byte, MB(兆字节)=1024KB, GB(吉字节)=1024MB,

记录流动数据的大小时,比如网速、视频流音频流的码率,K通常表示1000,且通常与bit连用:

Kb,kb(千比特)=1000bit, Mb,mb(兆比特)=1000k。平常说的1M网速,一般是指平均每秒传送1兆比特的数据,即1Mb每秒 = 1Mbps = 1000kb/s = 125KB/s

具体什么时候是1000,什么时候是1024,我也不确定,而且这也不重要,因为差得不多。方便起见,本文之后一律把K视为1000

选读:

为了消除1000和1024的歧义,很多软件在显示文件体积的时候会写KiB或MiB。当你看到Ki,Mi,Gi等字眼时,它们就是以1024为基础的了,比如1 MiB = 1024 KiB = 1024^2 B = 8*1024^2 bit。K,M,G一般不区分大小写。而B和b是一定要区分开来的,前者是Byte,后者是bit。

经常用电脑朋友都知道,硬盘的储存容量大概是几百到几千个GB,一个几分钟长的视频文件通常是几十到几千MB,一个几分钟长音频文件大概在10MB以内,一个图片大概几十KB到几千KB,一个储存文本的文件(比如txt,word,ppt之类)也是几十到几千KB。视频文件算是占用空间很大的文件了,有的高清视频动辄几十GB。所以,我们通常需要压缩视频(即压缩用来储存视频文件的数据)。视频的压缩技术及其复杂,可以写出好几本书,甚至可以花一辈子去学习。具体的压缩算法可以不了解,然而,视频的最基本的参数及常识还是要了解一些的。

首先,我们来简单了解一下视频文件的结构。

一个视频文件,比如“我的妹妹.avi”,它里面到底装的是什么?如果你说,视频文件里面装的是视频,那我只能说你的回答不确切。其实,一个视频文件里面装的是一条视频轨道(Video track),或称为视频流(Video stream),和一条音频轨道(Audio track),或称为音频流(Audio stream)。视频轨道储存的是一帧一帧(frame)的无声画面,音频轨道就是纯声音。纯视频流和纯音频流被混在一起装在了“我的妹妹.avi”里面,并储存在了你的电脑硬盘中,当你想观看此视频时,你的播放器便把里面的视频流和音频流拆分开来,前者送给显示器,让你看到画面,后者送给声音设备,让你听见声音,并且保证音画同步,这样才达到你看视频的效果。有的视频文件可能含有多条视频流、多条音频流,甚至还可能存在字幕轨道(Subtitle stream),还有章节(Chapter)信息,这样的视频文件不在本文讨论范围内,因为b站几乎所有视频都是仅含有1条视频流、1条音频流的。所以,要想理解一个视频文件,必须把他分成“视频”、“音频”两部分来分别探讨。

播放视频的流程

众所周知,视频是由一帧一帧的同等大小的静止画面 快速连续播放而成的,那么研究视频就不可避免地要研究静止图片(still image)

之前说过,电脑是把图片转化为数据储存在硬盘中的。把图片转化为数据的最原始最简单的方法,我相信大家都能想到,就是把一张图片分成好多个方形的小格子,每个格子储存一种颜色:一个图片是由若干个像素(Pixel)组成的,每个像素储存了一个颜色,并且只能储存一个纯色,电脑会用特定的数字来代表一种颜色,这样,就可以把一张图片储存起来了。当你查看这张图片是,电脑会把这若干个微小像素整齐紧密地排成一个方阵,就形成了你在电脑上看到的图片。图片的一个最重要的性质就是它的分辨率(resolution),又称解析度。分辨率记录了这个图片的宽(width)高(height),以像素为单位。比如以下这个图片,右键查看属性可以看到它的分辨率是200x400,则代表它的宽度为200像素(横向储存的像素数为200),高度为400像素(纵向储存的像素数为400),整个图片里面总共有80000个像素(总共储存的像素数为80000)。

一个图片文件的属性

注意,分辨率仅仅反映了一个图片的宽和高(以像素为单位),而不能等价于图片的清晰度!有很多人误以为分辨率越大,则越清晰,这是不准确的。举一个例子,假设我们现在有一个10x10的图片,我们要把它的分辨率增加为20x20,即用400个像素去储存之前100个像素储存的图片,这样做的后果等价于把之前的图片的每个像素(注意,像素是纯色)画个田字等分成4份,变成一个新的图片,很显然,这只是得到了一张跟原来的图片效果完全相同的新图片。

用不同的分辨率来储存用一张图片(假设最右边的为原图)

注:本文中的分辨率特指图片中储存的像素数量(横向像素数 x 纵向像素数),而与图片的实际在电脑上显示的宽(厘米)和高(厘米)无关。一张储存在电脑中的图片的分辨率是固定的,它在显示器上被显示出来时,可以任意放大缩小,但是这张图片本身所含有的数据量(总像素数)是不变的。希望大家不要把“分辨率”这一概念与其他领域对“分辨率”的解读弄混(尤其不要与PhotoShop中的“分辨率”混淆)。

图片在显示时的清晰度不仅跟其分辨率有关,也跟你显示器的分辨率有关。电脑屏幕也是由一个一个像素点构成的,且每个像素只能发出一种颜色的光。比如,你的显示器分辨率是1920x1080,即你的显示器宽度为1920像素,高度为1080像素。图片的分辨率仅仅代表了电脑储存这个图片的精度,而放到显示器上显示出来,就是另一回事了。一个100x100分辨率的图片,要在显示器上面多大的范围内显示出来比较合适呢?很自然可以想到,把它也用显示器的100x100像素的大小来显示,这样正好使得显示器上面的每一个像素刚好对应图片的一个像素,肯定是最清晰的。或者,用显示器上面200x200的部分来显示,使得显示器上面每4个像素显示图片中的一个像素,这样也是清晰的。那么,如果你用150x150的显示器范围来显示一张100x100像素的图片呢?可想而知,清晰度不一定比用100x100的显示器范围要高。所以,低分辨率的图片放大之后清晰度不一定增加。所以,对于一张储存在你硬盘中的图片(给定了分辨率),它的清晰度还取决于你如何用显示器来显示它。一般来讲,用与图片分辨率相同的显示器范围来查看图片,可以得到最佳的画质,这一点尤其对视频成立。

我们接着来说图片的储存。刚才说到,电脑要把每一个像素的颜色记录成一个数字。对于一个彩色图片,每一个像素可以分3个颜色来储存,即红(Red),绿(Green),蓝(Blue),因为所有颜色都可以由红绿蓝三种颜色按照不同的比例混合在一起而组成。对于每一个像素,我们可以用8bit来储存红色(共可储存256种红色),也用8bit来储存绿色、8bit来储存蓝色,比如纯黑色就是三种颜色都没有,那么就是红0绿0蓝0(R:00000000, G:00000000, B:00000000);纯白色就是三种颜色都有,而且都是最强,即红255绿255蓝255(R:11111111, G:11111111, B:11111111)。这样,我们就用24bit来储存每一个像素的颜色,这个24bit叫做“位深度(Bit Depth)”。显然,位深度越高,能储存的颜色种类越多,得到的图片的品质也就越接近现实世界。位深度为24的RGB图片,每一个像素可以储存大约1677万种颜色(2的24次方),这几乎就涵盖了人眼能够分辨出的所有颜色了,用24位位深度方式储存的RGB颜色就叫做真彩色。然而付出的代价就是,每一个像素都要用24bit,即3Byte的储存空间。大家可以试着算一下,一张1280x720分辨率的图片,用这种方法来储存,要用多少空间?(答案:3Byte*1280*720 = 2.76MB)是不是有点太大了?如果一个视频每秒钟要播放30张这样的图片,那么1分钟的视频要花掉多少空间?(2.76MB*30*60 = 5GB)一分钟的视频5GB,你受得了吗?那么你可能会想,我们也可以用12的位深度来储存,RGB每种颜色分4bit,这样虽然丧失了储存颜色的精度(只能储存4096种颜色了),但是节省了一半的空间。然而1.38MB对于一张图片也还是太大了点。所以,我们要想办法用更少的数据量来储存这张图片。显然,刚才说的基于像素的RGB记录方法是一个效率很低的储存方式。于是,便有了数据压缩/编码技术(稍后会详细介绍编码、解码)。

压缩(编码)其实就通过一些巧妙的手段,来更有效率地记录数据。 压缩(编码)分为有损压缩(有损编码)和无损压缩(无损编码)。注意,这里的“有损”和“无损”都是相对的。电脑无论以多高的精度去记录现实世界中的信息,都不可能做到100%还原。所以,将现实世界中的图像、声音记录到电脑中这一过程绝对就是有损的了。因此,我们的“有损”和“无损”肯定不是跟现实世界去比较。我们讨论的“有损”和“无损”仅仅是以电脑为参考标准的。对于图片来讲,我们通常把之前说过的用基于像素的RGB的方法储存的图片称为“原始数据”,或者称为“无损”的标准,bmp格式的图片(bitmbmp格式ap)就是用这种方式储存的,因此可以视为“无损的图片”。无损压缩,就是指能完全记录原始数据中的所有信息的压缩方法(用更少的数据量来记录),png便是一种,它可以把刚才说的1280x720的图片压缩至小于500KB(具体压缩到多少,取决于原图包含的信息量),并且是无损的,无损压缩出来的图片,可以完全还原“原始数据”,即用显示器显示出来后跟原来的无损图片的每一个像素的颜色都完全一样。此外png还支持透明。有损压缩,就是指丢弃掉原始数据中的一些无用信息,比如舍弃掉人眼不敏感的颜色突变等等,达到非常强大压缩率,jpeg算法便是一种有损压缩算法,它可以在基本不损失原图质量的情况下把刚才的1280x720的图片压缩到100KB以内。JPEG不支持透明。需要注意的是,我们并不应该过于执着于“无损”,因为有损压缩丢掉的信息是不重要的信息、是人眼几乎察觉不到的,这些信息就是冗余的信息,本身就该被扔掉,这样才能有效地利用空间。不信的话,我们可以对比一下:下面两张图,一张是1.5MB的无损png,另一张是把它压缩成200KB的.jpg图片,你能说出那个是无损,哪个是有损吗?

我是无损!

我才是无损!其实我猜咱俩都被b站压缩了

当然,有损压缩在压缩率设置得很高的时候,还是很明显能用肉眼看出来不同的,这就不用我举例了

拓展阅读:RGB色彩空间,YUV色彩空间。

注:有一些图片的储存方式不是像素,如有兴趣可自行搜索:矢量图。视频里面的帧都是基于像素的,故此类图片不在本文讨论范围之内。

我们之所以在图像、音频、视频上面大量使用有损压缩,就是因为我们并没有对“无损”的需求。但是,对于电脑中的其他数据,我们通常是不能舍弃任何部分的。一个非常出名的无损压缩法,zip压缩法(我相信所有人都见过),就可以无损压缩电脑中的任何数据(解压后完全还原原来的数据),而它的压缩率通常较低。(拓展阅读:Huffman coding)

那么我们来复习一下图片的基本参数:

分辨率:宽 x 高。(再次强调,宽和高的单位是像素,不是厘米,也不是dpi)

位深度:xx bit

编码方式:如jpeg

文件大小:多少多少KB

(多数情况下,你还会看到一个叫做“占用空间”的参数,它会比“文件大小”稍微大一点,请无视这个参数,以“文件大小”为准。)

下面一段话是重点:

有损压缩的“损”是在画质上的亏损。因为压缩的目的是减少数据量,因此就要把不重要的信息舍弃掉,把剩余的数据用来储存有用的信息。因此,压缩后剩余的数据量越少(即体积越小),所丢弃的信息就越多,损失的画质也就越多。对于同一张图片,压缩得越狠,即压缩后的图片体积越小,则压缩后的图片损失的画质越严重。换一种方法来理解:假设原图是无损的,每个像素被分到了24bit的数据量,我现在要求把这张图压缩到原来的十分之一,即平均每个像素被分到2.4bit的数据量,可以理解为,平均每个像素被分到的数据量越少,画质就损失得越厉害。对于视频而言,H.264可以做到在画质受损不严重的情况下,把平均每个像素分到的数据量压缩到接近0.01bit。

接下来就要到视频了。首先来简单认识一下视频的几个重要参数。

视频总时长(Duration):这个不用解释。

视频总大小(Size):即这个视频的体积(数据量)。

视频总大小 = 视频流数据量 + 音频流数据量 + 其他信息(包括容器、元数据等)

其中,视频流大小占视频总大小的约90%,音频流占约10%,其他信息占不到1%。显然,视频是大头。因此,压缩视频文件的效果主要取决于视频流的压缩效率。

分辨率(Resolution)帧宽度(Width) x 帧高度(Height)。这个与图片类似,都是储存的像素数量。需要注意的是,如果视频是拍摄现实中的景物,则分辨率越高,细节越到位,画质越好(不考虑视频体积)。但是,分辨率越高,就代表你要用更多的像素来储存一帧,也就是说要消耗更多的数据量,导致视频体积偏大。所以,当视频的体积、时长等其他参数一定时,分辨率越高,每个像素平均分到的数据量就越小,也就意味着画质越差。

扫描方式:逐行扫描(Progressive scanning,简称p) 或 隔行扫描(Interlaced scanning,简称i)

现在的网络视频均采用逐行扫描。隔行扫描是以前技术落后的时候用于广播电视的,具体细节在此不做介绍。总之,在视频制作过程中,要选择逐行扫描。

我们平常说的720p和1080p中,数字的意思是指帧高度,p是指逐行扫描,所以720p就是指帧高度为720的逐行扫描视频(不规定帧宽度);同理,1080i就是指帧高度为1080的隔行扫描视频。视频的分辨率的选择通常没有图片那样自由,因为多数情况下,视频都是要全屏观看的,因此视频的分辨率就要尽量贴合显示器的分辨率,更确切地说,视频的“画面比例/宽高比(Display Aspect Ratio)”要贴合显示器屏幕的宽高比。目前常用的宽高比为4:3,16:9(宽屏),21:9(超宽屏)。常用的分辨率有800x600,960x720(720p),1280x720(720p),1920x1080(1080p)。另外,你也可能听说过“2K分辨率”,“4K分辨率”这样的概念,一般来讲,2K是指视频的帧宽度为2048(不规定帧高度),4K也是指帧宽度为4096。有的时候,“1080p”并不一定代表该视频是逐行扫描的帧高度为1080像素的视频,而是会表示为一种画质级别,比如,我可以规定达到1280x720分辨率视频的画质级别为“高清”,规定达到(可以超过)1920x1080分辨率的视频的画质级别为“1080p”。我怎么规定完全看我的心情。不同视频网站对于画质级别的规定有可能不一样。我个人对“到底多少分辨率算是高清、多少算是超清”这方面没有特别的研究,也没有太大兴趣。因为在众多因素的限定下,高分辨率不一定对应高画质。

选读:

当视频的像素为正方形时,分辨率的宽高比(宽和高的单位:像素)就等同于视频的宽高比(宽和高的单位:实际长度)。然而,有些视频的像素不是正方形,而是长方形的,即像素的宽高比(宽和高的单位:实际长度)不是1:1,比如5:4(扁平像素)。

公式:视频宽高比 = 分辨率宽高比 × 像素宽高比

在不同标准下,它们的英文翻译有所不同,简称也就有一些差别:

AVC标准:

Display Aspect Ratio = Frame Aspect Ratio x Sample Aspect Ratio

DAR=FARxSAR

MPEG2标准:

Display Aspect Ratio = Storage Aspect Ratio x Pixel Aspect Ratio

DAR=SARxPAR

其中

Frame Aspect Ratio = Storage Aspect Ratio = 视频分辨率(单位:像素)

Sample Aspect Ratio = Pixel Aspect Ratio = 像素宽高比

b站用的是AVC标准,即把像素宽高比简称为SAR。以av26434为例,分辨率宽高比FAR=1024/720=64/45,像素宽高比SAR=5/4,计算可得视频宽高比DAR=16/9,即在你显示器中显示出来的宽高比。

制作视频的时候我们一般会选择方形像素,来避免这些繁琐的问题。

帧率/帧速率(Frame rate),单位:Frame per Second,(FPS)。即这个视频每秒钟播放多少帧图像,加入帧率为30fps,则说明这个视频每秒钟播放30帧图像。大家都知道视频是一帧一帧图像逐个播放而形成的,所以帧率越大,每秒钟播放的图像数量越多,视频看起来也就越流畅。电影、动画大多数为24fps,即每秒钟播放24帧图片。帧率小于24的话,就会给人不流畅的感觉。平常在b站上上传的视频,30fps就足够看了。有一些MMD、游戏视频为了流畅度把帧率设置成60,就算是非常高的帧率了。帧率与分辨率类似,都是用来增加视频细节的,对提升画质有帮助。同理,帧率过高,就会导致固定的时间内需要储存的图像数量增加,导致视频体积变大。因此在视频体积一定的情况下,帧率越高,分给每一帧的数据量就越少,视频画质自然也就越低。

选读:

有些视频的帧率是可变帧率(Variable Frame Rate,简称VFR)。与VFR相对应的概念,就是恒定帧率(Constant Frame Rate,简称CFR)。如果一个视频是30fps、恒定帧率,那么这个视频每一帧的播放时间都是恰好等于 1/30 秒。而可变帧率,就是允许不同的帧有不同的播放时长,这么做是为了节省空间。VFR多见于录屏视频。比如屏幕有0.1秒的时间都是黑屏,那么我完全可以用1帧来记录这0.1秒,但是之后屏幕开始有动态了,我就每帧记录0.02秒,诸如此类。VFR视频在导入Adobe Premiere时通常会音画不同步。这个以后有机会再展开讲。

视频码率(Bitrate),单位:Kbps(千比特每秒)或Mbps(兆比特每秒)

码率分为总码率(Overall bitrate)视频码率(Video bitrate)音频码率(Audio bitrate)

计算方法:总码率=视频总大小/视频总时长,视频码率=视频流大小/视频总时长,音频码率=音频流大小/视频总时长

由等式 “视频总大小 = 视频流数据量 + 音频流数据量 + 其他信息” 两边同时除以总时长可得:

总码率 ≈ 视频码率 + 音频码率 (因为其他信息占用的空间可以忽略不计)

所用视频:AV26434

注意,上面的“码率”是整个视频的平均码率。“码”即可理解为“数据”,视频码率是决定了视频流平均每秒被分到了多少数据量来储存信息,是决定视频视频画质的一个重要参数。码率是可以基于任何时段计算的,每1秒计算一次码率(1秒内所有帧储存的总数据量除以1s),也可以每10秒计算一次码率(10秒内所有帧储存的总数据量除以10s),甚至可以对于每一帧都计算一次码率(该帧内含有的数据量乘以帧率)。视频在有些时段可能动态比较剧烈,则需要更多的数据量(码率)来储存能维持一定的画质;在有些时段可能相对偏向于静态图片,则这些时段只需要很小的码率就可以维持一定的画质。假设一个视频在每个时间段的画质都稳定在一定的水准,那么这个视频在动态较多的时段肯定码率比较大,在动态较少的时段肯定码率比较小。如果一个视频在整个时间段的码率较为恒定,则这个视频动态较多的时段画质较差,动态较少的时段画质较好。视频的这些基本参数都是视频(储存在电脑中的数据)本身固有的,与视频的播放无关。下图为AV26434的视频流基于秒计算的动态码率:(所有柱的面积之和等于视频流的总大小,红线为视频流的平均码率)

动态码率(每秒钟计算一次)

我们知道,b站对于视频文件的视频流码率限制为1800kbps,音频流码率限制为192kbps。超过码率限制的视频,都要被b站再次压缩(也叫二压)。为何要限制视频的码率呢?原因在于,视频文件通常体积很大,在线播放视频的时候,你不可能一瞬间获取全部的视频信息,要一点一点地解码、缓冲。把视频比喻成一缸水的话,这一缸水不是直接全浇你身上,而是用水管输送水流一点点地给你。水管的宽度好比互联网的带宽,数据要以比特的形式一点点地传输给你。还记得之前我们计算的网速吗?如果你的网速是2Mbps,而你在线观看的视频的总码率为3Mbps,那么你的网速不足以将视频的数据及时地传输到本地,就会造成观看卡顿了。当然,b站只是限制了视频的平均码率。要知道,绝大多数视频的码率的动态变化是很明显的,就像上图一样。平均码率为2Mbps(2000kbps)的话,肯定有很多时段的码率是远超2000的,也有一些时段的码率是远小于2000的。而你的网速也是时刻在变化的。所以是否造成卡顿都是很难预测的。这便是b站限制码率的其中一个原因。另外一个原因,自然就是服务器负荷量的问题,b站不如youtube有钱,这方面也不用我多说。当然,在不远的将来,b站肯定会提升码率限制的。因为以我的经验来看,1800k的码率对于很多特效向的视频(如AMV、游戏、MMD等)是远远不够的。b站若想继续发展壮大、留住现有的up主、吸引新的up主,必定是要逐步提高码率限制的。

分辨率、帧率、码率便是视频文件的最基本参数,还有另外一些进阶参数(如色彩空间,关键帧距离等)我之后有机会再说。下面我想简单谈谈“画质”。画质这个概念是完全主观的,每个人对于同一个视频的感受不同。有的人偏向于流畅度,有的人可能觉得视频的色彩鲜艳、对比度强就是画质好,有的人可能更喜欢分辨率高、细节清晰的视频,不同人的偏好不同,不过,大同小异。如果一个视频是糊的,大家都能看出来。那么影响画质的因素有哪些呢?其实我之前已经举过好几个例子了。比如我们只讨论分辨率、帧率、码率对于画质的影响,那么可以通过逻辑推理得出以下结论:固定分辨率与帧率,则码率越高,画质越好;固定分辨率和码率,帧率越高,画质越差;固定帧率和码率,分辨率越高,画质越差。此外,我们也可以固定画质:固定画质和帧率,分辨率越高,码率越高;固定画质和分辨率,帧率越高,码率越高。简而言之,主要的矛盾就是在于画质与码率的矛盾:我们希望画质好、码率小,而这俩是一对矛盾。分辨率和帧率越高,画质和码率的矛盾越尖锐。我们在压制视频的过程中,就是通过对编码方式的选择和参数的设置来处理这一对矛盾。(其实,真正开始压制视频的时候,你会发现还有第三个因素:压制时间。压制时间、画质、码率这三者互为矛盾,是视频压制时需要处理的主要矛盾

下面,我们开始正式介绍“视频编码”。

编码(Encoding)

编码即把原始数据用某种特定方法转化为更简洁的数据储存起来。原始数据就像在我们大脑中的一些想法,编码就好比是把这些想法浓缩为一些文字。

解码(Decoding)

编码的逆过程,即解读被编码数据,还原原始数据。解码就好比把一些文字转化为大脑中的想法,即理解这些文字。

编码标准/编码格式(Video coding format, 有时也被误称为Codec)

由某些机构规定的特定编码方法,使得任何用此种方法编码的数据都可以被同一种解码方式还原,从而形成一套标准。编码标准好比语言,比如中文是一种编码标准,英文也是一种编码标准。中文和英文都可以表达同一种想法,并且所消耗的字符数不同,大多数情况下中文更简洁。所以可以理解为:中文大体上是一种比英文更高效的编码标准。

视频编码标准举例:

H.264,又称MPEG-4 Part 10, Advanced Video Coding(MPEG-4 AVC),又简称AVC:目前最流行的编码标准,以高效率著称。高效率即 相同画质下比用其他编码标准得到的视频体积更小,相同视频体积下比用其他编码标准得到的视频画质好。兼容性极好,被绝大多数网站应用,并可以被绝大多数视频编辑软件识别。它有多强大呢?如果以之前说的那个时长为1分钟的5G视频为“无损”的话,H.264可以在基本不损失画质的前提下,把那个视频压成几十MB甚至10MB以内的大小(具体大小取决于原视频的动态程度,以及你设置的编码参数)。

H.265,又称MPEG-H Part 2, Highly Efficient Video Coding,简称HEVC:比H.264还牛的一个新兴编码标准,号称可以比H.264提升一倍的压缩效率,是H.264的继承者,在不久的将来会取代H.264。

MPEG-4 Part 2, MPEG-4 Visual:看名字就知道是在H.264之前的编码标准了,现已网络视频基本不使用这种格式。(如有错误请纠正)

RealVideo:专门用来被rmvb格式支持的编码标准,几年前的人用的,现已过时。

VP8:Google搞的编码标准,与H.264竞争。

VP9:即VP8的升级版,与HEVC竞争,且稍逊于HEVC。

音频编码标准举例:

PCM/LPCM (Linear Pulse Code Modulation):音频的无损编码格式(在音频界的地位类似于bmp在图片界的地位),通常被视为音频的原始数据,为wav等容器常用的编码格式。

FLAC (Free Lossless Audio Codec):无损压缩编码(类似于png在图片界的地位,但是,并不如png那样常用)。单独作为音频文件时的拓展名也是.flac

AAC (Advanced Audio Coding):效率很高的有损编码,通常与H.264编码的视频作伴。单独作为音频文件时的拓展名为.aac或.m4a,其中m4a是用mp4容器封装的aac音频,是苹果公司的御用格式。

MP3 (MPEG-1 or MPEG-2 Audio Layer III):经典的音频编码标准,单独作为音频文件时拓展名为.mp3,虽在很多情况下稍逊于AAC的效率,但仍被广泛使用。另外,MP3的兼容性超强,几乎可以被所有播放器播放,甚至有的人以为音频文件就等同于MP3文件。

编解码器(编码器:Encoder,解码器:Decoder)(Codec,编解码器才是真正应该叫做codec的东西)

编码器:用来实现、落实某个编码标准的程序。一种编码标准可以对应多个编码器,这些编码器在落实这个编码标准上也有不同的效率。

解码器:用来解码的程序。

对于中文这种编码标准,每一个中国人都相当于一个编码器,因为我们有能力把一段话用中文写出来(实现编码标准),每人的语文水平不一样,表达同样一个意思所用的字数也就不一样(不同的编码效率)。每个中国人也都相当于一个解码器,可以理解把中文文字,转化为脑中的想法。

视频编码器举例:

x264:目前工公认最强大的H.264编码器(即以H.264为标准来编码的编码器)。而且它是开源、免费的。开源即公开源代码,可以给各路大神做简单的修改、完善。因此开源的项目一般发展都很快。诸多视频录制软件、视频编辑软件都在后台调用x264来编码,包括格式工厂,小丸工具箱等等。格式工厂转码H.264本质上并不是格式工厂的功劳,而是x264的功劳。小丸工具箱比格式工厂好用,并不是因为小丸工具箱本身有转码功能,而是因为小丸工具箱设置的x264参数比格式工厂设置的参数要好。

DivX:可用来编码MPEG-4 Part 2的编码器,现已基本被H.264编码器取缔。

Xvid:也是遵循MPEG-4 Part 2标准的编码器,在DivX收费之后横空出世,但也基本被H.264编码器取缔。我在这里提这两个货是因为它们貌似是格式工厂转mp4的默认设置,大家要认出它们并避开它们。我不太赞同格式工厂把MPEG-4 Part 2作为预设,明明这种编码标准在各个方面都落后于H.264。我在这里提到格式工厂是因为它实在是太有名了,各个网站都能看见有人在用它,我自己之前也用过,但是格式工厂在转格式方面的能力(以它的默认参数为准)我顶多给它个及格分。我相信看完我这一系列科普的朋友们也会选择比格式工厂更好的工具来处理视频。

x265:看名字就知道是HEVC(H.265)编码器,是x264的继承者,基本上算是HEVC的御用编码器,功能强大,期待它在将来的表现。开源,免费。

DivX265:也是遵循HEVC标准的编码器。不开源,免费。

音频编码器举例:

LAME:mp3编码器

QAAC:AAC编码器

NeroAAC:AAC编码器

转码(Transcoding,Re-encoding)

把用一种编码标准A编码的数据转化成用另一种编码标准B编码的数据 储存起来。转码需要两步,第一步是“解码”,即把以编码标准A编码的数据还原为原始数据,第二步是将原始数据用编码标准B的方式再编码。注意!转码的本质是转换编码标准,不是封装格式(见下面的介绍),也不是编码器!编码标准A和B可以是同一个编码标准。转码一定会导致画质损失(这个损失是不可逆的),只不过参数设置得当的时候 损失是肉眼不可见的。转码的目的可以是压缩数据,也可以是为了兼容而被迫转码。当以压缩为目的时,一般会选择转换为H.264(或HEVC,收藏用)编码,并且设置的参数是以减小视频体积为目标,所以输出的视频的体积一般会比原来小,当然,伴随着一定的画质损失。当以兼容为目的转码时,比如,一个编辑软件不支持rmvb的视频素材,只支持H.264视频,那么就要被迫把视频素材转码成H.264,以便接下来的编辑,这个转码过程设置的参数则是以尽量保留画质(让画质损失较少)为目标,得到的产物的体积也通常会比原素材的体积大。注意,画质仍然是会损失的。无论以什么目的转码,无论转码出的新视频的体积比原来大还是小,转码都会损失画质。所以,在视频制作的过程中,一定要尽力避免转码。转码次数越多,视频画质损失越大。整套视频制作流程,从素材一直到发布在网上给观众观看,这期间的转码次数要尽量控制在3次以内。网上有很多教程,说导出视频之后用这个这个软件的这个参数压缩,再用那个那个软件的那个参数压缩,就会得到什么什么减小体积的效果,都是扯淡,因为他们根本不知道他们在干什么(从他们设置的参数就可以看出)。能一次转码解决的事情,千万不要二次转码!我们平常所说的“压视频”,又称视频压制(compression),其实就是指以压缩为目的的转码。“压缩”仅仅是你的目的,而真正得出来的视频体积是否比转码前要小,就取决于你设置的参数了,也要取决于原视频是不是已经用了很高效率的编码方式来压缩了。新手不懂如何设置参数时,有可能得到与目的相悖的结果。

容器/封装格式(Container, Container format)

用来把以特定编码标准编码的视频流和音频流混在一起,成为一个文件。视频文件的总体积 = 视频流体积 + 音频流体积 + 其他文件信息所占用的体积(其中包括容器)。如果把编码好的视频和音频比喻成一堆散落地上的货物,那么容器就是用来把他们包装起来的箱子,封装格式决定了是用木箱子还是纸箱子还是塑料箱子。把单独的视频流和单独的音频流封装到成一个视频文件的过程叫做混流(Multiplex,简称mux)。把一个封装好的视频文件里面的视频流、音频流提取出来并分离的过程叫做解封装(Demux)。将一个视频文件由一种封装格式转化为另一种封装格式叫做封装转换(Remux)。注意,无论是mux, demux还是remux,都不会改变视频流和音频流的编码,所以,这三个过程是相当快的,也是无损的,因为视频质量完全取决于里面的视频流和音频流数据,而封装转换是不会动视频音频数据的,也就自然没有画质损失。就是相当于拆个箱子取货物,或者把箱子里货物的再重新装到另一个箱子,货物本身还是原来的货物。

封装格式体现在视频文件的拓展名,而不仅仅是文件拓展名。视频文件的拓展名为flv说明里面的视频和音频是以flv格式封装的(除非是有人闲的没事干把用其他格式封装的视频文件的拓展名改成了flv);视频文件的拓展名为mp4则说明是以mp4为封装格式封装的(除非有好事者乱改)。然而,改变视频文件的拓展名无法改变视频的封装格式。

这里简单介绍一下电脑储存文件的方式。任何一个储存在电脑中的文件,都包含“文件名(包含路径)”、“拓展名”、“文件内容”,其中文件名是帮助系统来识别这个文件的,拓展名则告诉系统应该用什么方式来打开这个文件,即用什么方法来读取“文件内容”。你可以试试把一个视频文件的拓展名改成.txt,这样做不会改变文件中储存的内容,改变的只是电脑读取内容的方式:本来电脑是把这个文件当成视频来读取的(只有这样读取才能正确得到文件内容里面的信息),然而你把他改成了txt,则系统会用读取文本的方式来读取这个文件的信息,你得到的就是一个全是乱码的文件了。而视频文件的“封装格式”是作为文件信息储存在“文件内容”里面的,所以你单单修改文件的拓展名是无法改变这个文件的封装的格式的。若想改变封装格式,需要借助软件,比如ffmpeg。

视频封装格式举例:

Audio Video Interleave,拓展名.avi:古老的封装格式,但是现在依旧被普遍使用,支持几乎所有的编码标准。但不支持网页播放。avi和av一点关系也没有。

MPEG-4 Part 14,拓展名.mp4:目前非常流行的封装格式,支持的视频编码标准有H.264,H.265,及一些其他的MPEG标准的编码格式,支持的音频编码标准有:HE-AAC、AAC、MP3等等。支持网页播放

Flash Video,拓展名flv:视频方面支持H.264等,音频支持MP3、(HE-)AAC等。支持网页播放。

Flash Video,拓展名f4v:视频仅支持H.264,音频仅支持MP3、(HE-)AAC。支持网页播放。

Matroska,拓展名.mkv, .mk3d, .mka, .mks, .webm:也是很流行的封装格式,支持几乎所有音视频编码标准。支持网页播放。

QuickTime,拓展名.mov, .qt:视频支持H.264等众多编码标准,其中Cinepak编码标准还支持透明(这是为数不多的支持透明的编码标准之一,然而使用了透明之后会导致压缩率极低,视频体积超大,并不推荐使用),音频支持MP3、(HE-)AAC等众多编码标准。支持网页播放。

RMVB,拓展名.rmvb:视频仅支持RealVideo,音频略。已过时。

其中,b站目前仅支持H.264视频 + AAC音频封装成的flv或mp4。

另外,很多封装格式可以只封装音频,比如ogg可以作为单独的音频文件,它可以支持多种编码标准的音频,ogg还可以作为视频封装格式。

mp4可以单独封装视频、也可以单独封装音频。m4a则是单独用来封装音频的,相当于mp4封装格式,m4a也支持多种音频编码。在此不详细展开了。

好了,看到现在这个地方,我相信你对视频的基本编码方式有了一定的了解。那么,以后如果有人跟你说类似于“flv格式的视频比mp4格式画质好”这样的无稽之谈,你就可以打他脸了。因为视频的质量跟封装格式无关,只跟里面装的视频流和音频流有关。既然flv和mp4都可以装H.264视频 + AAC音频,那么显然他们的质量在理论上是相同的。还要注意的是,不同的编码标准都有各自的编码参数可以设置,同一种编码标准下,参数设置得不同,压出来的视频品质也是大相径庭的。H.264虽然强大,但是如果你用一个很苛刻的参数让他强行压制视频,也是会压制出av画质的。所以,在说哪种编码方式比哪种编码方式好的时候,一定要控制某些因素,具体参照上文我介绍H.264时的措辞。

再次强调,单纯地改变封装格式是完全不用转码的!(不理解这句话的朋友请再仔细看看“转码”和“封装格式”的定义)举一个例子,假设一个视频剪辑软件(比如Premiere)只认H.264+AAC的mp4视频,此时你手里有一个刚从b站下载下来的flv视频。那么显然,这个视频是无法导入Premiere的,并且即使你把flv视频的拓展名改成mp4,也当然无济于事。这个时候,如果你去把这个flv视频扔给格式工厂转码,那么你就大错特错了。注意,这个flv里面封装的也是H.264+AAC,所以你需要做的仅仅是封装转换,即可把这个视频快速、无损地转化为mp4封装的H.264+AAC,从而可以导入Premiere进行剪辑。ffmpeg就可以做到封装转换,然而ffmpeg需要命令行操作,不是那么容易。没关系,小丸工具箱可以帮你。小丸工具箱的“封装转换”功能就是调用ffmpeg帮你转封装,不用你手动输入命令行。格式工厂弱智就弱智在它只会转码,不会转封装,明明一个封装转换可以解决的问题,它非要强行转码,速度慢,且损失画质,百害而无一例。

选读:

ffmpeg是一款非常强大的视频处理程序(基于命令行代码操作),它自己本身内置了大量的视频音频codec。绝大多数视频剪辑软件、视频播放器、视频转码器都会调用ffmpeg来完成工作。你现在就可以在你的硬盘里搜索“ffmpeg”,我有90%的把握你会搜到至少一个结果。

b站视频在手机里的缓存为分段的blv格式,其实blv的本质就是flv封装,直接改个拓展名就能直接观看了。如果想把这些分段的视频拼接成一个完整的视频,最快的方法就是用ffmpeg拼接(几乎等同于封装),速度快(大概10秒以内)、不转码(无画质损失)。具体如何做到,我就不展开讲了,感兴趣的人可以自己百度。千万不要用格式工厂或其他视频剪辑软件拼接。

注:有时候codec既会表示“编(解)码器”,也会表示“编码标准”。比如,有些视频软件会让你选择codec,列表中的选项为:Xvid(这是编码器),H.264(这是编码标准)。。。有些音频软件会让你选择codec,选项为:NeroAAC,QAAC,mp3,wav。。。也是编码器与编码标准混用。依我的个人经验,不同编码标准之间的差别 大于 用同一种编码标准的不同编码器之间的差别,所以大家在应用时只要理解到“编码标准”这一层就足够了。比如以上的NeroAAC和QAAC是两个用AAC标准来编码的编码器,可以视为“差别不大”,把它们俩一同视为AAC即可。

然而,有很多视频软件也会把编码标准、封装格式混为一谈。比如,它让你选择“输出格式”,给出的列表五花八门什么都有,以Premiere为例,它列出的“输出格式”包括:AAC(音频编码标准)、AVI(视频封装格式)、H.264(视频编码标准)、JPEG(图片编码标准及封装格式)、MP3(音频编码标准及封装格式)、MPEG4(可以理解为一系列MPEG4视频编码标准的统称)、QuickTime(视频封装格式)等等等等。厘清这些基本概念,掌握一些基本的编码标准和封装格式,对于导出视频有很大的帮助。你需要知道的是,导出视频的时候,视频剪辑软件关心的是编码标准,而非封装格式,只有告诉他编码标准了,他才能知道具体如何编码。所以,上面有一些选项虽然为封装格式,但其实它们对应的都是某种编码标准,所以它给你的这些选项本质上都是一个个的编码标准。以QuickTime(以下简称qt)为例,我们知道,qt是一种封装格式,它支持很多种编码标准。那么Premiere输出格式中的qt到底是指哪一种编码标准,这个你就可以自己探索出来了,只要你了解了本文的基本理论。

看到这里,就可以算是对“视频”这一领域略懂皮毛了。这次先写这么多吧,看看反响。如果大家喜欢的话,我会抽空再写下一期,详细讲一讲b站对于视频各种进阶参数的限制,以及如何避免二压,有机会也可以谈谈视频剪辑软件的模板选择、导出渲染设定、小丸工具箱的用法。最近没有时间更新视频,真是不好意思!

第一次写专栏,没想到一口气写了这么长。里面可能会有一些概念性错误,还望各位大佬不吝赐教。

参考资料:

[VCB-Studio 科普教程 3] 视频格式基础知识

https:///archives/2726

[总结]视音频编解码技术零基础学习方法

http://blog.csdn.net/leixiaohua1020/article/details/18893769

维基百科 Comparison of video container formats

https://en./wiki/Comparison_of_video_container_formats

这篇确实容易让人看不下去,很多概念我也没有讲得很透彻,的确是需要一点点基础知识才能看懂。看不懂正常,不想看更正常。虽然知道没多少人会看,但我还是做一些必要的补充解释吧,就当是对我自己写的东西负责任了:
1. 关于“信息”和“数据”:信息是抽象的,相当于你看到的图片,听到的声音,明白的道理,没有固定的存在方式,转瞬即逝。而“数据”是用来记录、储存信息的,是具体的,是电脑硬盘里面的一串1010101011,存储数据需要占用空间。同一个信息可以用不同的数据来记录,这些数据对信息的还原程度可能是不同的(是完完全全记录了信息,还是省略了信息中一些不重要的部分而只记录了重点)。在对信息还原程度相同的时候,这些数据的长度(即空间、体积、大小)可能是不同的,数据越简洁(长度越短)说明它记录信息的效率越高。“编码”的根本目的就是用尽量少的数据来记录尽量多的信息。另外,“原始数据”通常视为对“信息”的完美记录,也可以被视为“信息”。(当然,如果你想的话,也可以把数据本身当成信息,当然,当这串被你当成“信息”的数据本身已经很简洁的时候,你再用另一堆数据来记录它的话,也就基本没有什么简化的余地了。)
2. 文中说到“视频的这些基本参数都是视频(储存在电脑中的数据)本身固有的,与视频的播放无关”,意思是:电脑中的视频文件的本质是被储存起来的数据,而播放视频只是试图还原这些数据所表示的信息,而并不会对数据本身造成影响。当然,视频播放的效果的好坏很大部分取决于这些数据记录的内容。
3. 文中提到“改变封装格式不需要转码”,这个仅仅针对于两种不同的封装格式都支持某种同样的编码标准的情况,比如mp4和flv这两种封装格式都支持H.264视频和AAC音频,那么一个用mp4封装的H.264+AAC的视频文件自然就可以直接转换封装格式为flv,不用转码。而,比如有一种封装格式xxx不支持H.264视频,那么用H.264编码视频流的视频就自然不能直接转换封装成xxx格式,而要将视频转码成xxx格式支持的编码标准。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多