H264編碼 封裝成MP4格式 視頻流 RTP封包

    

        H264編碼 封裝成MP4格式 視頻流 RTP封包             

        分類:             多媒體編程             

轉自:http://www.cnblogs.com/ghw-NO1/archive/2012/08/28/2660848.htmljavascript

 http://blog.csdn.net/crazyman2010/article/details/8596229php

1、概述html

本文講述的是對H264編碼且封裝成MP4格式的視頻流進行RTP打包過程時須要瞭解的一些基本知識。java

2、H264的基礎知識算法

1.H264的編碼格式編程

H.263 定義的碼流結構是分級結構,共四層。自上而下分別爲:圖像層(picturelayer)、塊組層(GOB layer)、宏塊層(macroblock layer)和塊層(block layer)。而與H.263 相比,H.264的碼流結構和H.263 的有很大的區別,它採用的再也不是嚴格的分級結構。H.264 支持4:2:0 的連續或隔行視頻的編碼和解碼。H.264 壓縮與H.26三、MPEG-4 相比,視頻壓縮比提升了一倍。網絡

H.264 的功能分爲兩層:視頻編碼層(VCL, Video Coding Layer)和網絡提取層(NAL,Network Abstraction Layer)。VCL 數據即編碼處理的輸出,它表示被壓縮編碼後的視頻數據序列。在VCL 數據傳輸或存儲以前,這些編碼的VCL 數據,先被映射或封裝進NAL 單元中。每一個NAL 單元包括一個原始字節序列負荷(RBSP, Raw Byte Sequence Payload)、一組對應於視頻編碼的NAL 頭信息。RBSP 的基本結構是:在原始編碼數據的後面填加告終尾比特。一個bit「1」若干比特「0」,以便字節對齊。 ide

2.H264的傳輸工具

H.264 的編碼視頻序列包括一系列的NAL 單元,每一個NAL 單元包含一個RBSP,見表1。編碼片(包括數據分割片IDR 片)和序列RBSP 結束符被定義爲VCL NAL 單元,其他 爲NAL 單元。典型的RBSP 單元序列如圖2 所示。每一個單元都按獨立的NAL 單元傳送。單元的信息頭(一個字節)定義了RBSP 單元的類型,NAL 單元的其他部分爲RBSP 數據。佈局

 

3.H264的碼流結構

起始碼:若是NALU 對應的Slice 爲一幀的開始,則用4 字節表示,即0x00000001;不然用3 字節表示,0x000001。

一個frame是能夠分割成多個Slice來編碼的,而一個Slice編碼以後被打包進一個NAL單元,不過NAL單元除了容納Slice編碼的碼流外,還能夠容納其餘數據,好比序列參數集SPS。

3、MP4封裝的H264數據

MP4文件中全部數據都封裝在box中,它是由若干個子box組成,每一個box還能夠包含另外的子box,且每一個box都有長度和類型。「ftyp」(66 74 79 70)box:做爲MP4格式的標誌幷包含關於文件的一些信息,有且僅有一個;「moov」(6D 6F 6F 76)box:包含了媒體的metadata信息(特別是avcC中的sps和pps),有且僅有一個;「mdat」(6D 64 61 74)box:包含了MP4的媒體數據,能夠有多個,也能夠沒有。可是媒體數據的結構由metadata進行描述。MP4中box存儲方式爲大端模式。通常,標準的box開頭會有四個字節的box size。

MP4格式文件中,H264 slice並非以00 00 00 01來做分割,而是存儲在mdat box中。H264基本碼流由一些列的NALU組成。原始的NALU單元組成:[start code] + [NALU header] + [NALU payload].

MP4數據格式:|"ftyp"box|"moov"box(及其子box)|"mdat"box|....|。

"mdat"box的格式:|box的length(4字節)|box類型(4字節)mdat-6D 64 61 74|NALU的length(4字節)|NALU的header(1字節)|payload|;

MP4封裝結構圖:

box結構圖:

 

用MP4info分析的實例分析圖:

4、H264視頻流的RTP封包

1.RTP打包原則

RTP的包長度必需要小於MTU(最大傳輸單元),IP協議中MTU的最大長度爲1500字節。除去IP報頭(20字節)、UDP報頭(8字節)、RTP頭(12字節),全部RTP有效載荷(即NALU內容)的長度不得超過1460字節。

