前言
想通過一篇文章的科普,讓你在使用視頻的時候知道如何選擇合適的視頻參數。
本篇文章會嘗試把這些概率都聯系起來,對視頻相關的概念有整體的認知。
結論先行
用戶視角:
開發者視角:
影響內存的:主要是分辨率
影響 CPU 的:碼率和編碼格式
影響 GPU 的:分辨率和編碼格式。
影響體積大小和帶寬:碼率
封裝格式
就是把視頻數據和音頻數據打包成一個文件的規范。 一個完整的視頻文件,包括音頻、視頻和基礎元信息,我們常見的視頻文件如 mp4、mov、flv、avi、rmvb 等視頻文件,就是一個容器的封裝,里面包含了音頻和視頻兩部分。
封裝格式是不會影響視頻的畫質,封裝成什么格式就看在使用的時候解碼器是否支持這個封裝格式即可。
封裝,也叫多路復用(mux)。封裝的目的一般為了在一個文件(流)中能同時存儲視頻(video)、音頻(audio)、字幕(subtitle)等內容——這也正是“復用”的含義所在(分時復用)。封裝還有另一個作用是在網絡環境下確保數據的可靠快速傳輸。
編碼格式
我們知道,其實視頻就是一幀一幀的圖片。計算一下,一部 25 幀每秒,90 分鐘,分辨率為 1024*768,24 位(rgb 每個 8 位)真彩色的視頻,沒有經過壓縮,大小為 :
1Byte(字節) = 8bit(位)
一幀大小 = 1024 * 768 * 24 = 18874368(bit) = 2359296(Byte)
總幀數 = 90 * 60 * 25 = 135000
總大小 = 一幀大小 * 總幀數 = 2359296 * 135000 = 318504960000(Byte)= 303750(MB)≈ 296(GB)
從上面的計算可以看出,我們儲存一部 90 分鐘沒壓縮的電影需要 296GB 的。所以我們需要對視頻進行壓縮,這種視頻壓縮技術就是我們所說的編碼。
視頻編碼方式:H.26X(H.261、H.262、…、H.264(目前最常用)、H.265)
音頻編碼方式:MP3、AAC 等
通過視頻壓縮算法,減少了視頻文件的大小。壓縮比越大,解壓縮還原后播放的視頻越失真,這是因為壓縮的同時不可避免的丟失了視頻中原來圖像的數據信息。
注意編碼格式要跟封裝格式做區分,兩者沒有任何關系。
一般我們只需要關注 H.264
和 H.265
即可,H.264 是使用最廣泛,除了 H.265 之外壓縮率最高的,也就是說在相同碼率下除了 H.265 之外 體積最小的。
而 H.265 相比于 H.264 相同碼率下體積還降低了 50% 。
那是不是就可以無腦使用 H.265 了呢?先說說使用 H.265 有什么問題,我認為最大的兩點就是:
計算復雜性 。H.265 的編碼和解碼過程比之前的標準(如 H.264)更復雜,壓縮率更高,解碼需要更多的計算資源。這意味著在一些低端設備上可能會面臨性能問題。
兼容性。 盡管 H.265 已經得到廣泛支持,但仍然存在一些老舊設備不支持 H.265 的硬件解碼,這就會導致播放器只能使用軟解,會增加 CPU 的消耗。
硬件解碼:顧名思義就是通過硬件進行解碼的計算,通常是 GPU。 軟件解碼:顧名思義就是通過軟件計算解碼,軟件計算主要依靠的是 CPU。CPU 的計算能力相比 GPU 來說弱很多,就會導致 CPU 占用率高,導致設備發熱發燙。
所以在設備相對較好的情況下,無腦使用 H.265 是沒有問題的,如果對于低端設備使用 H.265 可能會帶來性能問題,導致視頻播放卡頓,需要用空間來換時間了。
視頻分辨率
視頻分辨率跟我們平時說的圖像分辨率差不多,主要是指 單位英寸中所包含的像素點數。 可以用長 x *寬的形式表示比如 1280 ** 720 的分辨率,也可以以像素點總數的形式表示,比如 200 萬像素(1920 * 1080)。
常見的分辨率:
720 P(1280 * 720)
1080 P(1920 * 1080)
2K(2560 * 1440)
4K(4096 * 2160)
視頻的分辨率與像素不可分,比如一個視頻的分辨率為 1280*720,就代表了這個視頻的水平方向有 1280 個像素,垂直方向有 720 個像素。
另外需要知道的:
720P 是指視頻有 720 行像素, P 是 Progressive 逐行掃描 。
2K 是指視頻像素的總列數 。
MP 是像素總數,指像素的行數(P)與列數(K)乘積的結果(百萬像素) -
1080P 分辨率為 1920 *1080,總像素 2073600,通常將 1080P 叫做 200 萬像素分辨率
通常視頻在同樣視窗的情況下,分辨率越高,所包含的像素就越多,視頻畫面就越細膩、越清晰。
另外需要注意分辨率越大在解析到內存之后占用的內存也會更大,這個原理跟圖片的分辨率對內存的影響是一致的。對于內存優化,通常降低分辨率是一個有效的方式。
視頻幀率
幀率的單位是:FPS 是指每秒幀數(Frames Per Second)簡寫:P,“如 30 fps 和 30 p 指的都是每秒鐘播放 30 張圖片的意思” 。
高低幀率:低幀率會伴隨模糊、卡頓、鏡頭移動時不順暢等問題,但也不是越高越好,會造成眩暈的感覺。
不同幀率的視頻在不同設備上播放:
① 若一個播放設備最高支持 60fps,在此設備上播放 120fps 的影片,則播放設備會每隔一張刪除 120fps 的影片,被刪除的圖片成為無效幀。
這就導致高幀率的影片在低幀率的設備上播放時,會降低播放流暢度。
② 若一個播放設備最高支持 120fps,在此設備上播放 60fps 的影片,則播放設備會每將每張圖片復制一張,以填補空缺的幀。但是效果和 60fps 的設備上播放一樣,對播放流暢度沒有提升。
幀率是直接影響流暢度的指標,視頻一般 24FPS/25FPS 已經足夠,低于 24 將會感到卡頓。
視頻碼率(視頻比特率)
非常非常重要的一個參數。
碼率就是數據傳輸時單位時間(1s)傳送的數據位數,一般我們用的單位是 kbps 即千位每秒。
碼率與體積的關系:
在相同的時間下,碼率越大,體積就越大。
存儲體積 = **碼率 ** * 時間 。
碼率與畫質的關系:
同樣分辨率下,視頻文件的碼率越大,壓縮比就越小,畫面質量就越高。碼率越高,精度就越高,處理出來的文件就越接近原始文件,圖像質量越好,畫質越清晰,要求播放設備的解碼能力也越高。
編碼模式碼率取樣率,單位時間內取樣率越大,精度就越高,處理出來的文件就越接近原始文件,但是文件體積與取樣率是成正比的,所以幾乎所有的編碼格式重視的都是如何用最低的碼率達到最少的失真,圍繞這個核心衍生出來 cbr(固定碼率)、vbr(可變碼率)、abr(平均碼率);
CBR: constant bitrate(固定碼率)
以恒定比特率方式進行編碼,有運動發生時,由于碼率恒定,只能通過增大 QP 來減少碼字大小,圖像質量變差,當場景靜止時,圖像質量又變好,因此圖像質量不穩定。
這種算法優先考慮碼率(帶寬)。適合在流式播放中應用。
CBR 編碼的缺點在于編碼內容的質量不穩定,容易產生馬賽克。因為對于某些較復雜的圖像比較難壓縮,所以 CBR 流的某些部分質量就比其他部分差。
VBR:variable bitrate(動態碼率)
QVBR(Quality Variable Bit rate)質量碼流
ABR:average bitrate(平均碼率,是 VBR 的一種插值參數)
CVBR:Constrained VariableBit Rate(有限碼流)
聯系
幀率相關
碼率
分辨率:
清晰度:
總結
沒有完美的算法,無非是時間和空間的平衡,二者不可兼得。
作為一個開發者,我們需要在用戶的終端性能、網絡、成本等各方面權衡,在不同的場景使用不同的參數的視頻,可以提升用戶的使用體驗,降低公司的成本。
在了解各個參數之后,在對視頻做優化的時候就會游刃有余:
參考文章: