H264碼流的兩種打包方式,一種為Annex-b byte stream format的格式,字節流格式,這個是絕大部分編碼器的默認輸出格式,就是每個幀的開頭的3~4個字節是H264的start_code,0x00000001或者0x000001,即NALU數據+開始前綴(00000001或000001),針對H.320電話會議。另一種是原始的NAL打包格式,就是開始的若干字節(1,2,4字節)是NAL的長度,而不是start_code,此時必須借助某個全局的數據來獲得編碼器的profile,level,PPS,SPS等信息才可以解碼。
RTP格式:NALU數據+20個字節的類似的並不符合RTP協議的RTP頭。針對IP網絡的RTP打包方式。為原始的NAL打包格式,就是開始的若干字節(1,2,4字節)是NAL的長度,而不是start_code,此時必須借助某個全局的數據來獲得編碼器的profile,level,PPS,SPS等信息才可以解碼。
H.264協議只規定了字節流格式,沒有規定 RTP 格式。可能也是因為這個原因,JM 的 RTP 格式沒有被用到任何場合場合中,成為了擺設。
一共有兩種起始碼:3字節的0x000001和4字節的0x00000001
3字節的0x000001只有一種場合下使用,就是一個完整的幀被編為多個slice的時候,包含這些slice的nalu使用3字節起始碼。其余場合都是4字節的。
H.264 的兩種碼流格式:
GetAnnexbNALU 處理字節流格式的碼流
GetRTPNALU 處理 RTP 格式碼流
字節流格式的碼流主要用於存儲,例如制作 DVD(當然現在的 DVD 還不是用 H.264)
RTP 格式碼流主要用於網絡傳送,例如在線看電影
最簡單RTP包包括RTP包頭、H.264擴展頭和H.264碼流
碼流在JM里會首先打包到NALU里去,之后要把NALU中的相關信息變成H.264擴展頭,然后再加上一個RTP包頭,就變成了一個RTP包。
H.264擴展頭就一個字節,三個信息。
RTP包頭12和16字節兩種,JM都先讀四個字節,再讀四個字節時間戳,再就是buffer,之后還有四個字節的信息源標識符,一共12字節才對。