所謂參考幀,就是在其他幀解碼時需要參照的幀。比如一個I幀可能被一個或多個B幀參考,一個B幀可能被某個P幀參考。
從這個表我們也可以看出來,DIR的I幀是非常重要的,它一丟,那么這個序列的所有幀都沒辦法解碼了;序列參數集和圖像參數集也很重要,沒有序列參數集,這個序列的幀就沒法解;沒有圖像參數集,那用到這個圖像參數集的幀都沒法解。
③ nal_unit_type:NALU類型取值如下表所示:
Nal_unit_type NAL類型 C
0 未使用
1 非IDR圖像中不采用數據劃分的片段 2,3,4
2 非IDR圖像中A類數據劃分片段 2
3 非IDR圖像中B類數據劃分片段 3
4 非IDR圖像中C類數據劃分片段 4
5 IDR圖像的片 2,3
6 補充增強信息單元(SEI) 5
7 序列參數集 0
8 圖像參數集 1
9 分界符 6
10 序列結束 7
11 碼流結束 8
12 填充 9
13…23 保留
24…31 不保留(RTP打包時會用到)
RTP打包時的擴展類型
24 STAP-A Single-time aggregation packet
25 STAP-B Single-time aggregation packet
26 MTAP16 Multi-time aggregation packet
27 MTAP24 Multi-time aggregation packet
28 FU-A Fragmentation unit
29 FU-B Fragmentation unit
30-31 undefined
NALU的順序要求:
H.264/AVC標準對送到解碼器的NAL單元順序是有嚴格要求的,如果NAL單元的順序是混亂的,必須將其重新依照規范組織后送入解碼器,否則解碼器不能夠正確解碼。
1)序列參數集NAL單元
必須在傳送所有以此參數集為參考的其他NAL單元之前傳送,不過允許這些NAL單元中間出現重復的序列參數集NAL單元。
所謂重復的詳細解釋為:序列參數集NAL單元都有其專門的標識,如果兩個序列參數集NAL單元的標識相同,就可以認為后一個只不過是前一個的拷貝,而非新的序列參數集。
2)圖像參數集NAL單元
必須在所有以此參數集為參考的其他NAL單元之前傳送,不過允許這些NAL單元中間出現重復的圖像參數集NAL單元,這一點與上述的序列參數集NAL單元是相同的。
3)不同基本編碼圖像中的片段(slice)單元和數據劃分片段(data partition)單元在順序上不可以相互交叉,即不允許屬于某一基本編碼圖像的一系列片段(slice)單元和數據劃分片段(data partition)單元中忽然出現另一個基本編碼圖像的片段(slice)單元片段和數據劃分片段(data partition)單元。
4)參考圖像的影響:如果一幅圖像以另一幅圖像為參考,則屬于前者的所有片段(slice)單元和數據劃分片段(data partition)單元必須在屬于后者的片段和數據劃分片段之后,無論是基本編碼圖像還是冗余編碼圖像都必須遵守這個規則。
5)基本編碼圖像的所有片段(slice)單元和數據劃分片段(data partition)單元必須在屬于相應冗余編碼圖像的片段(slice)單元和數據劃分片段(data partition)單元之前。
6)如果數據流中出現了連續的無參考基本編碼圖像,則圖像序號小的在前面。
7)如果arbitrary_slice_order_allowed_flag置為1,一個基本編碼圖像中的片段(slice)單元和數據劃分片段(data partition)單元的順序是任意的,如果arbitrary_slice_order_allowed_flag置為零,則要按照片段中第一個宏塊的位置來確定片段的順序,若使用數據劃分,則A類數據劃分片段在B類數據劃分片段之前,B類數據劃分片段在C類數據劃分片段之前,而且對應不同片段的數據劃分片段不能相互交叉,也不能與沒有數據劃分的片段相互交叉。
8)如果存在SEI(補充增強信息)單元的話,它必須在它所對應的基本編碼圖像的片段(slice)單元和數據劃分片段(data partition)單元之前,并同時必須緊接在上一個基本編碼圖像的所有片段(slice)單元和數據劃分片段(data partition)單元后邊。假如SEI屬于多個基本編碼圖像,其順序僅以第一個基本編碼圖像為參照。
9)如果存在圖像分割符的話,它必須在所有SEI 單元、基本編碼圖像的所有片段slice)單元和數據劃分片段(data partition)單元之前,并且緊接著上一個基本編碼圖像那些NAL單元。
10)如果存在序列結束符,且序列結束符后還有圖像,則該圖像必須是IDR(即時解碼器刷新)圖像。序列結束符的位置應當在屬于這個IDR圖像的分割符、SEI 單元等數據之前,且緊接著前面那些圖像的NAL單元。如果序列結束符后沒有圖像了,那么它的就在比特流中所有圖像數據之后。
11)流結束符在比特流中的最后。
(2)RBSP
RBSP數據是下表中的一種:
RBSP類型 縮寫 描述
參數集 PS 序列的全局信息,如圖像尺寸、視頻格式等
增強信息 SEI 視頻序列解碼的增強信息
圖像界定符 PD 視頻圖像的邊界
編碼片 SLICE 編碼片的頭信息和數據
數據分割 DP片層的數據,用語錯誤恢復解碼
序列結束符 表明一個序列的結束,下一個圖像為IDR圖像
流結束符 表明該流中已沒有圖像
填充數據 亞元數據,用于填充字節
從前面的分析我們知道,VCL層出來的是編碼完的視頻幀數據,這些幀可能是I、B、P幀,而且這些幀可能屬于不同的序列,再者同一個序列還有相對應的一套序列參數集和圖片參數集等等,所以要完成視頻的解碼,不僅需要傳輸VCL層編碼出來的視頻幀數據,還需要傳輸序列參數集、圖像參數集等數據。
參數集:包括序列參數集 SPS和圖像參數集 PPS。SPS包含的是針對一連續編碼視頻序列的參數,如標識符 seq_parameter_set_id、幀數及 POC 的約束、參考幀數目、解碼圖像尺寸和幀場編碼模式選擇標識等等。PPS對應的是一個序列中某一幅圖像或者某幾幅圖像,其參數如標識符 pic_parameter_set_id、可選的 seq_parameter_set_id、熵編碼模式選擇標識、片組數目、初始量化參數和去方塊濾波系數調整標識等等。
數據分割:組成片的編碼數據存放在3個獨立的DP(數據分割,A、B、C)中,各自包含一個編碼片的子集。分割A包含片頭和片中每個宏塊頭數據。分割B包含幀內和 SI 片宏塊的編碼殘差數據。分割 C包含幀間宏塊的編碼殘差數據。每個分割可放在獨立的 NAL 單元并獨立傳輸。
3.2.4.H.264封裝模式
H.264有兩種封裝模式:
(1)annexb模式:傳統模式,有start code, SPS和PPS是在ES中;
(2)mp4模式:沒有start code,SPS和PPS是封裝在container中,每一個frame前面是這個frame的長度;SPS的頭部是0x67,PPS的頭部是0x68,要保持對數據的敏感性。
4.VC-1編碼技術?
VC-1即Video Codec One(視頻解碼方案一)。它起源于微軟公司的Windows Media Video 9。VC-1是繼MPEG-2 TS和H.264之后,最后被認可的高清編碼標準格式。VC-1雖然是最后被認可的高清編碼格式,不過因為有微軟的后臺,所以這種編碼格式不能小窺。相對于MPEG2,VC-1的壓縮比更高,但相對于H.264而言,編碼解碼的計算則要稍小一些。
總的來說,從壓縮比上來看,H.264的壓縮比率更高一些,也就是同樣的視頻,通過H.264編碼算法壓出來的視頻容量要比VC-1的更小,但是VC-1格式的視頻在解碼計算方面則更小一些,一般通過高性能的CPU就可以很流暢的觀看高清視頻。目前來看,VC-1可能是一個比較好的平衡,輔以微軟的支持,應該是一只不可忽視的力量。一般來說,VC-1多為 “.wmv”后綴,但這都不是絕對的,具體的編碼格式還是要通過軟件來查詢。
5.WMV編碼技術
WMV(Windows Media Video)是微軟開發的一系列視頻編解碼和其相關的視頻編碼格式的統稱,是微軟Windows媒體框架的一部分。WMV包含三種不同的編解碼:作為RealVideo的競爭對手,最初為Internet上的流應用而設計開發的WMV原始的視頻壓縮技術;另一種是為滿足特定內容需要的WMV屏幕和WMV圖像的壓縮技術;在經過SMPTE(Society of Motion Picture and Television Engineers)學會標準化以后,WMV版本9被采納作為物理介質的發布格式,比如高清DVD和藍光光碟,即所謂的VC-1。
微軟也開發了一種稱之為ASF(Advanced Systems Format)的數字容器格式,用來保存WMV的視頻編碼。在同等視頻質量下,WMV格式的文件可以邊下載邊播放,因此很適合在網上播放和傳輸。
6.Divx、Xvid編碼技術
我們還可以經常看的到Divx、Xvid,這兩個也很容易弄混。
其實兩者確實有很大淵源。DivX是一種將影片的音頻由MP3來壓縮、視頻由MPEG-4技術來壓縮的數字多媒體壓縮格式。DivX就是從微軟公司MPEG-4 v3編碼技術中派生出的最為知名以及被廣大DVDRipper廣泛采用的視頻編碼技術。用它編碼的視頻文件不僅最大程度上還原了DVD原本的畫面質量,而且可以允許你選擇幾乎所有格式的音頻。它的視頻部分采用的是微軟的MPEG-4技術進行壓縮,而音頻部分則是采用MP3或WMA進行壓縮,然后把視頻和音頻部分進行完美組合成讓我們耳目一新的AVI文件,就是DivX影片了。DivX最早是由國外的一名電腦游戲玩家和一名黑客制作,他們破解了微軟的MPEG-4視頻壓縮算法而后重新改寫并重新命名為DivX。
XviD是目前世界上最常用的視頻編碼解碼器(codec),而且是第一個真正開放源代碼的,通過GPL協議發布。在很多次的codec比較中,XviD的表現令人驚奇的好,總體來說是目前最優秀、最全能的codec。可以說XviD是與Divx一脈相承而又有所加強的。
評論
查看更多