iOS視頻編碼技術(shù)

為什么進(jìn)行壓縮編碼?

  • 視頻是由一幀幀的圖像組成(見實(shí)例)

    • 比如一張Gif圖片其實(shí)就可以被分解成若干張單獨(dú)的圖片


      image.png
  • 分別出的圖片


    image.png
  • 未經(jīng)壓縮的視頻的數(shù)據(jù)量巨大

    • 比如:錄音一分鐘視頻, 需要多大的空間來保存了?
    • 1> 為了不讓用戶感受到卡頓效果, 1秒鐘之內(nèi)至少需要16幀畫面(正常開發(fā)通常會(huì)采集30幀)
    • 2> 假如該視頻是一個(gè)1280*720分辨率的視頻(正常情況下會(huì)比這個(gè)大很多)
    • 結(jié)果:128072016*60≈843.75M
    • 如果幀率更高芜飘、分辨率更高、加上音頻,那么一分鐘的視頻是多大呢?
  • 結(jié)論:

    • 不經(jīng)過壓縮編碼的視頻,根本沒辦法保存,更何況網(wǎng)絡(luò)中的傳輸
    • 視頻錄制完成后,要先編碼焰轻,再傳輸,在解碼昆雀,再播放(重現(xiàn))

為什么視頻可以壓縮編碼辱志?

  • 存在冗余信息

    • 空間冗余:圖像相鄰像素之間有較強(qiáng)的相關(guān)性
    • 時(shí)間冗余:視頻序列的相鄰圖像之間內(nèi)容相似
    • 視覺冗余:人的視覺系統(tǒng)對(duì)某些細(xì)節(jié)不敏感
    • 等等冗余信息
  • 空間冗余

    • 空間冗余是指在同一張圖像中,有很多像素點(diǎn)表示的信息是完全一樣的
    • 如果對(duì)每一個(gè)像素進(jìn)行單獨(dú)的存儲(chǔ)狞膘,必然會(huì)非常浪費(fèi)空間揩懒,也完全沒有必要
    • 如圖:


      image.png
  • 時(shí)間冗余

  • 時(shí)間冗余是指多張圖像之間,有非常多的相關(guān)性挽封,由于一些小運(yùn)動(dòng)造成了細(xì)小差別

  • 如果對(duì)每張圖像進(jìn)行單獨(dú)的像素存儲(chǔ)已球,在下一張圖片中又出現(xiàn)了相同的。那么相當(dāng)于很多像素都存儲(chǔ)了多份辅愿,必然會(huì)非常浪費(fèi)空間智亮,也是完全沒有必要的

  • 如圖:


    image.png
  • 視覺冗余

    • 人類視覺系統(tǒng)HVS
    • 對(duì)高頻信息不敏感
    • 對(duì)高對(duì)比度更敏感
    • 對(duì)亮度信息比色度信息更敏感
    • 對(duì)運(yùn)動(dòng)的信息更敏感
  • 數(shù)字視頻系統(tǒng)的設(shè)計(jì)應(yīng)該考慮HVS的特點(diǎn):

    • 丟棄高頻信息,只編碼低頻信息
    • 提高邊緣信息的主觀質(zhì)量
    • 降低色度的解析度
    • 對(duì)感興趣區(qū)域(Region of Interesting点待,ROI)進(jìn)行特殊處理
  • 如圖:


    image.png
  • 結(jié)論:

    • 經(jīng)過一系列的去處冗余信息阔蛉,可以大大的降低視頻的數(shù)據(jù)量
    • 更利于視頻的保存、傳輸
    • 去除冗余信息的過程癞埠,我們就稱之為壓縮編碼

