播放視頻檔案流程圖

H264概述
對攝像頭采集的每一幀視頻需要進行編碼,由于視頻中存在空間和時間的冗余,需要用演算法來去除這些冗余,H264是專門去除這些冗余的演算法,我們把這種演算法稱為H264編碼,視頻壓縮演算法來壓縮視頻的占用空間,提高存盤和傳輸的效率,在獲得有效的壓縮效果的同時,使得壓縮程序引起的失真最小,
視頻壓縮演算法是通過去除時間、空間的冗余來實作的,在一段時間內,相鄰的影像的像素、亮度與色溫的差別很小,我們沒比要對每一個影像進行完成的編碼,而是可以選取這段時間的第一張圖(也就是第一幀)作為完整的編碼,而后面一段時間的影像只需要記錄與第一張圖(第一幀)在像素、亮度、色溫等方面的差別資料即可,通過去除不同型別的冗余,可以明顯的壓縮資料,代價就是一部分資訊失真,
封裝格式
封裝格式(也叫容器),就是將已經編碼壓縮好的視頻軌和音頻軌按照一定的格式放到一個檔案中,也就是說僅僅是一個外殼,或者把它當成一個放視頻軌和音頻軌的檔案夾也可以,說得通俗點,視頻軌相當于飯,而音頻軌相當于菜,封裝格式就是一個碗,或者一個鍋,用來盛放飯菜的容器, 下面是幾種常用的視頻檔案后綴型別與其相對應的封裝格式,
視頻檔案封裝格式

H264基本單元
在H.264定義的結構中,一個視頻影像編碼后的資料叫做一幀, 一幀是由一個或多個片(slice)組成的,一個片是由一個或多個宏塊(MB)組成的(宏塊是H264編碼的基本單位),一個宏塊是由16x16的yuv資料組成的,
H264幀型別
在H.264的協議中,定義了三類幀,分別是I幀、B幀和P幀,其中I幀就是一個完整的影像幀,而B幀和P幀對應的就是之前說的不對全部影像做編碼的幀,B幀和P幀的差別在于,P幀是參考之前的I幀生成的,B幀是參考前后的影像幀生成的,
在視頻畫面播放程序中,若I幀丟失了,則后面的P幀也就隨著解不出來,就會出現視頻畫面黑屏的現象;若P幀丟失了,則視頻畫面會出現花屏、馬賽克等現象,
H264中的 I幀、P幀和B幀
H264 使用幀內壓縮和幀間壓縮的方式提高編碼壓縮率;H264采用了獨特的 I幀,P幀和B幀策略來實作,連續幀之間的壓縮,

I幀:可以看成是一個影像經過壓縮后的產物,自身可以通過視頻解壓演算法解壓成一張單獨的完整的圖片,
P幀:需要參考其前面的一個I frame 或者P frame來生成一張完整的圖片,
B幀:要參考其前一個I或者P幀及其后面的一個P幀來生成一張完整的圖片,
GOP(畫面組)
一個GOP(Group Of Picture)就是一組連續的畫面,GOP結構一般有兩個數字,其中一個是GOP的長度(即兩個I幀之間的B幀和P幀數),另一個數字為I幀和P幀之間的間隔距離(即B幀數),在一個GOP內I幀解碼不依賴任何的其它幀,P幀解碼則依賴前面的I幀或P幀,B幀解碼依賴前面的I幀或P幀及其后最近的一個P幀,
例子:
格式設定GOP:M = 1 , N = 30;
M值表示I幀或者P幀之間的幀數目,N值表示GOP的長度,如上圖所示M = 1,則表示兩個P幀相差1幀(無B幀),N = 30, 則表示GOP長度為30.

