視頻、音頻、字幕…基礎(chǔ)知識,從完全不懂,到輕松入門
目錄
-前言
-詞典
-封裝
-視頻
????--圖片壓縮
????--視頻壓縮
-音頻
-字幕
????--字幕文件
????--字幕類型
-字體

前言
本人才疏學(xué)淺,文章內(nèi)可能有錯誤的或不恰當?shù)牡胤?,歡迎各位大佬指正。
寫本文的目的,是希望把這些基礎(chǔ)知識帶給大家。因為我發(fā)現(xiàn)網(wǎng)上做這方面知識科普的視頻或文章,有的深度很深且難于理解、有的過于單調(diào)和松散、有的長篇大論、有的小白看不懂、有的甚至有錯誤;所以這篇文章將以簡潔、易懂、適合大家入門為目標,讓所有人都能學(xué)會。

詞典
p=per=/(這是除號)
????????eg:4元每斤=4元p斤;Mbps=Mb/s

k=10^3;M=10^6;G=10^9;Mi=1024^2;Gi=1024^3;Ti=1024^4……
????????tip:聽說k規(guī)范上為小寫,為的是與K(開爾文)區(qū)分,不確定是否如此
????????tip:把Mi寫作M為不規(guī)范寫法,說的就是你微軟

比特=bit=b;字節(jié)=Byte=B;1B=8b

幀數(shù),單位:f=frame=幀;幀率,單位:fps=幀每秒

二進制,每位能存2個值(0-1);十進制,每位能存10個值(0-9)
????????eg:10位的二進制數(shù)有2^10=1024個,4位的十進制數(shù)有10^4=4k個
????????tip:常見的計算機用的存儲器,每個位置只能存2個數(shù),所以用二進制

采樣,因為自然中的運動是連續(xù)的,但視音頻無法記錄每一刻的信息,所以只能每隔一段時間采樣一次
????????eg:30fps的錄像就是一秒采樣30次

封裝
這里提出一點很多人的誤解:很多人誤以為一個視頻文件,就必定包含音頻。
實際上視頻文件和音頻文件是分離的,平時我們看到的大多數(shù)視頻文件,都是和一個音頻文件“捆綁”在一起的。要實現(xiàn)這種“捆綁”,就需要使用容器,也就是封裝。
“容器”這個詞非常形象,容器里可以放各種各樣的文件。比如我可以在一個容器里塞2個視頻、3個音頻、4個字幕。
常見的容器格式有mp4、mkv等。
這里就得提到第二個跟多人的誤區(qū):mp4并不是視頻格式,而是容器格式。
假設(shè)一個mp4文件里有一個視頻流,我可以把這個視頻流抽出來,放在mkv容器里,而這個視頻流本身是不會有變化的,變化的僅僅是容器格式。
這里出現(xiàn)了第一個需要解釋的詞——“流”——這個詞也十分形象——播放中的視頻,不就是流動的畫面嘛。當然,你也可以叫它軌道,網(wǎng)上的叫法各種各樣,但總之,一個容器里可以放很多的流。
(mkv里甚至能塞入各種附件,如字體文件)
總結(jié):視音頻等文件被封裝在一個容器文件中。

