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