壓縮編碼的標(biāo)準(zhǔn)

  • 為什么需要視頻壓縮編碼標(biāo)準(zhǔn)
    • 目前状原,我們已經(jīng)非常清楚,視頻在存儲(chǔ)&傳輸過程中苗踪,存在非常多的冗余信息颠区,我們需要去除這些冗余信息
    • 但是,如果每個(gè)人按照自己的方式去編碼徒探,那么當(dāng)我們需要還原原始數(shù)據(jù)時(shí)瓦呼,很難知道對(duì)方是如何編碼的
    • 比如:某主播在斗魚采用iPhone手機(jī)進(jìn)行直播喂窟,手機(jī)錄制了主播大量的畫面测暗,為了便于傳輸,需要程序?qū)σ曨l進(jìn)行壓縮編碼磨澡,但是他想當(dāng)然的按照自己的某種算法進(jìn)行了壓縮碗啄,并且將數(shù)據(jù)傳遞給了服務(wù)器,服務(wù)器拿到數(shù)據(jù)之后稳摄,進(jìn)行數(shù)據(jù)分發(fā)給了各個(gè)客戶端:Android稚字、iOS概作、Win、Web勉耀、Mac等等客戶端醋粟,這個(gè)時(shí)候每個(gè)客戶端需要知道對(duì)方的壓縮算法,才能將數(shù)據(jù)進(jìn)行還原昌讲,但是因?yàn)楫?dāng)時(shí)客戶端是想當(dāng)然的就行壓縮編碼的国夜,并且也不能保證他的方式效率,而且有一點(diǎn)誤差可能會(huì)造成畫面無(wú)法還原的后果短绸。
    • 因此车吹,視頻編碼必須制定一個(gè)大家都認(rèn)同的標(biāo)準(zhǔn)
  • 標(biāo)準(zhǔn)化組織:
    • ITU:International Telecommunications Union VECG:Video Coding Experts Group(國(guó)際電傳視訊聯(lián)盟)
    • ISO:International Standards Organization MPEG:Motion Picture Experts Group(國(guó)際標(biāo)準(zhǔn)組織機(jī)構(gòu))
  • H.26X系列(由ITU[國(guó)際電傳視訊聯(lián)盟]主導(dǎo))
    • H.261:主要在老的視頻會(huì)議和視頻電話產(chǎn)品中使用
    • H.263:主要用在視頻會(huì)議、視頻電話和網(wǎng)絡(luò)視頻上
    • H.264:H.264/MPEG-4第十部分醋闭,或稱AVC(Advanced Video Coding窄驹,高級(jí)視頻編碼),是一種視頻壓縮標(biāo)準(zhǔn)证逻,一種被廣泛使用的高精度視頻的錄制乐埠、壓縮和發(fā)布格式。
    • H.265:高效率視頻編碼(High Efficiency Video Coding囚企,簡(jiǎn)稱HEVC)是一種視頻壓縮標(biāo)準(zhǔn)饮戳,H.264/MPEG-4 AVC的繼任者《床Γ可支持4K分辨率甚至到超高畫質(zhì)電視扯罐,最高分辨率可達(dá)到8192×4320(8K分辨率),這是目前發(fā)展的趨勢(shì)烦衣,尚未有大眾化編碼軟件出現(xiàn)
  • MPEG系列(由ISO[國(guó)際標(biāo)準(zhǔn)組織機(jī)構(gòu)]下屬的MPEG[運(yùn)動(dòng)圖象專家組]開發(fā))
    • MPEG-1第二部分:MPEG-1第二部分主要使用在VCD上歹河,有些在線視頻也使用這種格式
    • MPEG-2第二部分(MPEG-2第二部分等同于H.262,使用在DVD花吟、SVCD和大多數(shù)數(shù)字視頻廣播系統(tǒng)中
    • MPEG-4第二部分(MPEG-4第二部分標(biāo)準(zhǔn)可以使用在網(wǎng)絡(luò)傳輸秸歧、廣播和媒體存儲(chǔ)上。 *
  • 其他系列:
    • AMV · AVS · Bink · RealVideo · Theora · VC-1 · VP3 · VP6 · VP7 · VP8 · VP9 · WMV

編碼的常見流程

  • 在進(jìn)行當(dāng)前信號(hào)編碼時(shí)衅澈,編碼器首先會(huì)產(chǎn)生對(duì)當(dāng)前信號(hào)做預(yù)測(cè)的信號(hào)键菱,稱作預(yù)測(cè)信號(hào)(predicted signal)
  • 預(yù)測(cè)的方式:
    • 時(shí)間上的預(yù)測(cè)(interprediction),亦即使用先前幀的信號(hào)做預(yù)測(cè)
      +空間上的預(yù)測(cè) (intra prediction)今布,亦即使用同一張幀之中相鄰像素的信號(hào)做預(yù)測(cè)
    • 得到預(yù)測(cè)信號(hào)后经备,編碼器會(huì)將當(dāng)前信號(hào)與預(yù)測(cè)信號(hào)相減得到殘余信號(hào)(residual signal),并只對(duì)殘余信號(hào)進(jìn)行編碼
    • 如此一來部默,可以去除一部份時(shí)間上或是空間上的冗余信息
  • 編碼器并不會(huì)直接對(duì)殘余信號(hào)進(jìn)行編碼侵蒙,而是先將殘余信號(hào)經(jīng)過變換(通常為離散余弦變換)然后量化以進(jìn)一步去除空間上和感知上的冗余信息
  • 量化后得到的量化系數(shù)會(huì)再透過熵編碼,去除統(tǒng)計(jì)上的冗余信息

目前應(yīng)用最廣泛的H.264(AVC)

  • H264是新一代的編碼標(biāo)準(zhǔn)傅蹂,以高壓縮高質(zhì)量和支持多種網(wǎng)絡(luò)的流媒體傳輸著稱
  • 個(gè)人理解:
    • 在相鄰幾幅圖像畫面中纷闺,一般有差別的像素只有10%以內(nèi)的點(diǎn),亮度差值變化不超過2%算凿,而色度差值的變化只有1%以內(nèi)
    • 所以對(duì)于一段變化不大圖像畫面,我們可以先編碼出一個(gè)完整的圖像幀A犁功,隨后的B幀就不編碼全部圖像氓轰,只寫入與A幀的差別,這樣B幀的大小就只有完整幀的1/10或更薪浴戒努!
    • B幀之后的C幀如果變化不大,我們可以繼續(xù)以參考B的方式編碼C幀镐躲,這樣循環(huán)下去储玫。
    • 這段圖像我們稱為一個(gè)序列:序列就是有相同特點(diǎn)的一段數(shù)據(jù)
    • 當(dāng)某個(gè)圖像與之前的圖像變化很大,無(wú)法參考前面的幀來生成萤皂,那我們就結(jié)束上一個(gè)序列撒穷,開始下一段序列
    • 也就是對(duì)這個(gè)圖像生成一個(gè)完整幀A1,隨后的圖像就參考A1生成裆熙,只寫入與A1的差別內(nèi)容端礼。
  • 在H264協(xié)議里定義了三種幀
    • I幀:完整編碼的幀叫I幀
    • P幀:參考之前的I幀生成的只包含差異部分編碼的幀叫P幀
    • B幀:參考前后的幀編碼的幀叫B幀
  • H264采用的核心算法是幀內(nèi)壓縮和幀間壓縮
    幀內(nèi)壓縮是生成I幀的算法
    幀間壓縮是生成B幀和P幀的算法
  • H264的壓縮方法:
    • 分組:把幾幀圖像分為一組(GOP,也就是一個(gè)序列),為防止運(yùn)動(dòng)變化,幀數(shù)不宜取多
    • 定義幀:將每組內(nèi)各幀圖像定義為三種類型,即I幀入录、B幀和P幀;
    • 預(yù)測(cè)幀:以I幀做為基礎(chǔ)幀,以I幀預(yù)測(cè)P幀,再由I幀和P幀預(yù)測(cè)B幀;
    • 數(shù)據(jù)傳輸:最后將I幀數(shù)據(jù)與預(yù)測(cè)的差值信息進(jìn)行存儲(chǔ)和傳輸蛤奥。
  • 序列(GOP)
  • 在H264中圖像以序列為單位進(jìn)行組織,一個(gè)序列是一段圖像編碼后的數(shù)據(jù)流僚稿。
  • 一個(gè)序列的第一個(gè)圖像叫做 IDR 圖像(立即刷新圖像)凡桥,IDR 圖像都是 I 幀圖像。
    • H.264 引入 IDR 圖像是為了解碼的重同步蚀同,當(dāng)解碼器解碼到 IDR 圖像時(shí)缅刽,立即將參考幀隊(duì)列清空,將已解碼的數(shù)據(jù)全部輸出或拋棄蠢络,重新查找參數(shù)集衰猛,開始一個(gè)新的序列。
    • 這樣刹孔,如果前一個(gè)序列出現(xiàn)重大錯(cuò)誤啡省,在這里可以獲得重新同步的機(jī)會(huì)。
    • IDR圖像之后的圖像永遠(yuǎn)不會(huì)使用IDR之前的圖像的數(shù)據(jù)來解碼髓霞。
  • 一個(gè)序列就是一段內(nèi)容差異不太大的圖像編碼后生成的一串?dāng)?shù)據(jù)流
    • 當(dāng)運(yùn)動(dòng)變化比較少時(shí)卦睹,一個(gè)序列可以很長(zhǎng),因?yàn)檫\(yùn)動(dòng)變化少就代表圖像畫面的內(nèi)容變動(dòng)很小酸茴,所以就可以編一個(gè)I幀分预,然后一直P幀、B幀了薪捍。
    • 當(dāng)運(yùn)動(dòng)變化多時(shí),可能一個(gè)序列就比較短了,比如就包含一個(gè)I幀和3酪穿、4個(gè)P幀凳干。
  • 在視頻編碼序列中,GOP即Group of picture(圖像組)被济,指兩個(gè)I幀之間的距離
  • I幀救赐、P幀、B幀的預(yù)測(cè)方向


    image.png
  • I幀只磷、P幀经磅、B幀實(shí)際順序&編碼后順序


    image.png

    image.png