2.RTP協議的報文結構

 

開始12個八進制出如今每一個RTP包中,而CSRC標識列表僅出如今混合器插入時。各段含義以下: ①版本(V)version (V): 2 bits   2位,標識RTP版本,協議初始版本爲0,RFC3550中規定的版本號爲2。。 ②填充標識(P)padding (P): 1 bit   1位,如設置填充位,在包末尾包含了額外的附加信息,它不屬於有效載荷。附加信息的最後一個字節表示額外附加信息的長度(包含該字節自己)。該字段之因此存在是由於某些加密算法須要固定大小的填充字,或爲在底層協議數據單元中攜帶幾個RTP包。 ③擴展(X)extension (X): 1 bit           1位,若是該位被設置,則在固定的頭部後存在一個擴展頭部,格式定義在RFC3550 5.3.1節。 ④CSRC計數(CC) CSRC count (CC): 4 bits    4位,CSRC計數包括緊接在固定頭後標識CSRC個數。 ⑤標記(M) marker (M): 1 bit    1位,標記解釋由設置定義,目的在於容許重要事件在包流中標記出來。設置可定義其餘標示位,或經過改變位數量來指定沒有標記位,該位的功能依賴於profile的定義。profile能夠改變該位的長度,可是要保持marker和payload type總長度不變(一共是8 bit)。。

或M:標示位,1 位。若是當前 NALU爲一個接入單元最後的那個NALU,那麼將M位置 1;或者當前RTP 數據包爲一個NALU 的最後的那個分片時(NALU 的分片在後面講述),M位置 1。其他狀況下M 位保持爲 0。 ⑥載荷類型(PT)payload type (PT): 7 bits   7位,記錄後面資料使用哪一種 Codec , receiver 端找出相應的 decoder 解碼出來,該位標記着RTP packet所攜帶信息的類型,標準類型列出在RFC3551中。若是接收方不能識別該類型,必須忽略該packet。 ⑦系列號 sequence number:16 bits  16位,系列號隨每一個RTP數據包發送後而增長1,接收方能夠根據該序列號從新排列數據包順序,或者探測包損失。系列號初值是隨機的,使對加密的文本攻擊更加困難。 ⑧時間戳timestamp: 32 bits    32位,時標反映RTP數據包中第一個八進制數的採樣時刻,採樣時刻必須從單調、線性增長的時鐘導出,以容許同步與抖動計算。時標可讓receiver端知道在正確的時間將資料播放出來。實際中當採用」分片封包模式「打包RTP時,當一個NALU打包完畢時,時間戳更一次。

RTP與RTCP協議介紹

 

   由上圖可知,若是隻有系列號,並不能完整按照順序的將data播放出來,由於若是data中間有一段是沒有資料的,只有系列號的話會形成錯誤,需搭配上讓它知道在哪一個時間將data正確播放出來,如此咱們才能播放出正確無誤的信息。 ⑨SSRC SSRC: 32 bits                     32位,SSRC段標識同步源。此標識不是隨機選擇的,目的在於使同一RTP包鏈接中沒有兩個同步源有相同的SSRC標識,也就是在一個RTP Session其間每一個數據流都應該有一個不一樣的SSRC。儘管多個源選擇同一個標識的機率很低,全部RTP實現都必須探測並解決衝突。如源改變源傳輸地址,也必須選擇一個新SSRC標識以免插入成環行源。 ⑩CSRC列表CSRC list: 0 to 15 items     bits0到15項,每項32位。CSRC列表表示包內的對載荷起做用的源。標識數量由CC段給出。如超出15個做用源,也僅標識15個。CSRC標識由混合器插入,採用做用源的SSRC標識。只有存在Mixer的時候纔有效。如一個將多聲道的語音流合併成一個單聲道的語音流,在這裏就列出原來每一個聲道的SSRC。

3.NALU header結構圖

NALU header由一個字節組成, 它的語法以下:

F: 1 個比特.forbidden_zero_bit. 在 H.264 規範中規定了這一位必須爲 0.

NRI: 2 個比特.nal_ref_idc. 取 00 ~ 11, 彷佛指示這個 NALU 的重要性, 如00的NALU解碼器能夠丟棄它而不影響圖像的回放. 不過通常狀況下不太關心這個屬性.

