天天看點

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

這裡寫自定義目錄标題

  • 個人認知,程式員職業發展出路
  • 編碼器發展史
  • 編碼原理
  • H264
  • H265

個人認知,程式員職業發展出路

随着5G時代的到來,音視訊成功走上風口,程式員如何發展,其實不管是入門級選手還是30歲,35歲中年危機的IT開發者,異或是更年長的IT開發者,都會有自己的職業發展路線。總結來說,目前大部分人的職業路線,職業出路,或者說職業遇到瓶頸以後解決方案可以總結為一下幾種,程式員是天天解決問題,天天給各種問題解決方案的人,對于自己的職業當然也得給出最好的解決方案:

出路1: 轉行;最簡單粗暴的,從寫代碼的工作變換到開個雜貨鋪,開個燒烤攤,或者考個公務員事業機關。完全走上一個新的領域新的行業,但是這也是一種出路,沒有對錯,隻有适合還是不适合。

出路2: 繼續深入專業領域;這個就有點厲害了,當然也是有難度的,在自身的領域達到專家級别,對自己的領域有比其他人更多更深的研究和見解,這個時候,你的年紀其實是你的優勢,随着技術的進一步深入,進一步積累,你會更值錢。但是你的成績從不及格提升到及格是很容易的,從60份到80分也是比較容易的,提升到90分也可以做到,但是當你要做到從95分到96分的提升就很艱難了,需要很多的耐心、思考,等等,人和人之間的差距也許就是那0.1分,這就是為什麼很多人做不到縱向深入的原因。

出路3: 相關領域轉行,比如管理崗,技術管理崗,銷售管理崗。都是以技術為基礎繼續向相關領域拓展。技術深入屬于縱向拓展,相關崗位轉崗就屬于橫向拓展了。

目前大部分的人都會有這3種考慮,覺得絞盡腦汁也就這3種選擇和出路了,但是在我看來還有一種,追随風口。

出路4,追随網際網路技術風口。

現在的網際網路技術更新速度非常的快,阿裡有一句話非常牛逼,就算是一頭豬到了風口也可以飛上天。現在網際網路技術發展這塊,風口技術每年都有,有的技術可以維持三到五年的風口期,這段時間進行野蠻式增長、爆發,之後就進入一個相對理性、成熟、穩定增長和變化的環節了,這就趨于穩定了。

我看來的出路就是,用敏銳的觸覺去發現每一次的風口技術,去抓風口技術,用最快的速度去學習風口技術,趕上這一波紅利,做一個當下技術紅牛沒問題吧,甚至成功創業也不是不可能。

說的有點熱血了,總結一句就是說,還有一個出路,需要你有快速反應能力,快速學習知識,學習技術,整合資源,學習當下最有發展前景,即将爆發的技術。

比如5G相關的産業。

也許你隻需要學好0-1或者0-10,0-60就可以了,不必那麼深入,因為走的就是快速路線,快槍講究的就是速度。

說的太多有點跑題了,回歸正題,音視訊,移動音視訊,随着5G的到來,音視訊必然會帶上風口,我個人認為在這個上風口之前具備一定的音視訊開發技術,到了風口收割一波紅利,沒得說,美滋滋。但是音視訊開發門檻較高,國内資源較少,這也是難點。

但是,難點也是賣點,爛大街的東西當然便宜了。

閑話就說這麼多,今天主要總結一下幾種編解碼器的基礎知識,他們的背景知識。

---------------------------------------------------------先洗這麼點,明天繼續更。2021-1-4.

編碼器發展史

Android中建立編碼器

MediaCodec.createEncoderByType("video/av");  //建立H264編碼器
MediaCodec.createEncoderByType("video/hevc");  //建立H265編碼器
           
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

為什麼會有這麼多種編碼器?看看他們的發展史的。

ITU-T這個組織是專門做音視訊的組織,還有一個組織ISO,這個組織是專門做各種标準規範的。