H264分層設(shè)計(jì)

  • 分層設(shè)計(jì)
    • H264算法在概念上分為兩層:視頻編碼層(VCL:Video Coding Layer)負(fù)責(zé) 高效的視頻內(nèi)容表示,網(wǎng)絡(luò)提取層(NAL:Network Abstraction Layer)負(fù)責(zé)以網(wǎng)絡(luò)所要求的恰當(dāng)?shù)姆绞綄?duì)數(shù)據(jù)進(jìn)行打包和傳送钮追。
    • 這樣预厌,高效編碼和網(wǎng)絡(luò)友好性分別由VCL和NAL分別完成
    • 而之前我們學(xué)習(xí)的編碼方式,都是屬于VCL層
  • NAL設(shè)計(jì)目的:
    • 根據(jù)不同的網(wǎng)絡(luò)把數(shù)據(jù)打包成相應(yīng)的格式元媚,將VCL產(chǎn)生的比特字符串適配到各種各樣的網(wǎng)絡(luò)和多元環(huán)境中轧叽。
  • NAL的封裝方式:
    • NAL是將每一幀數(shù)據(jù)寫入到一個(gè)NAL單元中,進(jìn)行傳輸或存儲(chǔ)的
    • NALU分為NAL頭和NAL體
    • NALU頭通常為00 00 00 01刊棕,作為一個(gè)新的NALU的起始標(biāo)識(shí)
    • NALU體封裝著VCL編碼后的信息或者其他信息
  • 封裝過程:
    • I幀炭晒、P幀、B幀都是被封裝成一個(gè)或者多個(gè)NALU進(jìn)行傳輸或者存儲(chǔ)的
    • I幀開始之前也有非VCL的NAL單元甥角,用于保存其他信息网严,比如:PPS、SPS
    • PPS(Picture Parameter Sets):圖像參數(shù)集
    • SPS(Sequence Parameter Set):序列參數(shù)集
    • 在實(shí)際的H264數(shù)據(jù)幀中嗤无,往往幀前面帶有00 00 00 01 或 00 00 01分隔符屿笼,一般來說編碼器編出的首幀數(shù)據(jù)為PPS與SPS,接著為I幀翁巍,后續(xù)是B幀驴一、P幀等數(shù)據(jù)


      image.png

