音視頻學習從零到整-瞭解視頻編碼與VideoToolBox框架

做者:CC老師_HelloCoder 原文地址:www.jianshu.com/p/c70c061b8…算法

一..瞭解VideoToolBox 硬編碼

VideoToolBox 官方文檔緩存

在iOS4.0,蘋果就已經支持硬編碼.可是硬編碼在當時屬於私有API. 不提供給開發者使用 在2014年的WWDC大會上,iOS 8.0 以後,蘋果開放了硬解碼和硬解碼的API。就是VideoToolbox.framework的API。VideoToolbox 是一套純C語言API。其中包含了不少C語言函數網絡

VideoToolBox實際上屬於低級框架,它是能夠直接訪問硬件編碼器和解碼器.它存在於視頻壓縮和解壓縮以及存儲在像素緩存區中的數據轉換提供服務.app

硬編碼的優勢:提升性能、增長效率、延長電量的使用框架

這個框架在音視頻項目開發中,也是會要頻繁使用的.若是你們有想法去從事音視頻的開發.那麼這個框架將會是你學習的一個重點.ide

二.瞭解視頻

做爲開發者和產品測試之間的斡旋.是不可避免的.這是我們在作開發過程當中,但仍是 要去思考.究竟是需求不合理仍是咱們對這個需求的沒有把握.函數

在前面我說過,5G時代的到來,勢必會對移動互聯網的衝擊將會是最刺激的.爲什麼?一旦網絡速度+設備的運行速度不受限制時,設想移動設備的暫時不可替代性是否是又更加的明顯了.至少在目前爲止,沒有一款硬件能夠替代手機設備在用戶的地位.性能

那咱們來了解一下視頻的常規知識.只有在瞭解視頻的本質,你纔有可能面對需求應對自如.學習

2.1 視頻的構成:

  • 圖像
  • 音頻
  • 元信息

圖像: 視頻內容自己就是一幀一幀的圖片構成.人眼只要1秒鐘連續播放16張以上的圖片,就會認爲這是一段連貫的視頻.這種物理現象叫視覺暫留.測試

音頻: 視頻必定是由音頻+圖像內容構成的.因此音頻在視頻中是單獨的一個部分.針對這一塊咱們須要單獨編碼的.

**元信息:**元信息其實就是描述信息的信息.用於描述信息的結構\語義\用途\用法等.好比視頻元信息就包含了視頻的具體信息,好比編碼格式,分辨率等等.

2.2 視頻中的編碼格式

  • 視頻編碼格式

    • H264編碼的優點:
      • 低碼率
      • 高質量的圖像
      • 容錯能力強
      • 網絡適應性強
    • 總結: H264最大的優點,具備很高的數據壓縮比率,在同等圖像質量下,H264的壓縮比是MPEG-2的2倍以上,MPEG-4的1.5~2倍.
    • 舉例: 原始文件的大小若是爲88GB,採用MPEG-2壓縮標準壓縮後變成3.5GB,壓縮比爲25∶1,而採用H.264壓縮標準壓縮後變爲879MB,從88GB到879MB,H.264的壓縮比達到驚人的102∶1
  • 音頻編碼格式:

    • AAC是目前比較熱門的有損壓縮編碼技術,而且衍生了LC-AAC,HE-AAC,HE-AAC v2 三種主要編碼格式.

      • LC-AAC 是比較傳統的AAC,主要應用於中高碼率的場景編碼(>= 80Kbit/s)
      • HE-AAC 主要應用於低碼率場景的編碼(<= 48Kbit/s)
    • 優點:在小於128Kbit/s的碼率下表現優異,而且多用於視頻中的音頻編碼

    • 適合場景:於128Kbit/s如下的音頻編碼,多用於視頻中的音頻軌的編碼

2.3 容器(視頻封裝格式)

**封裝格式:**就是將已經編碼壓縮好的視頻數據 和音頻數據按照必定的格式放到一個文件中.這個文件能夠稱爲容器. 固然能夠理解爲這只是一個外殼.

