JM版本16.0,配置文件encoder_baseline.cfg,H.264標準文檔(03/2010)版。 通過對碼流的第一個NALU(SPS)的形成來分析。 首先給出編碼后的最終碼流(SPS + PPS): 將SPS(紅色部分)轉換成二進制:00000000 00000000 00000000 00000001 01100111 01000010 00000000 00101000 11110011 00000101 10001001 11001000 然后介紹一個碼流分析工具:Elecard StreamEye Tools 用這個工具分析用JM編碼得到的碼流,它會給出各個NALU的信息 其中SPS的內容如下: 其中每一個參數對應碼流中的位置用顏色對應關系給出,其中后面標有ue_v的是采用Exp-Golomb-coded編碼的,暫時還沒有研究。其他沒有顏色的bit為一些填充或頭部,后面詳細分析。 ————————————————————————————————— 好吧,下面分析這個NALU是怎么形成的:00 00 00 01 67 42 00 28 F3 05 89 C8 首先形成的是String Of Data Bits (SODB),請參考標準文檔7.2.3.1.1部分 01000010 00000000 00101000 11110011 00000101 10001001 1100 這個就是形成的SODB,轉換成16進制,可以發(fā)現它就是上面碼流的42 00 28 F3 05 89 C這一段。 然后要形成的是Raw Byte Sequence Packet (RBSP),它其實就是在SODB后面加上 RBSP trailing bits的結果,見標準文檔7.2.3.1,目的是為了形成整數字節(jié)。 填充規(guī)則見標準文檔的7.4.1部分,大概為先填充一個1(rbsp_stop_one_bit),然后都填充0(rbsp_alignment_zero_bit),所以對于上面的SODB,填充一個1,3個0之后,便得到了 現在,碼流的后面7個字節(jié)都得到了,現在要得到的是Extended Byte Sequence Packet (EBSP),它在RBSP基礎上填加了仿校驗字節(jié),防止與起始碼沖突,如果出現連續(xù)的三個字節(jié)00000000 00000000 000000xx,著插入一個0×03,變成00000000 00000000 00000003 000000xx。在上面的RBSP中沒有出現這樣的序列,所以木有改變什么。 最后在EBSP前面加上一個4字節(jié)的起始碼00 00 00 01和一個NAL unit type字節(jié)就形成最后的Network Abstraction Layer Unit (NALU) NAL unit type字節(jié)包含三個字段(具體含義見7.4.1):67 <==> 0 11 00111 ——————————————————————————————————————– 在JM代碼中,輸出SPS和PPS的實現在函數int start_sequence(ImageParameters *p_Img, InputParameters *p_Inp)中,有興趣的小朋友自己研究研究吧。 最后把PPS的信息也貼出來: pic_parameter_set_id = 0 . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 相關文章:
|
|
來自: SamBookshelf > 《H264》