ITU-T是最先研發了音視訊通話的,最先研究出了H261,後來釋出H262,H263,指導後來的H視訊編解碼器,這是ITU-T的H26x系列。

兩個組織互相競争,

ISO也研發了MPEG-1、MPEG-2、MPEG-3、MPEG-4,對應H26x系列。

兩個組織競争了相近20年,兩個組織兩個标準,最後再1998年雙方合作,在第一版H264的基礎上雙方進行共同研發,釋出了後來的更成熟的H264,作為後來的結晶,這一結晶在ITU-T組織中依然稱為H264,但是在ISO組織中稱為MPEG4-avc,這隻是在不同組織中的稱呼名字。

但是在實際代碼中建立的時候,都是傳入,首先是video表示一個視訊标簽,然後傳入ISO組織的名稱“avc”表示H264編解碼器,H265就是“video/hevc”。

随着社會的進步,技術的發展,生活中使用的顯示器,越來越大,視訊畫面也變大,廣泛的出現了4K、8K視訊,這對于H264來說已經存在明顯不足了,是以兩個組織又一起合作研發了H265.

H265編解碼技術在ITU-T組織中稱為H265,在ISO組織中稱為HEVC。

H265在H264的基礎上研發的,可以達到更高壓縮的同時實作畫面更清晰。

H264可以實作把4M的數組壓縮到80k-90k,

同樣的畫質和同樣的碼率,H.265比H2.64 占用的存儲空間要少理論50%;

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

封裝格式

mp4、flv、rmvb、avi等稱為封裝格式。

封裝格式内部包含視訊軌(H264、H265編碼器編碼之後的字尾是h264、h265的視訊編碼檔案)、音頻軌(字尾是.aac .mp3的音頻編碼檔案)、字幕軌以及視訊寬高等編解碼資訊。

編解碼格式

H264、H265、VP8、VP9等稱為編碼格式。

其他參與者,其他編解碼器

Google後來推出了VP8、VP9的編解碼器,VP8,VP9分别和H264、H265做對應競争。

Microsoft推出了VC-1。

國産自主标準:AVS/AVS+/AVS2,隻是僅僅用于機頂盒,廣播電視,其他領域并沒有用到。但是現在的廣播電視也已經廢棄了AVS标準了用了其他更優良的标準。

視訊的組成

可以通過FFmpeg指令把視訊檔案進行拆分,把一個mp4封裝格式的視訊檔案可以抽取其中的h264視訊流檔案,也可以抽取其中的aac音頻流檔案。

視訊編碼檔案、音頻編碼檔案、編解碼資訊包括視訊寬高等共同組成了封裝視訊檔案。

編碼原理

視訊是如何進行編碼的呢

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

H261在音視訊領域的地位相當于馮諾依曼計算機模型對計算機領域的影響。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

編碼的本質就是壓縮,而且是有損壓縮,損失掉人耳可以聽的音波頻率範圍之外的頻率的聲音。圖像編碼也是有損編碼。

圖像編碼首先是将畫面打亂劃分稱為宏塊,經過心願編碼器劃分宏塊。

在H.264中的宏塊大小是固定的16x16,在H.265中宏塊的大小是可變的,最小8x8最大64x64。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

對于這樣一個漸變色的色塊,記錄哪些資訊可以儲存這個漸變色塊呢?

首先是寬高;

其次,是起止點顔色,終止點顔色;

最後,一條顔色漸變的變化趨勢方向。

這樣,有這3個資料就可以還原出這張漸變圖了,也就是可以唯一确定這張漸變圖了。

比起來存儲這張圖檔裡的所有像素點的像素值,存儲的資料就小的多了。

圖檔編碼思路

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

攝像頭采集到的原始視訊資料是YUV格式的視訊資料,然後這個YUV的資料傳輸給信源編碼器,信源編碼器的作用就是将視訊的每一幀打亂成宏塊,

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