Type: 5 個比特.nal_unit_type. 這個 NALU 單元的類型. 可是在h264中只有 1~23 是有效的值.而其餘的24~29在RTP封包採用」組合封包模式「和」分片封包模式「時所用的type類型,而非「單一NAL單元模式」時。

簡述以下:

  0     沒有定義   1-23  NAL單元  單個 NAL 單元包.   24    STAP-A   單一時間的組合包   25    STAP-B   單一時間的組合包   26    MTAP16   多個時間的組合包   27    MTAP24   多個時間的組合包   28    FU-A     分片的單元   29    FU-B     分片的單元   30-31 沒有定義

4.RTP打包模式

主要分爲三種模式:單一NALU模式、分片模式、組合模式,實際中前兩種用的比較多。

(1)單一NALU模式

一個RTP包僅由一個完整的NALU組成。這種狀況下RTP NAL頭類型字段和原始的H.264的NALU頭類型字段是同樣的。適合條件是當NALU的長度小於RTP包長減去12時。

特別NALU type 值爲 7 和 8 的NALU分別爲序列參數集(sps)和圖像參數集(pps)。

(2)組合封包模式

便可能是由多個 NAL 單元組成一個 RTP 包. 分別有4種組合方式: STAP-A, STAP-B, MTAP16, MTAP24.那麼這裏的類型值分別是 24, 25, 26 以及 27.適合條件當 NALU 的長度特別小時, 能夠把幾個 NALU 單元封在一個 RTP 包中.

(3)分片封包模式Fragmentation Units (FUs)

用於把一個 NALU 單元封裝成多個 RTP 包. 存在兩種類型 FU-A 和 FU-B. 類型值分別是 28 和 29。適合條件當 NALU 的長度超過 MTU 時, 就必須對 NALU 單元進行分片封包. 

FU indicator 結構

F:當網絡識別此單元存在比特錯誤時,可將其設爲 1,以便接收方丟掉該單元。 NRI:必須根據分片NAL單元的NRI域的值設置,用來指示該NALU的重要性等級。值越大,表示當前NALU越重要。 TYPE:28表示FU-A和29表示FU-B

FU Header 結構:

S:當設置成1,開始位指示分片NAL單元的開始。當跟隨的FU荷載不是分片NAL單元荷載的開始,開始位設爲0。                 E:當設置成1,結束位指示分片NAL單元的結束。即荷載的最後字節是分片NAL單元的最後一個字節。當跟隨的FU荷載不是分片NAL單元的最後分片,結束位設置爲0。 R:保留位必須設置爲0,接收者必須忽略該位。

Type:與NALU的header中的Type類型一致。

 

 

 

 

【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及碼流

SkySeraph Apr 1st 2012 

Email:skyseraph00@163.com 


1、MP4格式基本概念

MP4格式對應標準MPEG-4標準(ISO/IEC14496)

 


2、MP4封裝格式核心概念

1  MP4封裝格式對應標準爲 ISO/IEC 14496-12(信息技術 視聽對象編碼的第12部分: ISO 基本媒體文件格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)

 附-- 標準免費下載: Freely Available Standards    http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

 

2  MP4封裝格式是基於QuickTime容器格式定義,媒體描述與媒體數據分開,目前被普遍應用於封裝h.264視頻和ACC音頻,是高清視頻/HDV的表明。

 

MP4文件中全部數據都封裝在box中(對應QuickTime中的atom),即MP4文件是由若干個box組成,每一個box有長度和類型,每一個box中還能夠包含另外的子box(稱container box)。

 一個MP4文件首先會有且只有一個「ftyp」類型的box,做爲MP4格式的標誌幷包含關於文件的一些信息;以後會有且只有一個「moov」類型的box(Movie Box),它是一種container box,子box包含了媒體的metadata信息;MP4文件的媒體數據包含在「mdat」類型的box(Midia Data Box)中,該類型的box也是container box,能夠有多個,也能夠沒有(當媒體數據所有引用其餘文件時),媒體數據的結構由metadata進行描述。

 

MP4中box存儲方式爲大端模式。通常,標準的box開頭會有四個字節的box size。

 

5 幾個名詞 

track

表示一些sample的集合,對於媒體數據來講,track表示一個視頻或音頻序列。

hint track

特殊的track,並不包含媒體數據,包含的是一些將其餘數據track打包成流媒體的指示信息。

