精準空降?不存在的!——視頻編碼的一些小知識

B站有一個傳統:空降報顏色(大家應該都懂)。但是有時候,直接點擊進度條,會發現進度向前跳了一點,不在點擊的位置。了解視頻編碼的有關知識,就能明白其中的道理。


最簡單的視頻格式

眾所周知,視頻是由很多幅畫面組成。這些畫面連續播放,利用視覺暫留現象,就能形成動態的圖像。視頻中每一幅畫面稱為「幀」

現在你就可以得到最簡單的視頻格式:把每一幀畫面依次儲存。

但是問題又來了:每一幀怎麼儲存?

比較簡單的方法是儲存點陣圖,就是把每一個像素的顏色值排列起來;複雜一點,可以對圖像進行壓縮,然後再合成一個視頻。

恭喜你,你發明了GIF的簡化版。GIF就是將壓縮後的圖像排列在一起構成的。


幀速率與音頻

現在,你有了GIF的簡化版,讓我來做一個播放器。我寫完了解壓縮部分,獲得了圖像的每一幀。

所以問題來了:每一幀圖像應該多長時間切換一次?

你:電影是每秒24幀,就按這個來吧。

我:如果要播放的視頻比較特殊呢?比如每秒要60幀的。

你:。。。

我:不如把每秒播放的幀數儲存在文件里,這樣就能根據不同的視頻以不同的速度播放了。

每秒播放的幀數稱為「幀速率」,用FPS表示。幀速率影響視頻播放的快慢,如果幀速率過低,也會出現卡頓現象。

於是,我做出了第一代播放器,可以播放包含幀速率信息的簡單視頻。不過這種視頻和GIF一樣,沒有聲音。

你:能不能做一個帶聲音的版本?

我:把聲音信息接在視頻信息後面就行了。

你:聽起來很Low的樣子。

我:。。。

現在通行的視頻格式,都是視頻、音頻分別儲存的。

當然,音頻也有很多儲存格式,比如不壓縮的PCM編碼(一般用WAV格式儲存)、有損壓縮的MP3(專利權剛剛過期,大家放心用吧),以及MP3的下一代AAC(MP4視頻常用的格式)。


高清時代

你用帶聲音的視頻格式,做了一段小視頻。很快,你就發現了問題。

你:這個視頻畫質怎麼這麼渣。

我:你錄的時候就沒弄高清的,怪我咯~

你:我這個視頻可是用好幾百萬像素的手機錄的呢。

我:你是不是有什麼地方設置錯了?解析度只有640×480,當然畫質差了。

你:解析度是啥?

在視頻領域,解析度一般指每幀畫面大小,用A×B表示,其中A是一行的像素數量,B是一列的像素數量。有些常用的解析度,比如640×480、1280×720、1920×1080,可以用640p、720p、1080p代替。(還有類似的640i、720i、1080i,區別會在以後講到。)其中,720p又稱高清,1080p又稱超清。