劃分好宏塊後,計算宏塊的像素值,計算一副圖像中每個宏塊的像素值,

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

計算宏塊像素值的時候,也類似于上面的存儲一張漸變圖的方式,存儲橫向寬的第一排像素值,存儲第一列的縱向顔色值,然後再記錄一個預測方向,這個宏塊的顯示内容基本上就可以确定了。

這樣,雖然不會完全把這張圖檔的内容儲存下來,但是基本上可以把這張圖檔的絕大多數的内容還原出來。這也就是為什麼說是有損壓縮了。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

原本,完全儲存一張圖檔,比如寬高都是16像素的圖檔,完整儲存需要16X16個int值也就是256位元組,但是經過這樣橫向儲存16位元組縱向儲存16位元組然後儲存一個預測方向,基本上隻需要16+16-1=31個位元組就可以儲存這張圖檔了。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

H264有8個預測方向+1個平均值,一共9個預測。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

可以看出,其他條件不變的情況下,宏塊越大,視訊檔案越小。

所有宏塊都處理完,就可以拼接成一張圖,就是由宏塊的拼接成的一張圖檔了。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

然後,就是劃分子塊:

H265對比較平坦的圖像使用16X16的大小的宏塊,但是為了更高的壓縮率,還可以在16X16的宏塊上劃分出更小的子塊,子塊的大小可以是8X16,16X8,8X8,4X8,8X4,4X4,非常的靈活。

子塊就是在16X16的标準宏塊内進一步劃分出更小的宏塊。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

這樣再經過幀内壓縮,可以得到更高效的資料。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

可以看到H264壓縮後的像素顆粒更少了。更大成都的壓縮了。

宏塊劃分好後,就可以對H265編碼器緩沖中的所有圖檔進行分組了。

下一步就是:幀分組:

對于視訊資料主要有兩類資料備援,一類是時間上的資料備援,一類是空間上的資料備援。其中時間上的資料備援是最大的,先說說視訊資料時間備援問題。

為什麼說時間上的備援是最大的呢?假設錄影機每秒抓取30幀,這30幀的資料大部分情況下都是相關的,也有可能不止30幀的資料,可能幾十上百幀的資料都是關聯特别密切的。

對于這些關聯特别密切的幀,其實隻需要儲存一幀的資料,其他幀都可以通過這一幀在按某種規則預測出來,是以說視訊資料在時間上的備援是最多的。

為了達到相關幀通過預測的方法來壓縮資料,就需要将視訊幀進行分組。那麼如何判定某些幀關系密切,可以劃分為一組呢?

舉個例子,打撞球為例:

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

H265編碼器會按順序,每次取出兩幅相鄰幀進行宏塊比較,計算兩幀的相似度,如下:

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

可以使用VideoEye分析視訊的每一幀以及各種資料。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

為什麼宏塊越小壓縮程度越低,如果是4x4宏塊,減掉的原本圖像的内容就越少,和原本内容相同資料就越多,宏塊越大,和原圖相同資料肯定就越少了。大宏塊壓縮肯定會丢失更多的畫面細節資料,小宏塊壓縮,就能夠儲存更多的圖像細節資料,圖像肯定更清晰。

像微信中的發送視訊,如果不是發送的原圖,微信肯定進行了壓縮,它壓縮時犧牲視訊寬高和幀率來達到的壓縮,和現在視訊逐幀從YUV原始資料編碼壓縮時不同的。

H264

H265是基于H264的,H265是在H264的基礎上發展起來的。

什麼是H264:

定義: 對攝像頭采集的每一幀視訊需要進行編碼,由于視訊中存在空間和時間的備援,需要用算法來取出這些備援。H264是專門去除這些備援的算法,我們把這種算法稱為H264編碼。

H264是新一代的編碼标準,以高壓縮高品質和支援多種網絡的流媒體傳輸著稱。

