GB35114视频流处理
GB35114視頻流處理
- 以下內容為個人研究的一些結果,暫未得到實際驗證,遇到一些問題,還請各位指導一下,指正其中的錯誤,謝謝。
1、基本情況
新NAL單元語法:
| forbidden_zero_bit | 1 | 0表示視頻流支持GB/T 25724-2010標準?默認為1表示支持SVAC標準 | |
| nal_ref_idc | 1 | 1表示包含SPS/PPS/安全參數集/參考圖像編碼片 | |
| nal_unit_type | 4 | 0-15 | 1-4表示VCL NAL單元,5可被丟棄 |
| encryption_idc | 1 | 1表示NAL單元中RBSP(原始字節序列負載)以安全參數集中指定加密方法加密,且RBSP最后一個字節不加密 | |
| authentication_idc | 1 | 1表示NAL單元中RBSP以安全參數集中指定認證方法認證,此時編碼比特流中必須攜帶絕對時間擴展信息,用于標識認證時間 | |
| payload_byte | 8 | 多字節有序序列,payload_byte[i]等于rbsp_byte[j],包括一個RBSP(若加密,則為加密后的RBSP,RBSP包含SODB(數據比特串),后面添加rbsp_stop_one_bit=1最后一個字節不足填充0) | |
| emulation_prevention_three_byte | 8 | 0x03 | 解碼過程丟棄,用于填充0x000000(0x000001,0x000002,0x000003)->0x00000300(0x00000301,0x00000302,0x00000303) |
NAL單元類型及轉換表:
| 0 | 保留 | 0 | 0(c0)1100 0000 | |
| 1 | tile_data_rbsp() | 非IDR(即時解碼刷新)圖像編碼片 | 1(61)0110 0001 1(41)0100 0001 | 1(c4)1100 0100 1(c7)1100 0111 |
| 2 | tile_data_rbsp() | IDR圖像編碼片 | 5(65)0110 0101 | 2(cb)1100 1011 |
| 3 | tile_data_rbsp() | 非IDR圖像SVC(可伸縮性視頻編碼)增強層編碼片 | (<–丟棄) | (–>丟棄) |
| 4 | tile_data_rbsp() | IDR圖像SVC增強層編碼片 | (<–丟棄) | (–>丟棄) |
| 5 | surveillance_extension_rbsp() | 監控擴展數據單元(也滿足rbsp語法結構) | (<–丟棄) | 5(94)1001 0100(–>新加) |
| 6 | sei_rbsp() | 補充增強信息 | 6(6)0000 0110 | 6(98)1001 1000 |
| 7 | seq_parameter_set_rbsp() | 序列參數集 | 7(67)0110 0111 | 7(dc)1101 1100 |
| 8 | pic_parameter_set_rbsp() | 圖像參數集 | 8(68)0110 1000 | 8(e0)1110 0000 |
| 9 | sec_parameter_set_rbsp() | 安全參數集 | (<–丟棄) | 9(e4)1110 0100(–>新加) |
| 10 | authentication_data_rbsp() | 認證數據 | (<–丟棄) | 10(e8)1110 1000(–>新加) |
| 11 | end_of_stream_rbsp() | 流結尾 | 11(6b)0110 1011 | 11(ec)1110 1100 |
| 12 | 保留 | - | ||
| 13 | 編碼器應用到 | - | ||
| 14 | 保留 | - | ||
| 15 | pic_parameter_set_rbsp() | SVC增強層圖像參數集 | - |
原H264NALU type:
0 沒有定義
1-23 NAL單元 單個 NAL 單元包
24 STAP-A 單一時間的組合包
25 STAP-B 單一時間的組合包
26 MTAP16 多個時間的組合包
27 MTAP24 多個時間的組合包
28 FU-A 分片的單元
29 FU-B 分片的單元
30-31 沒有定義
0x67: 序列參數集SPS
0x68: 圖像參數集PPS
0x41: 不分區、非IDR圖像的片
0x65: IDR
0x61: non-IDR Slice
0x01: B Slice
0x06:補充增強信息單元SEI
0x09: 分界符AU Delimiter
原始數據流格式說明
I幀:(第一個ps包)
| 000001ba+xxx | 000001bb+xxx | 000001bc+xxx | 000001e0+xxx+sps | 000001e0+xxx+pps | 000001e0+xxx+sei | 000001e0+xxx+idr |
現在觀察到中星視頻流加密或不加密的時候,在SPS后的的幾個NALU的pes中沒有出現000001e0+若干數據的情況,而在海康視頻流(不加密)SPS后的幾個NALU中都出現了000001e0+若干數據的情況
非I幀:
| 000001ba+xxx | 000001e0+xxx+非idr |
以上多個ps包構成一個psgop
ps頭固定長度最小為14,第14字節&07表示低三位為其后填充數據長,一般表示該幀序號
psStream、PSM、pes后兩個字節為其后數據長度,注意字節序
000001c0音頻數據
000001bd私有協議數據
安全參數集分析
0000 0001 e4 + 加密flag(1b) + 驗證flag(1b) + 加密算法(4b)+ vek flag(1b) + iv flag(1b)+ vek加密算法(4b)+ evek長度(8b)+ evek + vkek長度(8b)+ vkek + iv長度(8b)+ iv + hash type(2b) + hash圖像類型(1b)+ 簽名算法(2b)+ 簽名圖像個數(8b)+ 攝像機證書 序列號(19B)+ 攝像機ID(20B)
(1)0000 0001 e4c7 10f9 f5ea 5dde f47a 9ea0 b88d 9162 4ef2 d382 6323 0323 02d3 1312 d303 9543 1343 a343 13a3 4368 c581 4745 bfbf d1b5 d1a1 70b9 6160 ce41 0434 d560 f496 e890 49f6 a3db 50f4 4434 9def d02f 200c 0000 0300 0003 0000 0300 0003 0000 0300 0003 0000 1a6b 917f d619 9a18 9818 1918 1818 1818 9999 1818 1818 1818 1ac000000001e4-c71-0f9f5ea5ddef47a9ea0b88d91624ef2d38-26323032302d31312d30395431343a34313a34368c5814745bfbfd1b5d1a170b96160ce410434d56-0f496e89049f6a3db50f444349defd02f2-00c00000300000300000300000300000300000300001a6b917fd6199a18981819181818181899991818181818181ac0加密flag(1b) + 驗證flag(1b) + 加密算法(4b)+ vek flag(1b) + iv flag(1b) + vek加密算法(4b):c71 evek長度(8b)+ evek : 0f-9f5ea5ddef47a9ea0b88d91624ef2d38 vkek長度(8b)+ vkek : 26-323032302d31312d30395431343a34313a3436-8c5814745bfbfd1b5d1a170b96160ce410434d56(2020-11-09T14:41:46,其后不知道是什么) iv長度(8b)+ iv : 0f-496e89049f6a3db50f444349defd02f200c00000300000300000300000300000300000300001a6b917fd6199a18981819181818181899991818181818181ac0 轉換為:(去除前五位加一個字節和最后一個字節的rbsp_trailing_bits(7b)) 0000 0-000 1100 0-000 0000 0000 0000 0000 0011 0000 0000 0000 0000 0000 0011 0000 0000 0000 0000 0000 0011 0000 0000 0000 0000 0000 0011 0000 0000 0000 0000 0000 0011 0000 0000 0000 0000 00000011000000000000000000011010011010111001000101111111110101100-0011001100110100001100010011000000110000001100100011000000110000001100000011000000110001001100110011001000110000001100000011000000110000001100000011000000110101-1000000 ->:000006000006-000006000006000006000006000034d722ffac-3334313030323030303031333230303030303035(從后往前分析得出,前6個字節不知道怎么多出來的)hash type(2b) + hash圖像類型(1b)+ 簽名算法(2b)+ 簽名圖像個數(8b): 00000 18 攝像機證書 序列號(19B):000006000006000006000006000034d722ffac(34d722ffac,只有后5個字節表示證書序列號,前面懷疑是填充數據) 攝像機ID(20B):3334313030323030303031333230303030303035(34100200001320000005) (2)0000 0001 e4c7 10f2 5b41 6f29 5d27 69be e1d5 de6e 667d c3f9 7756 b103 8373 6393 8324 3314 1303 8303 3303 3377 06a6 79cd d453 f251 994c bbd3 df66 7d13 9771 e72c 871a 7776 9931 3f02 bf02 4124 63df f205 06b3 1c6a e841 876a 8299 161a 081d 63da 00ec 2ece cb7e 3d30 2879 5884 f2c0 21cf 8a31 6458 bfe4 57b0 c738 0a21 f188 7e93 dce4 81d9 e050 cf2c eb15 4215 f0c6 79a8 0ef0 ea11 6e96 b21f 7d4a 60ef b8c5 8147 45bf bfd1 b5d1 a170 b961 60ce 4104 34d5 60f4 96e8 9049 f6a3 db50 f444 349d efd0 2f20 0c00 0003 0000 0300 0003 0000 0300 0003 0000 0300 001a 6b91 7fd6 199a 1898 1819 1818 1818 1899 9918 1818 1818 181a c000000001e4-c71-0f8f631c4355016b7c708aaeba570f1e89-97756b10383935433641453137303642333833387012b34dd0734e5741dba335e69be67c9e8dd2d7b1e3aff1434c74c7ce43205e464c5345930be1a1f5e1301f30005f3520c3dc53c6df45598b2336c09ef0eb130b05ddd6fbda406d484f7ffa6626b2d99e724a19dd0c88f09734f5938f8c7bb62ecc6a0937023f0fd100c2d0a46e026cc529ff29e0df8a727fcfc807db1fcfde7410434d56-0f496e89049f6a3db50f444349defd02f2-00c00000300000300000300000300000300000300001a6b917fd6199a18981819181818181899991818181818181ac0加密flag(1b) + 驗證flag(1b) + 加密算法(4b)+ vek flag(1b) + iv flag(1b) + vek加密算法(4b):c71 evek長度(8b)+ evek : 0f-8f631c4355016b7c708aaeba570f1e89 vkek長度(8b)+ vkek : 97-756b10383935433641453137303642333833387012b34dd0734e5741dba335e69be67c9e8dd2d7b1e3aff1434c74c7ce43205e464c5345930be1a1f5e1301f30005f3520c3dc53c6df45598b2336c09ef0eb130b05ddd6fbda406d484f7ffa6626b2d99e724a19dd0c88f09734f5938f8c7bb62ecc6a0937023f0fd100c2d0a46e026cc529ff29e0df8a727fcfc807db1fcfde7410434d56-0f496e89049f6a3db50f444349defd02f2(解析不出來) iv長度(8b)+ iv : 0f-496e89049f6a3db50f444349defd02f200c00000300000300000300000300000300000300001a6b917fd6199a18981819181818181899991818181818181ac0(分析同上) hash type(2b) + hash圖像類型(1b)+ 簽名算法(2b)+ 簽名圖像個數(8b): 00000 18 攝像機證書 序列號(19B):000006000006000006000006000034d722ffac(34d722ffac,只有后5個字節表示證書序列號,前面懷疑是填充數據) 攝像機ID(20B):3334313030323030303031333230303030303035(34100200001320000005)認證簽名數據分析
暫未找到 0000 0001 e8 NALU
監控擴展單元分析
0000 0001 94 + 擴展id(8b) + 長度(8b)+ 0x80(擴展結束)
- 04 絕對時間
- 10 地理擴展信息
- 11 智能分析
- 12 OSD信息
2、上級(接收流)處理過程
此處為接收到35114經過簽名或加密的流數據(經過PS打包后的h264),且數據中NALUheader已經被轉換,需要對數據進行驗證簽名或解密處理
上級接收到數據流格式說明:(第一個ps包)
| 000001ba+xxx+000001bb+xxx+000001bc+xxx+000001e0+xxx | 00000001e4+xxx | dc | e0 | 98 | cb |
接收到的I幀中間不添加pes頭(000001e0+xxx)處理,僅在ps包中第一個ps頭后添加,(在處理完數據后轉換為正常的H264數據時,是否需要在后面每個NAL前添加pes頭?)
后續的ps包:
| 000001ba+xxx+000001e0+xxx | c7 | e8 |
以上多個ps包構成一個psgop
安全參數集出現在psgop整數倍中,(一個GOP分界線為ps頭+SPS),安全參數集不加密
認證數據默認為在一個GOP尾輸出一次
VEK隨機生成,默認30或60個GOP生成一次,新VEK在下一個GOP中使用,當前GOP不變
編碼片最后一個字節不加密
每個加密GOP中IV不同
處理過程
1、循環接收數據,以ps包為單位緩存,緩存一個ps包后,開始處理,檢查到下一個ps包后發出前一個處理完的ps包; 2、每個GOP周期開始時,先是接收到I幀ps包頭(xxbaxxbbxxbcxxe0),然后是安全參數集(用于更新iv,30或60個周期時更新vek),非I幀中沒有安全參數集iv和vek不變;- 同時會隨時接收到vkek變更通知,更新內存vkek 3、接收到安全參數集時,更新內存中安全參數集結構體變量; 4、接收到每個ps包時,解析出內部一個或多個NALU,先根據加密標識計算rbsp解密后值,后根據驗證標識計算sm3值,解密后的值直接覆蓋原rbsp數據(位數相等,且最后一個字節不加密),sm3緩存后直到最后一個NALU(緊接著是認證數據NALU和下一輪GOP)計算最終的簽名值(再同認證數據單元NALU比較結果,并將結果回調給上層);- 解密:首先從安全參數集中獲取vkek版本號,查找對應的vkek,使用vkek和sm4_ecb算法解密安全參數集中的evek得到vek,然后使用vek、iv和sm4_ofb算法解密NALU中rbsp(去掉最后一個字節)得到明文- 驗證簽名:直接使用sm3算法對rbsp計算,最終使用安全參數集中對方ID關聯的證書進行sm2加密hash值,得到待驗證的簽名數據 5、中間會有監控擴展單元NALU,可以獲取認證時間; 6、數據處理包括:解析安全參數集和認證數據NALU、解密、驗證簽名、計算監控擴展單元時間、轉換NALU頭為正常的H264NALU頭。3、下級(發送流)處理過程
此處為原始H264經過PS打包后的流,需要轉換NALUheader,同時進行簽名(添加安全參數集、監控擴展、簽名認證數據NALU)或加密處理(添加安全參數集,并在原rbsp上加密)(若同時加密和簽名可以合并成同一個安全參數集)
原先下級發出的流格式同H264原始數據流格式,當35114開關打開時,需要轉換流格式,由于上級接收到流格式,同原始數據流格式(ps打包的h264格式)不同,因此,需要將GOP中第一個ps包I幀之間轉換為沒有000001e0+xxx的形式,因此需要修改ps頭部的000001e0后長度值,并且刪除后續sps、pps、idr等前的000001e0+xxx的pes頭部數據
處理過程
1、循環發送數據,以ps包為單位緩存,緩存一個ps包后,開始處理,檢查到下一個ps包后發出前一個處理完的ps包; 2、每個GOP周期開始時,先是發送I幀ps包頭(xxbaxxbbxxbcxxe0,已經存在),然后是生成隨機數創建iv或evk(使用vkek加密后得到evek), 封裝成安全參數集;- 同時會周期性重新登錄(或者主動變更vkek),接收到對方返回的新vkek后發送vkek變更通知對方,更新內存vkek 3、創建安全參數集時,根據實時簽名或加密開關(由對方實時通知變更),控制其中驗證標識和加密標識,并將自己ID和證書序列號封裝進安全參數集,同時更新內存中安全參數集結構體變量; 4、處理每個ps包時,解析出內部一個或多個NALU,根據實時簽名或加密開關,以及自主選擇控制,控制每個NALU頭部中驗證標識和加密標識,并根據標識計算當前rbsp sm3值和加密后的值,當前NALU sm3緩存后直到最后一個NALU(緊接著是下一輪GOP)計算最終的簽名值(再封裝成認證數據NALU插入其后,同時需要加上一個監控擴展時間單元數據),加密后的值直接覆蓋原rbsp數據(位數相等,且最后一個字節不加密);- 簽名:使用sm3算法對rbsp計算,最終使用自己ID關聯的證書進行sm2加密hash值,得到簽名數據,封裝進簽名數據NALU中- 加密:使用創建的evk、iv和sm4_ofb算法對NALU中rbsp(去掉最后一個字節)加密得到密文,將vkek和sm4_ecb算法加密vek得到evek,最后將evek、iv、vkek版本號封裝進安全參數集 5、數據處理包括:轉換正常的H264NALU頭為35114NALU頭,插入安全參數集、認證數據、監控擴展時間信息NALU、加密數據、修改GOP第一個ps包I幀后面pes頭長度,刪除后面pes頭(000001e0xxx)。4、已發現問題(未解決)
1、新舊NALU頭部轉換是否正確? 2、中星和海康視頻流結構不一致,海康視頻流每個NALU都使用pes封裝,而中星的第一個ps包中連續幾個NALU使用一個pes封裝,處理時需要做兼容? 3、暫時沒有海康加密視頻流,已有中星加密和未加密視頻流文件,從中只找到部分NALU類型,未發現認證數據、流結尾NALU,監控擴展只發現兩種類型; 4、安全參數集分析,解析vkek版本號、camera idc出現偏差? 5、國標文檔中對簽名驗證定義較為模糊,簽名為先計算雜湊值(sm3)再簽名,驗證卻先解密再計算雜湊值比較?個人理解為第一種可能為先計算雜湊值(sm3)再加密(sm2),驗證時先解密(sm2)再計算雜湊值比較,第二種可能為先計算雜湊值(sm3)再簽名,驗證時同樣操作再比較,個人認為第一種可能性較大,反正文檔中前后有一種描述錯誤; 6、上述上下級處理過程未經過測試,只是憑借相關文檔及個人理解得出,是否存在偏差?總結
以上是生活随笔為你收集整理的GB35114视频流处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7安装tomcat9过程
- 下一篇: PASCAL VOC 2012 data