sample

對於非hint   track來講,video sample即爲一幀視頻,或一組連續視頻幀,audio sample即爲一段連續的壓縮音頻,它們統稱sample。

對於hint   track,sample定義一個或多個流媒體包的格式。

sample table

指明sampe時序和物理佈局的表。

chunk

一個track的幾個sample組成的單元。

 


3、MP4封裝格式結構圖

1 實例樣本

來源於Android MediaRecoder視頻錄製,平臺爲華爲T8300和TCL968,mp4info查看以下

EsEYE查看以下:

winhex分析以下:

 

2 box結構圖

接下來對h264編碼中有用的幾個進行闡述,其它再也不描述。

3 ftypfile type box

以下圖所示,開始的四字節00 00 00 00 18表示該boxsize24字節(含頭),而後66 74 79 70ftypBOX TYPE,其它是一些格式兼容等相關信息。

4  mdat

以下圖所示,BOX YPE爲6D 64 61 74 ,緊接着的00 00 09 39表示sliece長度

5 avcC

以下圖所示,紅色爲BOX TYPE

 


4、MP4文件中h264 SPSPPS獲取

1  【參考依據】ISO/IEC 14496-15 (下載

2  【綜述】在H264中,SPS和PPS存在於NALU header中,而在MP4文件中,SPS和PPS存在於AVCDecoderConfigurationRecord, 首先要定位avcC.

3  【定義】

①參數集:一組不多改變的,爲大量VCL NALU 提供解碼信息的數據。

   序列參數集SPS做用於一系列連續的編碼圖像,而圖像參數集PPS做用於編碼視頻序列中一個或多個獨立的圖像。

   若是解碼器沒能正確接收到這兩個參數集,那麼其餘NALU 也是沒法解碼的。所以它們通常在發送其它 NALU 以前發送,而且使用不一樣的信道或者更加可靠的傳輸協議(如TCP)進行傳輸,也能夠重複傳輸。

②關於AVCDecoderConfigurationRecord結構定義爲  

4  【實例分析】 數據如上avcC圖所示,如今對數據進行詳細分析

因此,提取的SPSPPS分別爲67 42 00 1E A6 81 41 F968 CE 38 80

 


5、MP4文件中的H264 data /NALU slice

1  【參考】H264官方文檔(下載) + 畢書—新一代視頻壓縮編碼標準(下載

2  【綜述】

MP4格式文件中,H264 slice並非以00 00 00 01來做分割,而是存儲在mdat box中。

 H264基本碼流由一些列的NALU組成。原始的NALU單元組成:[start code] + [NALU header] + [NALU payload]

 

start   code

1字節

00 00 01 00 00 00 01

須要添加的

NALU header

1字節

以下3

經過mdat定位

 

 H264基本碼流結構分兩層:視頻編碼層VCL和網絡適配層NAL,這樣使信號處理和網路傳輸分離

 

VCL

負責高效視頻內容表示

NAL

以網絡所要求的恰當方式對數據進行打包和發送

 

3  【定義】 NALU header

+---------------+

|0|1|2|3|4|5|6|7|

+-+-+-+-+-+-+-+-+

|F|NRI| Type |

+---------------+

特別的,當值爲78分別爲SPSPPS

畢書(下載)(P191)上的定義爲:

 

4  【實例分析】數據分析,數據如上圖mdat所示

6D 64 61 74

mdat   BOX TYPE

00 00   09 39

silce長度,2361

 

接下來的65就是NALU header,能夠由65&0x1F來求的後五個bit,從而得知此sliceI frame

注意mdatsilce之間有可能存在若干佔位符,我在TCL手機測試時就出現了連續的00的佔位符,這樣後面用H264硬編碼時會比較麻煩一點。

 


Ref/Related

1 相關資料和工具在文中連接下載

2 http://www.52rd.com/Blog/wqyuwss/559/4/

3 http://blog.csdn.net/szu030606/article/details/5943279

4 http://blog.csdn.net/k1988/article/details/5654631

5 http://www.cppblog.com/czanyou/archive/2008/11/26/67940.html

6 http://krdai.info/blog/sps-pps-in-mp4-format.html

7 http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html

8 http://bbs.chinavideo.org/viewthread.php?tid=10273

相關文章
相關標籤/搜索