(來源:由Original uploader was XXV at en.wikipedia Later version(s) were uploaded by Jjalocha, Aihtdikh at en.wikipedia. - Transferred from en.wikipedia,CC BY-SA 3.0,File:https://commons.wikimedia.org/w/index.php?curid=4022444)

你現在修好了手機,成功拍攝了1080p超清的視頻。拿來播放時,發現事情並不簡單。

2分鐘的視頻,居然佔用了1.84G的空間!

你:這個視頻為什麼這麼大?

我(拿出計算器):解析度是1920×1080,每個像素是24位,壓縮後一幀是607.5KB;每秒24幀,一秒大約是142.4MB,兩分鐘就是大約1.842GB,沒問題啊。

你:有什麼辦法能讓它小一點嗎?

我:當然有。


幀間壓縮

剛才的視頻格式只是把每一幀圖像進行壓縮,這種方法稱為幀內壓縮。但幀內壓縮的壓縮率仍舊不高。按照數學史和修仙的發展規律,是時候來一次返璞歸真了。

視頻,是為了表現什麼?

一幅一幅的畫面嗎?

不是。

視頻的本質在於運動。

為了達到運動的效果,人們才發明了視頻。但是,運動是連續的,視頻只是用一幀幀離散的畫面去模仿運動。既然是離散的……

那就離散得再徹底一點!

MPEG橫空出世。

MPEG-1的第二部分規定了GOP(Group of Pictures,圖像群組)的概念。一個視頻包含若干個GOP,一個GOP包含若干幀。

(來源:由GOP_2.png: Benutzer:MuldeRderivative work: Dvaer (talk) - GOP_2.png,公有領域,File:https://commons.wikimedia.org/wiki/File:GOP_2.svg)

GOP內的幀分為三種:I幀、B幀和P幀,就是圖中的I、B、P。其中I幀包含完整的圖像信息並進行幀內壓縮,而B、P幀只包含圖像的一部分,圖像的其他部分通過和其他圖像運算得出。(P幀參考I幀和之前的P幀,B幀參考之前和之後的I、P幀。)

這是什麼意思呢?

舉個栗子:要做一段小球滾動的視頻,開頭和結尾分別是:

(用畫圖做的,比較簡陋)

在編碼時,因為背景都是不變的,所以只需要比較兩幅圖中不同的部分,也就是小球的畫面和小球運動軌跡的背景(因為需要擦除小球在上一幀的圖像)。這樣,把第一幀作為I幀,後面的作為B、P幀,就可以自動運算生成小球運動的畫面。

這種壓縮方法不是順序解碼的,而是先解碼I幀,再根據I幀解碼第一個P幀,然後解碼I、P幀之間的B幀並播放,之後根據P幀解碼下一個P幀,再解碼B幀,最後按照這個方法繼續解碼後面的內容。Wiki上可能說的清楚一點:

顯示的順序是:I0、B1、B2、B3、P4、B5、B6、B7、P8、B9、B10、B11、I12;則編解碼順序為:I0、P4、B1、B2、B3、P8、B5、B6、B7、I12、B9、B10、B11。

I幀還有一個響亮的名字,叫做關鍵幀,但是這個關鍵幀要和視頻編輯軟體中的關鍵幀區分開,前者只在編碼、解碼時使用,後者只在設計時使用。

你:既然關鍵幀這麼好,那怎麼安排呢?

我:比較常用的格式中,一個視頻文件中GOP的長度都是相同的。GOP的長度又叫做關鍵幀間隔。比如設置關鍵幀間隔為33,那麼每隔33幀就會有一個關鍵幀。

你:那關鍵幀間隔越短,視頻是不是越清晰?

我:對,但是視頻也會越來越大。

現在可以回答標題提出的問題了:為什麼不能完全精準空降?

答案只有一句話:普通的視頻播放軟體只能把進度調到關鍵幀的位置。

好了,大家可以散了。


你:你怎麼還沒走?

我:坑還沒填完,我怎麼可以走呢?

大家還記得我提過的720p和720i嗎?兩者的區別就在於場序。

你:場是啥?場序又是啥?

其實場和場序是一個歷史遺留問題。

還記得以前的顯示器是什麼樣的嗎?

就是這種帶著大頭的,叫做CRT顯示器。它使用陰極射線管成像,可以使用三色光混合,產生豐富的色彩。但是CRT有一個缺點,就是不能持久顯示。因此,隨著視頻解析度不斷升高,人們發現了問題:

如果一行一行的顯示,顯示下面的圖像時,上面的就消散了。這樣圖像一會兒有一會兒沒有,就產生了嚴重的閃爍。

人們當然是有解決辦法的:

既然顯示不了這麼多,就少顯示一點吧。

在傳統的CRT顯示器上,視頻要分為兩部分:一部分是奇數行,稱為「上場」或「高場」;另一部分是偶數行,稱為「下場」或「低場」。CRT在顯示視頻時,先顯示高場,再顯示低場,就能解決閃爍的問題。

你:為什麼先顯示高場,再顯示低場?倒過來不行嗎?

我:先顯示高場的叫做高場優先或上場優先,先顯示低場的叫做低場優先或下場優先。電視台的視頻一般都是高場優先的。這就是兩種場序。

你:那麼720p和720i就是高場優先和低場優先之分了!

我:錯。場序可不止有這兩種。

你:。。。

在液晶顯示器已經普及的今天,已經不用再分高場低場了,直接一行一行的顯示,反而能減少視頻對眼的傷害。這種逐行掃描的方式又叫做無場,是第三種場序。

與逐行掃描相對,高場優先和低場優先統稱為隔行掃描。720i的i就是指隔行掃描,而p指逐行掃描。

由於現在隔行掃描的視頻少了,所以720i、1080i就逐漸被埋沒,720p、1080p則成為高清(HD)、超清(Full HD)的代名詞。

你:那麼,錄視頻的時候,錄哪一種場序的視頻好呢?

我:這要看視頻播放的領域了。如果要在電視台播放,看電視台的規定(一般為高場優先);如果要在網路傳輸播放,最好是無場視頻。

比特率

你:坑都填完了,為什麼還不走?

我:你咬我呀~

比特率又叫碼率,是視頻三個重要參數之一(幀率、碼率、解析度),單位是bps(bit per second,每秒二進位位數)。比特率直接決定視頻的大小,用平均碼率(bps)乘時長(s)就能得到視頻的大小(bit)。(單位換算:1GB=1024MB,1MB=1024KB,1KB=1024B,1B=8bit,1Kbps=1000bps,1Mbps=1000Kbps)

注意到,我剛才說的是「平均碼率」,而不是「碼率」。這是因為一個視頻在不同部分的碼率可能是不同的,這取決於視頻在壓制時的設置。

在用軟體壓制視頻時,可以看到有 CBR 、 VBR(一次)和 VBR(兩次)三種碼率格式。

CBR 是固定碼率,整個視頻在任何一處的碼率都是相同的。

VBR 是可變碼率,軟體根據畫面的複雜程度,對複雜的畫面採用更少的壓縮,對簡單的畫面採用更多的壓縮,能夠保證在整個視頻的大小不變的情況下有更好的效果。VBR 還有一次和兩次之分。一次就是指整個視頻只渲染一遍,每個地方的碼率靠預測算出,壓縮效果比兩次略差,但是耗時短;兩次就是整個視頻先預覽一遍,確定每一處的碼率,再重新渲染壓制,壓縮效果理論上比一次要好,但實際上兩者相差無幾,而且兩次的速度非常慢,所以我推薦用 VBR(一次)。

引入碼率的概念之後,視頻的清晰度將不只取決於解析度。碼率代表著視頻的信息量,如果用相同的信息量去描述更大的畫面,必然要丟失細節。所以在同樣的碼率下,1080p 甚至不如 720p 清晰。

你:WTF?

我:

(滑稽)

你:那麼,把碼率設置為多少合適呢?

最大碼率一般設置為平均碼率(目標碼率)的2~3倍。

  • 如果要用高品質的視頻,平均碼率可以設置為 20Mbps(20000Kbps)。
  • 如果要在視頻網站投稿,取決於視頻網站的規定。以B站為例:碼率不超過 1800Kbps 的,會直接上傳;超過 1800Kbps 的,會被網站二次壓制。我推薦大家盡把碼率設置高一點(2~3Mbps),因為現在的二次壓制技術已經不是從前的「精美視頻壓成翔」的技術了,現在二次壓制有了很大進步,有時候效果甚至要比你自己壓縮比特率的效果要好很多。
  • 如果是你自己作死玩,可以試試 1080p + 200Kbps 的配置,你會真正體會到「高清也拯救不了的畫質」。

結語

這篇文章寫作歷時三個月。不是因為內容多,而是因為在這三個月里我只寫了三天。(逃)

這些是我在剛接觸 Pr、Ae 這些視頻剪輯軟體時的學習的心得,希望能對大家有所幫助。

推薦閱讀:

推薦 10 款圖片和視頻編輯工具,操作簡單、製作精美!
王子峰:如何錄製手機錄屏視頻的秘密方法
只要3分鐘,小白也能輕鬆製作精美動畫視頻,趕緊學起來吧
自媒體視頻創作不再追流量?尊重原創尊重經典文藝作品?
寫在開欄之前

TAG:視頻剪輯 | 視頻製作 | 視頻編碼 |