大學畢業做音視頻開發,月入20K,你呢?

音視頻趨勢

隨着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。

image

▲ YUV(Y’CbCr)是如何形成圖像的

YUV碼流的存儲格式其實與其採樣的方式密切相關。(採樣,就是捕捉數據)

主流的採樣方式有三種:

1)YUV4:4:4;

2)YUV4:2:2;

3)YUV4:2:0。

image

具體解釋起來有點繁瑣,大家只需記住,通常用的是YUV4:2:0的採樣方式,能獲得1/2的壓縮率。

這些預處理做完之後,就是正式的編碼了。

5、視頻編碼的實現原理

5.1 視頻編碼技術的基本原理

前面我們說了,編碼就是爲了壓縮。要實現壓縮,就要設計各種算法,將視頻數據中的冗餘信息去除。當你面對一張圖片,或者一段視頻的時候,你想一想,如果是你,你會如何進行壓縮呢?

▲ 對於新垣女神,我一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資料包】【私信我】查看免費領取方式!