應用 大多數看到的視訊,如rmvb, avi, mp4, flv 大豆是由H264進行編碼,當然也會有不同的其他編碼器,如mpeg4, vp9等這些比較冷門的編碼器進行編碼。

無論是H264 mpeg4 vp9 都是基于宏塊的方式進行編碼,原理都是一樣的,隻不過實作的算法不一緻罷了。

H265

相對于H264,總結來說,在增加視訊壓縮率的同時,視訊畫面品質反而增加了,更高清了。

H264 H265 對比

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

在H265的壓縮算法中,在像素趨于一緻的地方,就采用64X64的宏塊大小,在畫面複雜的地方采用4X4這樣的小宏塊,也就是說,細節的地方H265表現更好。就是因為宏塊比較小,更能夠還原對應的資料,畫面更清晰。

H264裡有8+1個預測方向,但是在H265裡面有35個預測方向。

H265塊劃分結構

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

H265中的編碼過程

首先宏塊會劃分成64X64的大小,如果宏塊内像素變化比較大,就會将該64X64的宏塊繼續往小劃分,比如劃分成4個子塊,會周遊每一個子塊,這個時候就會形成一個樹,一個四叉樹,每個子塊是32X32的,對每個子塊再進行進一步像素計算,如果子塊内顔色趨于一緻那就不再繼續劃分,如果子塊内像素變化較大,那就繼續劃分,最小可以劃分成4X4的大小,也就是極限情況下會出現一個64叉樹。

YUV資料經過信源編碼器會打亂成很多個宏塊;

然後會再經過視訊符合編碼器;

視訊符合編碼器主要做的就是方向預測以及基本參考資料儲存,總結來說就是結構化資料;

然後再經過傳輸緩沖器,會先緩存B幀資料。

捕獲到的第一幀是I幀,I幀内部存儲了所有了宏塊資料。

第二幀和第一幀相差不大,也就是說第一幀中的宏塊,第二幀中還是存在很多的,這些相同的宏塊就不需要再重新進行編碼了。

這樣看來,視訊播放的本質,就是宏塊的運動,由于宏塊的運動,導緻使用者看到的視訊畫面發生了改變。

那麼,在第二幀就不需要儲存所有的宏塊了,隻需要儲存運動矢量+殘差資料 就可以了。這就是 P幀。

B幀 不僅要參考I幀還要參考P幀才能确定自己的運動矢量,B幀裡面隻儲存運動矢量,不需要儲存宏塊資料。

是以,I幀最大,P幀次之,B幀最小;

如果一個視訊檔案中I幀越多,視訊檔案肯定越大。

與I幀相似程度極高,達到95%以上編碼成B幀;相似程度70%以上編碼成P幀。如何編碼不需要程式員來實作,已經由x264這個工具實作了。

是以,首先會生成一個I幀,儲存所有宏塊的資料,進行編碼;然後第二幀生成B幀,把B幀與I幀對比,相同宏塊去掉替換成運動矢量,第三幀B幀;再然後第四幀,信源編碼器認為應該生成P幀,視訊符合編碼器會取出P幀裡和I幀相同的宏塊,再把對應的宏塊轉成運動矢量,

P幀,B幀都會和I幀做對比,去掉相同宏塊,替換成運動矢量,再進行儲存。

是以,碼流中,首先輸出I幀,然後并不是輸出B幀,而是把B幀存在了傳輸緩沖器中,生成P幀以後把P幀輸出到碼流,這個時候才開始輸出B幀,并不是直接從傳輸緩沖器直接輸出B幀,而是從傳輸緩沖器中緩沖的B幀交給新源編碼器、然後再交給視訊符合編碼器,或者直接從傳輸緩沖器交給視訊符合編碼器,把B幀與I幀比較,去掉重複宏塊,生成B幀的運動矢量,把B幀輸出到碼流。

是這樣的順序。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

是以,碼流中,I幀之後一定是P幀。隻有P幀輸出之後,才能輸出B幀。