IDR 幀
GOP中的I幀又分為普通I幀和IDR幀,IDR幀可以認為是首個I幀(但是很多場景I幀都是IDR幀),這樣區分視為了方便控制編碼和解碼的流程, IDR幀一定是I幀,但是I幀不一定是IDR幀,
IDR幀因為附帶SPS、PPS等資訊,解碼器在收到 IDR 幀時,需要做的作業就是:把所有的 PPS 和 SPS 引數進行更新,
SPS是序列引數集,包含的是針對一連續編碼視頻序列的引數,如識別符號 seq_parameter_set_id、幀數及 POC 的約束、參考幀數目、解碼影像尺寸和幀場編碼模式選擇標識等等,
PPS是影像引數集,對應的是一個序列中某一幅影像或者某幾幅影像,其引數如識別符號 pic_parameter_set_id、可選的 seq_parameter_set_id、熵編碼模式選擇標識、片組數目、初始量化引數和去方塊濾波系數調整標識等等,
可以看出來IDR幀的作用是讓解碼器立刻重繪相關資料資訊,避免出現較大的解碼錯誤問題,
引入IDR幀機制是為了解碼的重同步,當解碼器解碼到 IDR幀時,立即將參考幀佇列清空,將已解碼的資料全部輸出或拋棄,重新查找引數集,開始一個新的序列,這樣,如果前一個序列出現錯誤,在這里可以獲得重新同步的機會,IDR幀之后的幀永遠不會使用IDR幀之前的資料來解碼,
H264壓縮方式
H264 的核心壓縮演算法是幀內壓縮和幀間壓縮,幀內壓縮是生成I幀的演算法,幀間壓縮是生成B幀和P幀的演算法,
幀內(Intraframe)壓縮的原理是:當壓縮一幀影像時,僅考慮本幀的資料而不考慮相鄰幀之間的冗余資訊,一般采用有損壓縮演算法,由于幀內壓縮是編碼一個完整的影像,所以可以獨立的解碼、顯示,幀內壓縮率一般不高,
幀間(Interframe)壓縮的原理是:相鄰幾幀的資料有很大的相關性,或者說前后兩幀資訊變化很小的特點,連續的視頻其相鄰幀之間具有冗余資訊,根據這一特性,壓縮相鄰幀之間的冗余量就可以進一步提高壓縮量,減小壓縮比,
而幀間壓縮也稱為時間壓縮(Temporalcompression),它通過比較時間軸上不同幀之間的資料進行壓縮,幀間壓縮是無損的,它通過比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,這樣可以大大減少資料量,
H264編碼層次
H264除了實作對視頻的壓縮處理外,為了方便網路傳輸,還提供了對應的視頻編碼和分片策略,類似網路資料幀封裝成IP幀,在H264中將其稱為組(GOP,group of picture)、片(slice)、宏塊(Macroblock),它們一起組成了H264的碼流分層結構,H264將其組織成為序列(GOP)、圖片(pictrue)、片(Slice)、宏塊(Macroblock)、子塊(subblock)五個層次,

H264壓縮方式說明
1、分組,也就是將一系列變換不大的影像歸為一個組,即一個GOP;
2、定義幀,將每組的影像幀歸分為I幀、P幀和B幀三種型別;
3、預測幀, 以I幀做為基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;
4、資料傳輸, 最后將I幀資料與預測的差值資訊進行存盤和傳輸,
H264分層結構
H264的主要目標是為了有高的視頻壓縮比和良好的網路親和性,H264將系統框架分為兩個層面,分別是視頻編碼層面(VCL)和網路抽象層面(NAL)
VLC層(Video Coding Layer)
VLC層:包括核心壓縮引擎和塊,宏塊和片的語法級別定義,設計目標是盡可能地獨立于網路進行高效的編碼;
NAL層(Network Abstraction Layer)
NAL層:負責將VCL產生的位元字串適配到各種各樣的網路和多元環境中,覆寫了所有片級以上的語法級別,
NALU(NAL Unit)
H.264原始碼流(裸流)是由一個接一個NALU組成, 每個NALU之間都使用start code(起始碼)分隔,NALU單元通常由[StartCode] [NALU Header] [NALU Payload] 三部分組成,其中 Start Code 用于標示這是一個NALU 單元的開始,必須是"00 00 00 01" 或"00 00 01",每個 NALU包括一個頭部資訊(NAL header)和一個原始位元組序列負荷(RBSP),

Start Code(1位元組)
Start Code 用于標示這是一個NALU 單元的開始,必須是”00 00 00 01” 或”00 00 01”,就是一個完整的幀被編為多個slice(片)的時候StartCode是00 00 01, 否則都是00 00 00 01,
NAL Header(1位元組)
NAL Header由三部分組成,forbidden_bit(1bit),nal_reference_bit(2bits)(優先級),nal_unit_type(5bits)(型別),

forbidden_bit
禁止位,初始為0,當網路發現NAL單元有位元錯誤時可設定該位元為1,以便接受方糾錯或丟掉該單元,
nal_reference_bit
NAL重要性,值越大,越重要,解碼器在解碼處理不過來的時候,可以丟掉重要性為0的NALU,
nal_unit_type:NALU型別取值如下表所示:

RBSP(Raw Byte Sequence Payload))
下圖是一個NAL由多個型別的NALU(RBSP)組成的序列樣式和相關型別引數描述表:

RBSP根據NALU頭中的nal_unit_type判斷資料型別進行決議比如7是SPS,8是PPS,1是非IDR的片,
RBSP和SODB
原始編碼資料SODB(String Of Data Bits)他們2個的關系是:
RBSP = SODB + RBSP尾部
H264的RTP打包程序

打包的時候,我們將RBSP作為作為負載資料放到RTP包中,我們根據NAL頭來確定Slice頭放到負載資料的頭部供我們作為標識,如果是單一NALU一般直接用NAL的頭來作為標識,如果是組合獲取其他模式的,我們利用Slice的值來辨識,其Slice片資料就是資料(一系列的宏塊和一些不變嗎資料),
Slice header中主要保存了當前slice的一些全域的資訊,和片的型別,

單一NALU單元模式

如有一個 H.264 的 NALU 是這樣的:
[00 00 00 01 67 42 A0 1E 23 56 0E 2F … ]
封裝成 RTP 包將如下:
[ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ]
組合封包模式—STAP-A

