隨着5G時代的到來,音視頻領域將會大放異彩。
5G讓所有人興奮,用戶期待,因爲5G網絡更快更穩定延遲更低。運營商和上下游產業也期待,大家都想在5G時代分一杯羹。
近幾年抖音快手B站等App的火熱,已經說明問題了。隨着WiFi設施的全面普及,流量費用的進一步下降,使得我們隨時隨地刷視頻成爲了可能。回想起我大學時代,那個時候流量很貴,貴到什麼程度呢?1M流量要10塊錢!大家想一想,1M流量10塊錢,1G流量1萬塊錢,你還敢用4G刷視頻麼?4G時代,大家刷短視頻,5G時代,大家刷長視頻。基於這個判斷,音視頻相關技術是未來幾年的熱點,除了抖音快手,新的現象級客戶端有可能會出現。
作爲移動開發人員,如何跟上熱點學習音視頻技術呢?
今天主要介紹視頻入門基礎知識
好了,剛纔說了圖像,現在,我們開始說視頻。所謂視頻,大家從小就看動畫,都知道視頻是怎麼來的吧?沒錯,大量的圖片連續起來,就是視頻。
衡量視頻,又是用的什麼指標參數呢?最主要的一個,就是幀率(Frame Rate)。在視頻中,一個幀(Frame)就是指一幅靜止的畫面。幀率,就是指視頻每秒鐘包括的畫面數量(FPS,Frame per second)。
幀率越高,視頻就越逼真、越流暢。
有了視頻之後,就涉及到兩個問題:
一個是存儲;
二個是傳輸。
而之所以會有視頻編碼,關鍵就在於此:一個視頻,如果未經編碼,它的體積是非常龐大的。
以一個分辨率1920×1280,幀率30的視頻爲例:
共:1920×1280=2,073,600(Pixels 像素),每個像素點是24bit(前面算過的哦);
也就是:每幅圖片2073600×24=49766400 bit,8 bit(位)=1 byte(字節);
所以:49766400bit=6220800byte≈6.22MB。
這是一幅1920×1280圖片的原始大小,再乘以幀率30。
**也就是說:**每秒視頻的大小是186.6MB,每分鐘大約是11GB,一部90分鐘的電影,約是1000GB。。。
嚇尿了吧?就算你現在電腦硬盤是4TB的(實際也就3600GB),也放不下幾部大姐姐啊!不僅要存儲,還要傳輸,不然視頻從哪來呢?如果按照100M的網速(12.5MB/s),下剛纔那部電影,需要22個小時。。。再次崩潰。。。
正因爲如此,屌絲工程師們就提出了,必須對視頻進行編碼。
**編碼:**就是按指定的方法,將信息從一種形式(格式),轉換成另一種形式(格式)。**視頻編碼:**就是將一種視頻格式,轉換成另一種視頻格式。
編碼的終極目的,說白了,就是爲了壓縮。各種五花八門的視頻編碼方式,都是爲了讓視頻變得體積更小,有利於存儲和傳輸。
我們先來看看,視頻從錄製到播放的整個過程,如下:
首先是視頻採集。通常我們會使用攝像機、攝像頭進行視頻採集。限於篇幅,我就不打算和大家解釋CCD成像原理了。
採集了視頻數據之後,就要進行模數轉換,將模擬信號變成數字信號。其實現在很多都是攝像機(攝像頭)直接輸出數字信號。信號輸出之後,還要進行預處理,將RGB信號變成YUV信號。
前面我們介紹了RGB信號,那什麼是YUV信號呢?
簡單來說,YUV就是另外一種顏色數字化表示方式。視頻通信系統之所以要採用YUV,而不是RGB,主要是因爲RGB信號不利於壓縮。在YUV這種方式裏面,加入了亮度這一概念。在最近十年中,視頻工程師發現,眼睛對於亮和暗的分辨要比對顏色的分辨更精細一些,也就是說,人眼對色度的敏感程度要低於對亮度的敏感程度。
所以,工程師認爲,在我們的視頻存儲中,沒有必要存儲全部顏色信號。我們可以把更多帶寬留給黑—白信號(被稱作「亮度」),將稍少的帶寬留給彩色信號(被稱作「色度」)。於是,就有了YUV。
YUV裏面的「Y」,就是亮度(Luma),「U」和「V」則是色度(Chroma)。
大家偶爾會見到的Y’CbCr,也稱爲YUV,是YUV的壓縮版本,不同之處在於Y’CbCr用於數字圖像領域,YUV用於模擬信號領域,MPEG、DVD、攝像機中常說的YUV其實就是Y’CbCr。
▲ YUV(Y’CbCr)是如何形成圖像的
YUV碼流的存儲格式其實與其採樣的方式密切相關。(採樣,就是捕捉數據)
主流的採樣方式有三種:
1)YUV4:4:4;
2)YUV4:2:2;
3)YUV4:2:0。
具體解釋起來有點繁瑣,大家只需記住,通常用的是YUV4:2:0的採樣方式,能獲得1/2的壓縮率。
這些預處理做完之後,就是正式的編碼了。
前面我們說了,編碼就是爲了壓縮。要實現壓縮,就要設計各種算法,將視頻數據中的冗餘信息去除。當你面對一張圖片,或者一段視頻的時候,你想一想,如果是你,你會如何進行壓縮呢?
▲ 對於新垣女神,我一bit也不捨得壓縮…
我覺得,首先你想到的,應該是找規律。是的,尋找像素之間的相關性,還有不同時間的圖像幀之間,它們的相關性。
**舉個例子:**如果一幅圖(1920×1080分辨率),全是紅色的,我有沒有必要說2073600次[255,0,0]?我只要說一次[255,0,0],然後再說2073599次「同上」。
如果一段1分鐘的視頻,有十幾秒畫面是不動的,或者,有80%的圖像面積,整個過程都是不變(不動)的。那麼,是不是這塊存儲開銷,就可以節約掉了?
▲ 以上圖爲例,只有部分元素在動,大部分是不動的
是的,所謂編碼算法,就是尋找規律,構建模型。誰能找到更精準的規律,建立更高效的模型,誰就是厲害的算法。
通常來說,視頻裏面的冗餘信息包括:
視頻編碼技術優先消除的目標,就是空間冗餘和時間冗餘。
接下來,就和大家介紹一下,究竟是採用什麼樣的辦法,才能幹掉它們。以下內容稍微有點高能,不過我相信大家耐心一些還是可以看懂的。
視頻是由不同的幀畫面連續播放形成的。
這些幀,主要分爲三類,分別是:
1)I幀;
2)B幀;
3)P幀。
**I幀:**是自帶全部信息的獨立幀,是最完整的畫面(佔用的空間最大),無需參考其它圖像便可獨立進行解碼。視頻序列中的第一個幀,始終都是I幀。
P幀:「幀間預測編碼幀」,需要參考前面的I幀和/或P幀的不同部分,才能進行編碼。P幀對前面的P和I參考幀有依賴性。但是,P幀壓縮率比較高,佔用的空間較小。
▲ P幀
B幀:「雙向預測編碼幀」,以前幀後幀作爲參考幀。不僅參考前面,還參考後面的幀,所以,它的壓縮率最高,可以達到200:1。不過,因爲依賴後面的幀,所以不適合實時傳輸(例如視頻會議)。
▲ B幀
通過對幀的分類處理,可以大幅壓縮視頻的大小。畢竟,要處理的對象,大幅減少了(從整個圖像,變成圖像中的一個區域)。
如果從視頻碼流中抓一個包,也可以看到I幀的信息,如下:
我們來通過一個例子看一下。
這有兩個幀:
好像是一樣的?
不對,我做個GIF動圖,就能看出來,是不一樣的:
人在動,背景是沒有在動的。
第一幀是I幀,第二幀是P幀。兩個幀之間的差值,就是如下:
也就是說,圖中的部分像素,進行了移動。移動軌跡如下:
這個,就是運動估計和補償。
當然了,如果總是按照像素來算,數據量會比較大,所以,一般都是把圖像切割爲不同的「塊(Block)」或「宏塊(MacroBlock)」,對它們進行計算。一個宏塊一般爲16像素×16像素。
▲ 將圖片切割爲宏塊
好了,我來梳理一下。
對I幀的處理,是採用幀內編碼方式,只利用本幀圖像內的空間相關性。對P幀的處理,採用幀間編碼(前向運動估計),同時利用空間和時間上的相關性。簡單來說,採用運動補償(motion compensation)算法來去掉冗餘信息。
需要特別注意,I幀(幀內編碼),雖然只有空間相關性,但整個編碼過程也不簡單。
如上圖所示,整個幀內編碼,還要經過DCT(離散餘弦變換)、量化、編碼等多個過程。限於篇幅,加之較爲複雜,今天就放棄解釋了。
那麼,視頻經過編碼解碼之後,如何衡量和評價編解碼的效果呢?
一般來說,分爲客觀評價和主觀評價。客觀評價,就是拿數字來說話。例如計算「信噪比/峯值信噪比」。
信噪比的計算,我就不介紹了,丟個公式,有空可以自己慢慢研究…
除了客觀評價,就是主觀評價了。主觀評價,就是用人的主觀感知直接測量,額,說人話就是——「好不好看我說了算」。
學習分享
音視頻,人工智能,這些是未來沒辦法阻擋的發展大趨勢。我在獵聘網上看那些招聘崗位,要求精通NDK的薪資都在30-60K。追求高薪崗位的小夥伴,NDK開發一定要掌握並且去深挖。
題外話,雖然我在大廠工作多年,但也指導過不少同行。深知學習分享的重要性。
當程序員容易,當一個優秀的程序員是需要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力。早早確定自己的職業方向,才能在工作和能力提升中甩開同齡人。
以下是今天給大家分享的一些獨家乾貨:
【Android高級架構思維腦圖(技能樹)】
【NDK學習視頻】、【NDK資料包】【私信我】查看免費領取方式!