視訊流是一串流,可以通過十六進制分析工具分析264檔案,或者用抓包工具,可以看到裡面就是一串流資料,那在這一串流資料中怎麼找到I幀,B幀,P幀呢?

這個時候H264設計了一個分隔符,0x0000 0001。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

一個視訊的幀數,就可以通過記錄有多少分隔符,就可以知道有多少幀資料。

問題又來了,如果隻知道分隔符,是知道了幀與幀之間的分隔,知道了一幀的資料,但是并不知道它是什麼幀,是以264在設計的時候,在分隔符之後又增加了兩位來表示幀類型,比如0x 0000 0001 65表示I幀。

那把I幀和P幀拿到之後能夠解碼出畫面呢?

答案是不能。因為還需要解碼參數。

解碼參數就是sps,pps裡面存儲的資訊。

碼流中是按照I幀,P幀,B幀。。。。這樣的順序傳輸過來的,但是實際上畫面是I幀,B幀,B幀,P幀,這樣的順序。是以,解碼時候,首先解碼I幀渲染出畫面,然後解碼P幀,但是P幀的畫面并不能立刻播放出來,而是需要去解碼B幀,B幀畫面出來之後才播放P幀畫面出來。這是怎麼保證這個順序的呢?碼流中有一個pts參數,這是一個按照幀播放順序遞增的資料。

也就是說I幀傳輸過來,解析出來,就播放了,然後P幀傳輸過來也給它解析出來了,但是得讓P幀等一等,按視訊順序播放了B幀之後再把P幀播放出來。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

新的問題來了,首先生成了I幀,然後相似程度極高的第二幀畫面,第三幀畫面。。。相似程度都在95%以上,都生成了B幀,直到相似程度低于95%生成P幀。問題是,B幀是什麼時候輸出到H264碼流中的?

生成了B幀不會立刻輸出到碼流中,因為B幀非常小,會緩存在傳輸緩沖器中,直到有P幀生成傳輸到碼流之後才會從傳輸緩沖區拿出所有緩存的B幀,傳輸到碼流。

視訊倒放特效是怎麼實作的呢?

其實就是,首先按照正序解碼出來,然後倒序重新進行編碼,編碼出新的檔案,編碼比較耗時,是以選擇了倒序播放會需要等待一小會兒。

I幀儲存了所有宏塊的資料。

是以,檔案的大小和宏塊大小有關系,也和I幀數量有關系。

短視訊、電影中I幀是比較少的;

直播中I幀是相對比較多的;

但是直播中I幀變多就會導緻視訊流變大,直播中對盡可能的低帶寬小資料量傳輸也是迫切的,是以,增多I幀以後還是需要優化,怎麼優化,降低幀率,普通視訊的幀率在30幀左右,但是直播的幀率一般在10-15幀。這樣就保證了直播的流暢性又保證了直播視訊秒開。

GOP

兩個I幀之間的幀就是GOP。兩個I幀之間的序列,在一個圖像序列中隻有一個I幀。

所有的視訊檔案的第一幀永遠是I幀。不可能是P幀也不可能是B幀。

變換了場景之後,肯定會産生一個I幀。

短視訊的GOP一般都比較大,在200-800之間,但是直播的GOP都比較小。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

可以通過雷霄華的分析工具進行分析運動矢量:

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

短視訊中的極快極慢特效是怎麼實作,是咋樣一個原理呢?

其實,

極慢的實作原理就是視訊以高幀率錄制,比如60幀錄制,正常幀率播放,比如30幀播放,就實作了慢動作;

極快的實作原理就是,正常幀率錄制,比如25幀錄制,高幀率播放,比如75幀播放,就可以實作3倍速播放。

音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265
音視訊基礎1:H264、H265、MPEG-4、VP8、VP9編碼基礎知識個人認知,程式員職業發展出路編碼器發展史編碼原理H264H265

繼續閱讀