視頻
我相信絕大多數(shù)朋友都知道,視頻是由一張張圖片組成的,但可能忽視了視頻的壓縮。
視頻的每一張圖片被稱作一幀,圖片播放速率被稱作幀率(別說成幀數(shù)了啊,幀數(shù)是視頻的總圖片數(shù))——以上僅僅是類比,因為視頻文件壓根就不是一張張圖片組成的。
為什么?原因很簡單,因為圖片太大了!
圖片壓縮
假設(shè)世界上有256種顏色,那么要用一個數(shù)值來表達一個像素,每個數(shù)值就需要占用256個存儲位置,一個位置為1bit,256=2^8,8bit=1Byte,那么就是每個像素占用1B——這就是8位色深的圖片。
一張圖片1920*1080=2073600個像素,需要占用約2MB。但顯然,平常我們見到的8位1080p圖片只有100KB不到,這是怎么回事?
如果現(xiàn)在讓你想一種方法,把原來2MB的圖片盡量壓縮得小,你會怎么做?是不是第一反應(yīng)就是,把大片大片同樣顏色的區(qū)域——比如圖片中央有一個800*800的白色正方形——用一個代表顏色的值、和一個代表形狀和位置的值來表示?本來需要用640000B表示的白色正方形,最終只用了幾B就表示出來了。
以上就是無損壓縮,只不過現(xiàn)在的無損壓縮算法比這復(fù)雜得多得多得多得…多。
常見的無損壓縮格式有PNG、GIF等。
那么有損壓縮又是怎么一回事?
假設(shè)現(xiàn)在有一大片(200,0,0)色的區(qū)域,里面混雜了一點(201,0,0)色,的像素,因為這兩種顏色過于接近,我是不是可以把它們視作同一種顏色存儲起來?反正肉眼看不出來嘛,能壓縮成多小就壓縮多小。
但這樣,原本的(201,0,0)色像素就丟失了,這不就是”有損“嘛。
當然,實際上的有損壓縮算法遠比這復(fù)雜,大家能理解啥是有損就好。
常見的有損壓縮格式有JPEG、WEBP等。
視頻壓縮
關(guān)于視頻壓縮,很多人存在誤區(qū):視頻壓縮就是一張張壓縮后的圖片拼接在一起的。
如果僅僅是圖片壓縮后拼接,就如上文提到的,一張1080p8bit的圖片100KB=800Kb,假如一個視頻30fps,那么碼率就來到了驚人的24Mbps!
要知道,超高碼率的2160p視頻,很多也不到20Mbps。所以如果僅僅是圖片壓縮后拼接,那么結(jié)果就是硬盤爆炸。
所以聰明的你現(xiàn)在應(yīng)該已經(jīng)想到了幀間壓縮了吧——因為視頻的運動是連續(xù)的,所以賦予上個畫面中的一部分一個矢量信息,那么它就能動起來了!如果一個物體勻速運動了30f,那么我們只用了1f的大小,就存儲了30f的信息!
常見視頻格式有AVC、HEVC等。
(常見的視頻壓縮格式都是有損的)
總結(jié):視頻文件是由非常復(fù)雜的算法壓縮的,并不是簡單的一堆圖片。

音頻
與視頻記錄每個像素的顏色一樣,音頻記錄的是每個采樣點的響度與頻率,把一個個采樣點的坐標串起來,就還原了原本波的形狀。
如一個函數(shù)y=sinx,采樣到了(0,0),(π/2,1),(π,0)三個坐標,那么生成的結(jié)果就是x∈(0,π)時的sinx圖像。(實際上比這復(fù)雜很多)
常見無損格式有FLAC、WAV等。
常見有損格式有AAC、MP3、OGG、OPUS等。

字幕
字幕文件
字幕需要的是什么?起始點和結(jié)束點!
所以字幕文件本質(zhì)上就是給一串字符起始點和結(jié)束點。
字幕樣式就是規(guī)定字符串的字體、位置、運動。有些字幕格式是無法指定高級樣式的,比如SRT。
當然實際上還是比較復(fù)雜的,有興趣的朋友可以打開一個字幕文件看看里面的結(jié)構(gòu)。
常見格式有ASS/SSA、SRT等。
以上是文本字幕,本質(zhì)上是把字符渲染成圖形實現(xiàn)的;除此之外還有圖形字幕,本質(zhì)上就是圖片,因為很少見,就不例舉了。
字幕類型
外掛字幕:字幕文件不在容器內(nèi),是單獨的一個文件。
內(nèi)置/內(nèi)掛字幕:字幕文件封裝在容器內(nèi),通常使用mkv封裝,因為能同時封裝字體。
內(nèi)嵌字幕:不存在字幕文件,字幕是視頻畫面的一部分。
這里指的字幕類型是相對于視頻來說的,如果不存在視頻,那就沒有所謂“字幕類型”;比如“外掛”是相對于視頻來說是外掛,“內(nèi)置”是相對視頻來說是和視頻封裝在一起的。

字體
字體是用來規(guī)定字符的圖形的。
比如“1”這個字符,你能看到它呈現(xiàn)的是“1”這個形狀,是因為它的字體是這個形狀,如果它的字體對應(yīng)的形狀是“2”,那么你輸入1將看到2。
Windows需要安裝字體,右鍵字體文件安裝即可,安裝的字體文件將被復(fù)制到Fonts文件夾中。當播放器播放字幕時,會發(fā)現(xiàn)字幕文件里需要某個字體,這時會讓系統(tǒng)調(diào)用已安裝的那個字體。如果那個字體沒被安裝,播放器將按照默認字體渲染字幕。
Android和iOS無法像Windows這樣方便地安裝字體,它們的字體渲染邏輯區(qū)別很大所以有時Android加載字體緩存能用到十幾二十分鐘。
觀看含字幕文件的視頻時,一定要有相應(yīng)字體,否則甚至會出現(xiàn)字幕超出屏幕邊緣的情況。