1. 程式人生 > >解析海康攝像機推送的PS流(節目流)

解析海康攝像機推送的PS流(節目流)

背景:由於近期專案需求,需要我們對海康推送的視訊流進行解析。

根據海康後臺管理平臺,可以得到海康推送的視訊流資訊為以RTP協議推送的PS流。廢話不多說,直接上碼流,一步步分析。

80 60 00 00 00 00 00 00 55 66 77 8800 00 01 ba 45 74 2d b4 84 01 04 e6 6b fe
ff ff 00 5c b2 18 00 00 01 bb 00 12 82 73 35 04 e1 7f e0 e0 80 c0 c0 08 bd e0
80 bf e0 80 00 00 01 bc 00 4e e5 ff 00 24 40 0e 48 4b 01 00 e2 17 ce 2c 3a ef
00 ff ff ff 41 12 48 4b 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00 20
1b e0 00 1c 42 0e 07 10 10 ea 07 80 04 38 11 30 00 00 1c 20 2a 0a 7f ff 00 00
07 08 1f fe f0 87 1f 79 94 46 00 00 01 e0

00 1e 8c 80 07 21 5d 0b 6d 21 ff fc
00 00 00 01 67 4d 00 2a 9d a8 1e 00 89 f9 66 e0 20 20 20 4000 00 01 e0 00 0e
8c 00 03 ff ff fc 00 00 00 01 68 ee 3c 80 00 00 01 e0 00 0e 8c 0002 ff fc 00
00 00 01 06 e5 01 85 80 00 00 01 e0 ff c6 8c 0004 ff ff ff fd 00 00 00 01 65
b8 00 00 03 02 ea c4 09 ff f8 81 13 b6 78 09 2d 07 eb 1d ec df ff d4 a4 0c f3
ed 8d 14 81 61 5c 60 fe 41 a7 13 b3 44 26 d7 0d

1.從開頭解析,開頭的前12位為rtp的頭部資訊(標黃的部分)

2.緊接著00 00 01 ba是PS的頭資訊,根據PS協議得知,前14位是固定位數,前14位的最後一位和32(&0x07)取模得到後面的

擴充套件位數

3.緊接著00 00 01 bb是系統頭資訊,其規則是緊跟著後面的兩位表示該頭部資訊剩餘的長度,此處為00 12轉為十進位制為18,也就是往後18位,為下一個頭資訊

4.接上面第三點得到接下來的頭資訊為psMap的頭資訊(psm),其解析和第三點類似,緊跟後面兩位為長度資訊,跳過該長度即為下個頭資訊的開頭

5.接上面第四點,得到接下來的頭資訊為00 00 01 e0,該頭資訊為pes包,pes包中包含了真實視訊流的資訊,00 00 01 e0後面兩位表示pes包的長度,隔兩位,得到pes包的自減值,跳過這些位數後,後面的就是視訊流資訊,此處為H264視訊流,開頭為00 00 00 01 67

踩過的坑及原因和解決思路
坑一:解析完以後播放有花屏問題 原因:pes有丟包現象,如果通過wireshark能夠抓到包,但程式沒有讀取,很有可能是程式裡沒有設定快取 坑二:解析完以後開始播放有一層白霧,人走過就能清晰 原因:pes包沒有完全解析,很多rtp中會含有兩個pes包,此時要根據pes包的長度進行控制 坑三:一開始播放正常,過一會兒就開始斷斷續續【我這邊是由於sip伺服器每隔一段時間會註冊一次導致的混流現象】 原因:很有可能是多個rtp會話向一個埠傳送資訊,此時可以在程式中將rtp包的編號輸出到檔案,然後在檔案中檢視編號的連續性,再通過wireshark進行抓包分析,檢視包的連續性。