一般咱們不只僅只存放音頻數據和視頻數據,還會存放 一下視頻同步的元數據.例如字幕.這多種數據會不一樣的程序來處理,可是它們在傳輸和存儲的時候,這多種數據都是被綁定在一塊兒的.

  • 常見的視頻容器格式:
    • AVI: 是當時爲對抗quicktime格式(mov)而推出的,只能支持固定CBR恆定定比特率編碼的聲音文件
    • MOV:是Quicktime封裝
    • WMV:微軟推出的,做爲市場競爭
    • mkv:萬能封裝器,有良好的兼容和跨平臺性、糾錯性,可帶外掛字幕
    • flv: 這種封裝方式能夠很好的保護原始地址,不容易被下載到,目前一些視頻分享網站都採用這種封裝方式
    • MP4:主要應用於mpeg4的封裝,主要在手機上使用。

三.視頻壓縮的可能性

視頻壓縮,該從那幾個方向去進行數據的壓縮了? 實際上壓縮的本質都是從冗餘信息開始出發壓縮的. 而視頻數據之間是有極強的相關性.也就是這樣會產生大量的冗餘信息.這樣的冗餘包括空間上的冗餘信息和時間上的冗餘信息.

  • 使用幀間編碼技術能夠去除時間上的冗餘信息,具體包括以下
    • 運動補償: 運動補償是經過先前的局部圖形來預測,補償當前的局部圖像.它是減小幀序列冗餘信息頗有效的方法.
    • 運動表示: 不一樣區域的圖像須要使用不一樣的運動矢量來描述運動信息
    • 運動估計: 運動估計就是從視頻序列中抽取運動信息的一整套技術.

3.1 編碼概念

IPB幀 視頻壓縮中,每幀表明着一副靜止的圖像.而進行實際壓縮時,會採用各類算法以減小數據的容量.其實IPB幀是最經常使用的一種方式:

  • I幀: 幀內編碼幀(intra picture),I幀一般是每一個GOP(MPEG所使用的一種視頻壓縮技術)的第一幀.通過適度的壓縮.做爲隨機訪問的參考點,能夠當作靜態圖像.I幀能夠看作一個圖像通過壓縮後的產物.I幀壓縮能夠獲得6:1的壓縮比而不會產生任何可察覺的模糊現象.I幀壓縮去除了視頻空間的冗餘信息.
  • P幀: 先後預測編碼幀(predictive-frame),經過將圖像序列中前面已編碼幀的時間冗餘信息充分去除來壓縮傳輸數據量的編碼圖像.
  • B幀: 雙向預測編碼幀(bi-directional interpolated prediction frame),既要考慮源圖像序列前面已編碼幀,又要顧及源圖像序列後面的已編碼幀之間的時間冗餘信息,來壓縮傳輸數據量的編碼圖像.

讀者角度解讀

若是從編碼的角度,獲取咱們順序思考會存在難度.但若是咱們從解碼的角度來思考就顯得不是那麼不可理解了.

  • I幀,自身能夠經過視頻解碼算法解壓成一張單獨的完整的視頻畫面.因此I幀去掉的是視頻幀在空間維度上的冗餘信息.
  • P幀,須要參考前面的一個I幀或P幀解碼成一個完整的視頻畫面
  • B幀,須要參考前面的一個I幀或者P幀以及後面的一個P幀來生成一個完整的視頻畫面.
  • 因此,P和B幀去掉的視頻幀在時間上維度上的冗餘信息.

3.2 解碼中PTS 與 DTS

DTS(Decoding Time Stamp),主要用於視頻的解碼; PTS(Presentation Time Stamp),主要用於解碼節點進行視頻的同步和輸出.

在沒有B幀的狀況下,DTS和PST的輸出順序是同樣的.由於B幀會打亂了解碼和顯示順序.因此一旦存在B幀,PTS和DTS勢必會不一樣.實際上在大多數編解碼標準中,編碼順序和輸入順序並不一致.因而須要PTS和DST這2種不一樣的時間戳.

3.3 GOP概念

兩個I幀之間造成的一組圖片,就是GOP(Group of Picture). 一般在編碼器設置參數時,必須會設置gop_size的值.其實就是表明2個I幀之間的幀數目. 在一個GOP組中容量最大的就是I幀.因此相對而言,gop_size設置的越大,整個視頻畫面質量就會越好.可是解碼端必須從接收的第一個I幀開始才能夠正確解碼出原始圖像.不然沒法正確解碼.

相關文章
相關標籤/搜索