-
視頻壓縮編碼的目標
1)保證壓縮比例
2)保證恢復的質量
3)易實現,低成本,可靠性 -
壓縮的出發點(可行性)
1)時間相關性
在一組視頻序列中,相鄰相鄰兩幀只有極少的不同之處,這便是時間相關性。
2)空間相關性
在同一幀中,相鄰象素之間有很大的相關性,兩象素越近,側相關性越強。 -
根據采用的信源的模型分類:
1)基于波形的編碼
如果采用“一幅圖像由許多象素構成”的信源模型,這種信源模型的參數就是象素的亮度和色度的幅度值,對這些參數進行編碼的技術即為基于波形編碼。
2)基于內容的編碼
如果采用一個分量有幾個物體構成的信源模型,這種信源模型的參數事各個物體的形狀,紋理,運動,對這些參數進行編碼的技術就是基于內容的編碼。 -
h264應用可分為3個級別:
1)基本檔次:(簡單版本, 應用面廣 , 支持幀內和幀間編碼,基于可變程度的熵編碼.)
應用領域:視頻會話,會議電視, 無線通信等實時通信.
2)主要檔次:(采用了多項提高圖像質量和增加壓縮比的技術措施, 支持隔行視頻, 支持基于上下文的自適應的算術編碼.)
應用領域: 數字廣播與數字視頻存儲
3)擴展檔次: 應用領域: 可用于各種網絡的視頻流傳輸,視頻點播 -
視頻編碼的原理
2.1 一個圖像或者一個視頻序列進行壓縮,產生碼流。
對圖像的處理即是:幀內預測編碼
其預測值P,是由已編碼的圖像做參考,經運動補償得到的。預測圖像P和當前幀Fn相減,得到兩圖像的殘差值Dn,Dn在經過轉換T,量化Q,去處空間冗余,得到系數X,將X重排(使數據更加緊湊),熵編碼(加入運動矢量。。。一些圖像相關得信息),得到nal數據。
對視頻序列的處理:幀間預測編碼
預測值P,是由當前片中,己編碼的宏塊預測得到的(亮度4×4或者16×16預測,色度8×8預測)。當前待處理的塊,減去預測值P,得殘差值Dn,Dn在經過轉換T,量化Q,得到系數X,將X重排(使數據更加緊湊),熵編碼,得到nal數據
2.2 場 、幀、圖像
場:隔行掃描的圖像,偶數行成為頂場行。奇數行成為底場行。
所有頂場行稱為頂場。所有底場行稱為底場.
幀:逐行掃描的圖像
圖像:場和幀都可認為是圖像.
2.3宏塊、片
宏塊(MB):一個宏塊由一個16×16亮度塊、一個8×8Cb和一個8×8Cr組成
片(slice):一個圖像可以劃分成一個或多個片,一個片由一個或多個宏塊組成。 -
H264結構和應用
H.264從框架結構上將NAL與VCL分離,主要有兩個目的:
其一,可以定義VCL視頻壓縮處理與NAL網絡傳輸機制的接口,這樣允許視頻編碼層VCL的設計可以在不同的處理器平臺進行移植,而與NAL層的數據封裝格式無關;
其二,VCL和NAL都被設計成工作于不同的傳輸環境,異構的網絡環境并不需要對VCL比特流進行重構和重編碼。 -
H264的編碼格式
h264的功能分為兩層,視頻編碼層(VCL)和網絡提取層(NAL)
VCL功能是進行視頻編解碼,包括運動補償預測,變換編碼和熵編碼等功能;
NAL用于采用適當的格式對VCL視頻數據進行封裝打包
1)VCL數據即被壓縮編碼后的視頻數據序列。
在VCL數據要封裝到NAL單元中之后,才可以用來傳輸或存儲。
2)NAL單元格式
NAL單元由1字節的頭,3個定長的字段和一個字節數不定的編碼段組成。
頭標的語法:NALU類型(5bit)、重要性指示位(2bit)、禁止位(1bit)。
NALU類型:1~12由H.264使用,24~31由H.264以外的應用使用。
重要性指示:標志該NAL單元用于重建時的重要性,值越大,越重要。
禁止位:網絡發現NAL單元有比特錯誤時可設置該比特為1,以便接收方丟掉該單元
Nal頭
Rbsp
Nal頭
Rbsp
Nal頭
Rbsp
(1)NAL Units:視頻數據封裝在整數字節的NALU中,它的第一個字節標志該單元中數據的類型。H.264定義了兩種封裝格式。基于包交換的網絡(如H.323系統)可以使用RTP封裝格式封裝NALU。而另外一些系統可能要求將NALU作為順序比特流傳送,為此H.264定義了一種比特流格式的傳輸機制,使用start_code_prefix將NALU封裝起來,從而確定NAL邊界。
(2)參數集:以往視頻編解碼標準中GOB\GOP\圖像等頭信息是至關重要的,包含這些信息的包的丟失常導致與這些信息相關的圖像不能解碼。為此H.264將這些很少變化并且對大量VCL NALU起作用的信息放在參數集中傳送。參數集分為兩種,即序列參數集和圖像參數集。為適應多種網絡環境,參數集可以帶內傳送,也可以采用帶外方式傳送。
序列的參數集(SPS):包括了一個圖像序列的所有信息,
圖像的參數集(PPS):包括了一個圖像所有片的信息。 -
H264的網絡傳輸
H.264能夠在基于RTP/UDP/IP、H.323/M、MPEG-2傳輸和H.320協議的網絡中使用
H.264的RTP封裝參考RFC 3550,載荷類型(PT)域未作規定 -
數據的劃分
通常情況下,一個宏塊的數據是存放在一起而組成片的,數據劃分使得一個片中的宏塊數據重新組合,把宏塊語義相關的數據組成一個劃分,由劃分來組裝片。在H.264中有三種不同的數據劃分。
(1)頭信息劃分:包含片中宏塊的類型,量化參數和運動矢量,是片中最重要的信息。
(2)幀內信息劃分:包含幀內CBPs和幀內系數,幀內信息可以阻止錯誤的蔓延。
(3)幀間信息劃分:包含幀間CBPs和幀間系數,通常比前兩個劃分要大得多。
幀內信息劃分結合頭信息解出幀內宏塊,幀間信息劃分結合頭信息解出幀間宏塊。幀間信息劃分的重要性最低,對重同步沒有貢獻。當使用數據劃分時,片中的數據根據其類型被保存到不同的緩存,同時片的大小也要調整,使得片中最大的劃分小于MTU尺寸。
解碼端若獲得所有的劃分,就可以完整重構片;解碼端若發現幀內信息或幀間信息劃分丟失,可用的頭信息仍然有很好的錯誤恢復性能。這是因為宏塊類型和宏塊的運動矢量含有宏塊的基本特征。 -
靈活的宏塊次序(FMO)
通過設置宏塊次序映射表(MBAmap)來任意地指配宏塊到不同的片組,FMO模式打亂了原宏塊順序,降低了編碼效率,增加了時延,但增強了抗誤碼性能。FMO模式劃分圖像的模式各種各樣,重要的有棋盤模式、矩形模式等。當然FMO模式也可以使一幀中的宏塊順序分割,使得分割后的片的大小小于無線網絡的MTU尺寸。經過FMO模式分割后的圖像數據分開進行傳輸,以棋盤模式為例,當一個片組的數據丟失時可用另一個片組的數據(包含丟失宏塊的相鄰宏塊信息)進行錯誤掩蓋。實驗數據顯示,當丟失率為(視頻會議應用時)10%時,經錯誤掩蓋后的圖像仍然有很高的質量。
-
H264的網絡傳輸
NAL支持眾多基于包的有線/無線通信網絡,諸如H.320、MPEG-2和RTP/IP等。但目前,絕大部分的視頻應用所采用的網絡協議層次是RTP/UDP/IP,因此在下面的描述中主要基于這個傳輸框架。下面首先分析NAL層的基本處理單元NALU以及它的網絡封裝、分割和合并的方法。
4.1. NAL單元
每個NAL單元是一個一定語法元素的可變長字節字符串,包括包含一個字節的頭信息(用來表示數據類型),以及若干整數字節的負荷數據。一個NAL單元可以攜帶一個編碼片、A/B/C型數據分割或一個序列或圖像參數集。
NAL單元按RTP序列號按序傳送。其中,T為負荷數據類型,占5bit;R為重要性指示位,占2個bit;最后的F為禁止位,占1bit。具體如下:
(1)NALU類型位
可以表示NALU的32種不同類型特征,類型1~12是H.264定義的,類型24~31是用于H.264以外的,RTP負荷規范使用這其中的一些值來定義包聚合和分裂,其他值為H.264保留。
(2)重要性指示位
用于在重構過程中標記一個NAL單元的重要性,值越大,越重要。值為0表示這個NAL單元沒有用于預測,因此可被解碼器拋棄而不會有錯誤擴散;值高于0表示此NAL單元要用于無漂移重構,且值越高,對此NAL單元丟失的影響越大。
(3)禁止位
編碼中默認值為0,當網絡識別此單元中存在比特錯誤時,可將其設為1,以便接收方丟掉該單元,主要用于適應不同種類的網絡環境(比如有線無線相結合的環境)。例如對于從無線到有線的網關,一邊是無線的非IP環境,一邊是有線網絡的無比特錯誤的環境。假設一個NAL單元到達無線那邊時,校驗和檢測失敗,網關可以選擇從NAL流中去掉這個NAL單元,也可以把已知被破壞的NAL單元前傳給接收端。在這種情況下,智能的解碼器將嘗試重構這個NAL單元(已知它可能包含比特錯誤)。而非智能的解碼器將簡單地拋棄這個NAL單元。NAL單元結構規定了用于面向分組或用于流的傳輸子系統的通用格式。在H.320和MPEG-2系統中,NAL單元的流應該在NAL單元邊界內,每個NAL單元前加一個3字節的起始前綴碼。在分組傳輸系統中,NAL單元由系統的傳輸規程確定幀界,因此不需要上述的起始前綴碼。一組NAL單元被稱為一個接入單元,定界后加上定時信息(SEI),形成基本編碼圖像。該基本編碼圖像(PCP)由一組已編碼的NAL單元組成,其后是冗余編碼圖像(RCP),它是PCP同一視頻圖像的冗余表示,用于解碼中PCP丟失情況下恢復信息。如果該編碼視頻圖像是編碼視頻序列的最后一幅圖像,應出現序列NAL單元的end,表示該序列結束。一個圖像序列只有一個序列參數組,并被獨立解碼。如果該編碼圖像是整個NAL單元流的最后一幅圖像,則應出現流的end。
H.264采用上述嚴格的接入單元,不僅使H.264可自適應于多種網絡,而且進一步提高其抗誤碼能力。序列號的設置可發現丟的是哪一個VCL單元,冗余編碼圖像使得即使基本編碼圖像丟失,仍可得到較“粗糙”的圖像。 -
H.264中的RTP
上面闡述了NAL單元的結構和實現,這里要詳細討論RTP的載荷規范和抗誤碼性能。RTP可通過發送冗余信息來減少接收端的丟包率,會增加時延,與冗余片不同的是它增加的冗余信息是個別重點信息的備份,適合于非平等保護機制。相應的多媒體傳輸規范有:
(1)分組復制多次重發,發送端對最重要的比特信息分組進行復制重發,使得保證接收端能至少正確接收到一次,同時接收端要丟棄已經正確接收的分組的多余備份。
(2)基于分組的前向糾錯,對被保護的分組進行異或運算,將運算結果作為冗余信息發送到接收方。由于時延,不用于對話型應用,可用于流媒體。
(3)音頻冗余編碼,可保護包括視頻在內的任何數據流。每個分組由頭標、載荷以及前一分組的載荷組成,H.264中可與數據分割一起使用。 -
RTP的封裝規范總結如下:
(1)額外開銷要少,使MTU尺寸在100~64千字節范圍都可以;
(2)易于區分分組的重要性,而不必對分組內的數據解碼;
(3)載荷規范應當保證不用解碼就可識別由于其他比特丟失而造成的分組不可解碼;
(4)支持將NALU分割成多個RTP分組;
(5)支持將多個NALU匯集在一個RTP分組中。
H.264采用了簡單打包的方案,即一個RTP分組里放入一個NALU,將NALU(包括同時作為載荷頭標的NALU頭)放入RTP的載荷中,設置RTP頭標值。理想情況下,VCL不會產生超過MTU尺寸的NAL單元,來避免IP層的分拆。在接收端,通過RTP序列信息識別復制包并丟棄,取出有效RTP包里的NAL單元。基本檔次和擴展檔次允許片的無序解碼,這樣在抖動緩存中就不必對包重新排序。在使用主檔次時(不允許片的亂序),要通過RTP序列信息來對包重新排序,解碼順序號(DON)的概念現正在IETF的討論中。
存在如下情況,例如當使用內容預編碼時,編碼器不了解底層網絡的MTU大小,將產生許多大于MTU尺寸的NALU。這就需要涉及NALU的分割和合并。
(1)NALU的分割
雖然IP層的分割可以使數據塊小于64千字節,但無法在應用層實現保護,從而降低了非平等保護方案的效果。由于UDP數據包小于64千字節,而且一個片的長度對某些應用場合來說太小,所以應用層打包是RTP打包方案的一部分。目前的拆分方案正在IETF的討論之中,大致具有以下特點:①NALU的分塊以按RTP次序號升序傳輸;②能夠標記第一個和最后一個NALU分塊;③可以檢測丟失的分塊。
(2)NALU的合并
一些NALU如SEI、參數集等非常小,將它們合并在一起有利于減少頭標開銷。現有的兩種集合分組:①單一時間集合分組(STAP),按時間戳進行組合,一般用于低時延環境;②多時間集合分組(MTAP),不同時間戳也可以組合,一般用于高時延環境,比如流應用 -
補充:
H264的編碼方式有兩種:幀編碼(Frame)和場編碼(Interlace)
其中,幀編碼一般一個NAL單元就一個圖像Slice,場編碼則由頂場和底場構成,每個NAL單元可能包含多個圖像SLICE片,也有可能就一個,但只有同一個Frame_Num的頂場和底場,才能構成一幅完整圖像
判斷IDR、I、P、B的類型,就是通過SLICE_HEADER的信息來看,看它的SLICE_TYPE是哪種。
視頻編碼(H264概述)
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- 注:本篇博文完全是參考月下伊人佳酒淳的。在此向大神表示感謝。 引言: 在國內直播"欣欣向榮"(ps: 其實大多都虧...
- 原文鏈接引言:在國內直播"欣欣向榮"(ps: 其實大多都虧錢,為的就是炒概念)的年代,相信很多小伙伴也投入了技術的...