如有兩個 H.264 的 NALU 是這樣的:
[00 00 00 01 67 42 A0 1E 23 56 0E 2F … ]
[00 00 00 01 68 42 B0 12 58 6A D4 FF … ]
封裝成 RTP 包將如下:
[ RTP Header ]
[F + NRI + TYPE24 (代表STAP-A)]
[第一個NALU長度 (占用兩個位元組)]
[67 42 A0 1E 23 56 0E 2F ]
[第二個NALU長度 (占用兩個位元組)]
[68 42 B0 12 58 6A D4 FF … ]
分片模式—FU-A

S:1bit 當設定成1,開始位指示分片NAL單元的開始,當跟隨的FU荷載不是分片NAL單元荷載的開始,開始為設為0,
E:1bit當設定成1,結束位指示分片NAL單元的結束,即荷載的最后位元組也是分片NAL單元的最后一個位元組,當跟隨的FU荷載不是分片NAL單元的最后分片,結束位設定為0,
R:1bit保留位必須設定為0,接受者必須忽略該位,
例如:
0x7C85=01111100 10000101 (開始包)
0x7C05=01111100 00000101 (中間包)
0x7C45=01111100 01000101 (結束包)
如有一個 H.264 的 NALU 是這樣的:
[00 00 00 01 65 42 A0 1E 23 56 0E 2F … 02 17 C8 FD F1 B9 C7 53 59 72 … CB FF FF F4 1A D5 C4 18 A8 … F1 B9 C7 1D A5 FA 13 0B …]
封裝成 RTP 包將如下:
[ RTP Header ] [ 7C 85 42 A0 1E 23 56 0E 2F …]
[ RTP Header ] [ 7C 05 02 17 C8 FD F1 B9 C7 53 59 72 …]
[ RTP Header ] [ 7C 05 CB FF FF F4 1A D5 C4 18 A8 …]
[ RTP Header ] [ 7C 45 F1 B9 C7 1D A5 FA 13 0B …]
一段RTP包資料碼流如下:
舉例決議RTP包資料

H264 局限性
隨著數字視頻應用產業鏈的快速發展,視頻應用向以下幾個方向發展的趨勢愈加明顯:
(1) 高清晰度(HigherDefinition):數字視頻的應用格式從720P向1080P全面升級,而且現在4K的數字視頻格式也已經成為常見,
(2) 高幀率(Higherframe rate ):數字視頻幀率從30fps向60fps、120fps甚至240fps的應用場景升級;
(3) 高壓縮率(HigherCompression rate ):傳輸帶寬和存盤空間一直是視頻應用中最為關鍵的資源,因此,在有限的空間和管道中獲得最佳的視頻體驗一直是用戶的不懈追求,
但是面對視頻應用不斷向高清晰度、高幀率、高壓縮率方向發展的趨勢,當前主流的視頻壓縮標準協議H.264的局限性不斷凸顯,主要體現在:
(1) 宏塊個數的爆發式增長,會導致用于編碼宏塊的預測模式、運動矢量、參考幀索引和量化級等宏塊級引數資訊所占用的碼字過多,用于編碼殘差部分的碼字明顯減少,
(2) 由于解析度的大大增加,單個宏塊所表示的影像內容的資訊大大減少,這將導致相鄰的4 x 4或8 x 8塊變換后的低頻系數相似程度也大大提高,導致出現大量的冗余,
(3) 由于解析度的大大增加,表示同一個運動的運動矢量的幅值將大大增加,H.264中采用一個運動矢量預測值,對運動矢量差編碼使用的是哥倫布指數編碼,該編碼方式的特點是數值越小使用的位元數越少,因此,隨著運動矢量幅值的大幅增加,H.264中用來對運動矢量進行預測以及編碼的方法壓縮率將逐漸降低,
(4) H.264的一些關鍵演算法例如采用CAVLC和CABAC兩種基于背景關系的熵編碼方法、deblock濾波等都要求串行編碼,并行度比較低,針對GPU/DSP/FPGA/ASIC等并行化程度非常高的CPU,H.264的這種串行化處理越來越成為制約運算性能的瓶頸,
于是面向更高清晰度、更高幀率、更高壓縮率視頻應用的HEVC(H.265)協議標準應運而生,H.265在H.264標準2~4倍的復雜度基礎上,將壓縮效率提升一倍以上,
h265和h264視頻編碼區別
1、版本
H.265是新的編碼協議,也即是H.264的升bai級版,H.265標準保留duH.264原來的某些技術,同時對一些相關的技術加以改進,新技術使用先進的技術用以改善碼流、編碼質量、延時和演算法復雜度之間的關系,達到最優化設定,
2、儲存空間與畫質
同樣的畫質和同樣的碼率,H.265比H2.64 占用的存盤空間要少理論50%,如果存盤空間一樣大,那么意味著,在一樣的碼率下H.265會比H2.64 畫質要高一些理論值是30%~40%,
3、降碼率
比起H.264/AVC,H.265/HEVC提供了更多不同的工具來降低碼率,以編碼單位來說,H.264中每個宏塊(macroblock/MB)大小都是固定的16x16像素,而H.265的編碼單位可以選擇從最小的8x8到最大的64x64,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274497.html
標籤:其他
上一篇:控制臺影片完善