編碼方式

  • 編碼的方式有兩種:
    • 硬編碼:使用非CPU進(jìn)行編碼,如顯卡GPU灶壶、專用的DSP肝断、FPGA、ASIC芯片等
    • 軟編碼:使用CPU進(jìn)行編碼驰凛,軟編碼通常使用:ffmpeg+x264
    • ffmpeg:是一套開源的胸懈、用于對(duì)音視頻進(jìn)行編碼&解碼&轉(zhuǎn)化計(jì)算機(jī)程序
    • x264:x264是一種免費(fèi)的、開源的恰响、具有更優(yōu)秀算法的H.264/MPEG-4 AVC視頻壓縮編碼方式
  • 對(duì)比:(沒有對(duì)比就沒有傷害)
    • 軟編碼:實(shí)現(xiàn)直接趣钱、簡(jiǎn)單,參數(shù)調(diào)整方便胚宦,升級(jí)易首有,但CPU負(fù)載重燕垃,性能較硬編碼低
    • 性能高,對(duì)CPU沒有壓力井联,但是對(duì)其他硬件要求較高(如GPU等)
  • iOS中編碼方式:
    • 在iOS8之前卜壕,蘋果并沒有開放硬編碼的接口,所以只能采用ffpeng+x624進(jìn)行軟編碼
    • 在iOS8之后烙常,蘋果開放了接口轴捎,并且封裝了VideoToolBox&AudioToolbox兩個(gè)框架,分別用于對(duì)視頻&音頻進(jìn)行硬編碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚕脏,一起剝皮案震驚了整個(gè)濱河市侦副,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驼鞭,老刑警劉巖秦驯,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異终议,居然都是意外死亡汇竭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門穴张,熙熙樓的掌柜王于貴愁眉苦臉地迎上來细燎,“玉大人,你說我怎么就攤上這事皂甘〔Wぃ” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵偿枕,是天一觀的道長(zhǎng)璧瞬。 經(jīng)常有香客問我,道長(zhǎng)渐夸,這世上最難降的妖魔是什么嗤锉? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮墓塌,結(jié)果婚禮上瘟忱,老公的妹妹穿的比我還像新娘。我一直安慰自己苫幢,他們只是感情好访诱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著韩肝,像睡著了一般触菜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哀峻,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天涡相,我揣著相機(jī)與錄音哲泊,去河邊找鬼。 笑死漾峡,一個(gè)胖子當(dāng)著我的面吹牛攻旦,可吹牛的內(nèi)容都是我干的喻旷。 我是一名探鬼主播生逸,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼且预!你這毒婦竟也來了槽袄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锋谐,失蹤者是張志新(化名)和其女友劉穎遍尺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涮拗,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乾戏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了三热。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼓择。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖就漾,靈堂內(nèi)的尸體忽然破棺而出呐能,到底是詐尸還是另有隱情,我是刑警寧澤抑堡,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布摆出,位于F島的核電站,受9級(jí)特大地震影響首妖,放射性物質(zhì)發(fā)生泄漏偎漫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一有缆、第九天 我趴在偏房一處隱蔽的房頂上張望象踊。 院中可真熱鬧,春花似錦妒貌、人聲如沸通危。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)菊碟。三九已至,卻和暖如春在刺,著一層夾襖步出監(jiān)牢的瞬間逆害,已是汗流浹背头镊。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魄幕,地道東北人相艇。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纯陨,于是被迫代替她去往敵國(guó)和親坛芽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 為什么進(jìn)行壓縮編碼? 視頻是由一幀幀的圖像組成(見實(shí)例)比如一張Gif圖片其實(shí)就可以被分解成若干張單獨(dú)的圖片1.g...
    Tate_code閱讀 971評(píng)論 0 3
  • 前言 為什么需要視頻編碼呢翼抠?比如當(dāng)前屏幕是1280*720一秒30張圖片.那么我們一秒的視頻數(shù)據(jù)是1280 * 7...
    Leon_520閱讀 1,978評(píng)論 0 6
  • 一咙轩、為什么要進(jìn)行視頻編碼 未經(jīng)壓縮的視頻的數(shù)據(jù)量巨大,錄制一分鐘視頻, 需要多大的空間來保存了? 1> 為了不讓用...
    cjy027閱讀 10,757評(píng)論 7 31
  • ### YUV顏色空間 視頻是由一幀一幀的數(shù)據(jù)連接而成阴颖,而一幀視頻數(shù)據(jù)其實(shí)就是一張圖片活喊。 yuv是一種圖片儲(chǔ)存格式...
    天使君閱讀 3,249評(píng)論 0 4
  • 視頻編碼介紹 為什么進(jìn)行壓縮編碼? 視頻是由一幀幀的圖像組成(見實(shí)例)比如一張Gif圖片其實(shí)就可以被分解成若干張單...
    coderwhy閱讀 2,295評(píng)論 3 15