控協(xié)議集成:GB/T28181與ONVIF聯(lián)合接入實(shí)戰(zhàn)指南)
前陣子接了一個(gè)園區(qū)視頻監(jiān)控聯(lián)網(wǎng)項(xiàng)目前端三百多路攝像機(jī)牌子很雜——海康、大華、天地偉業(yè)都有還有一些老設(shè)備只有ONVIF接口、固件里壓根沒有GB/T28181選項(xiàng)。平臺側(cè)倒是干脆只認(rèn)國標(biāo)要求所有點(diǎn)位按GB28181注冊上報(bào)。這就逼著我把GB/T28181和ONVIF兩套協(xié)議湊到同一個(gè)方案里處理。折騰了幾天把信令、媒體、網(wǎng)關(guān)、各種坑摸了個(gè)遍這里把完整的集成思路和實(shí)操記錄整理出來給同樣在做視頻接入、平臺對接的兄弟們一個(gè)參考。這篇內(nèi)容主要圍繞協(xié)議集成方案展開重點(diǎn)講清楚GB28181與ONVIF各自的角色定位、兩者協(xié)議棧差異帶來的轉(zhuǎn)換邏輯、三種主流集成模式怎么選以及從ONVIF設(shè)備發(fā)現(xiàn)、RTSP拉流到國標(biāo)SIP注冊、推流上線的完整配置方法和排錯(cuò)鏈路。適合正在做視頻監(jiān)控平臺對接、國標(biāo)聯(lián)網(wǎng)改造、或準(zhǔn)備自己搭協(xié)議網(wǎng)關(guān)的開發(fā)和運(yùn)維朋友。1. 我為什么要同時(shí)搞定兩套協(xié)議一個(gè)真實(shí)項(xiàng)目暴露的矛盾1.1 項(xiàng)目背景平臺只認(rèn)國標(biāo)設(shè)備卻不全都支持這個(gè)園區(qū)項(xiàng)目最初的訴求很簡單把各廠家的攝像機(jī)統(tǒng)一接入到一套綜合管理平臺平臺再按GB/T28181向上一級監(jiān)管平臺推送視頻資源。第一輪對接時(shí)我就發(fā)現(xiàn)一個(gè)很現(xiàn)實(shí)的問題——管理平臺側(cè)的GB28181服務(wù)端很成熟但前端設(shè)備的能力參差不齊新采購的攝像機(jī)基本都內(nèi)置了GB28181注冊功能填上SIP服務(wù)器地址和國標(biāo)編號就能上線一部分前幾年采購的設(shè)備固件不支持國標(biāo)但能通過ONVIF協(xié)議被第三方平臺發(fā)現(xiàn)和管理也能正常拉流還有極少數(shù)老設(shè)備連ONVIF都不完整只能靠廠家私有SDK對接。如果所有設(shè)備都換新預(yù)算不現(xiàn)實(shí)如果全部走廠家SDK定制開發(fā)周期又太長。所以整個(gè)方案必須做“協(xié)議集成”——讓不同能力的設(shè)備都能以一種統(tǒng)一的方式接入國標(biāo)平臺。1.2 兩個(gè)協(xié)議各自解決什么問題先花點(diǎn)時(shí)間把兩個(gè)協(xié)議的家底理清楚很多同事容易把它們搞混。GB/T28181全稱《安全防范視頻監(jiān)控聯(lián)網(wǎng)系統(tǒng)信息傳輸、交換、控制技術(shù)要求》2011年發(fā)布2016年推出修訂版也就是常說的GB/T 28181-2016。它解決的是監(jiān)控系統(tǒng)之間的聯(lián)網(wǎng)問題規(guī)范了SIP信令的交互過程、SDP媒體協(xié)商方式、RTP承載PS流的媒體格式、設(shè)備目錄信息、錄像檢索回放、云臺控制等。簡單說它讓不同廠商的管理平臺、不同級別的監(jiān)控中心能夠互相注冊、互相調(diào)流形成一個(gè)整體的一張網(wǎng)。ONVIF全稱Open Network Video Interface Forum是由安訊士、博世、索尼等廠家發(fā)起的開放接口標(biāo)準(zhǔn)。它解決的是設(shè)備側(cè)互操作問題定義了一套基于Web Services的接口包括WS-Discovery設(shè)備發(fā)現(xiàn)、設(shè)備信息管理、媒體配置、RTSP流地址獲取、事件訂閱、PTZ控制等。它的核心價(jià)值在于一個(gè)支持ONVIF的NVR或VMS可以不依賴廠家私有SDK直接管理另一個(gè)廠家的攝像機(jī)。這兩者的關(guān)系不是替代而是分層ONVIF管的是“設(shè)備怎么被人管理”GB28181管的是“視頻資源怎么在平臺之間共享”。1.3 項(xiàng)目里的分工定位在實(shí)際項(xiàng)目里我把它們定位得很清楚ONVIF負(fù)責(zé)接入層發(fā)現(xiàn)設(shè)備、驗(yàn)證ONVIF賬號、拿到RTSP拉流地址、配置攝像機(jī)參數(shù)、訂閱報(bào)警事件GB28181負(fù)責(zé)聯(lián)網(wǎng)層讓設(shè)備或網(wǎng)關(guān)作為SIP客戶端注冊到平臺按國標(biāo)格式上報(bào)通道目錄響應(yīng)平臺的實(shí)時(shí)預(yù)覽、錄像回放調(diào)用。當(dāng)設(shè)備原生支持GB28181時(shí)它直接扮演SIP UA的角色當(dāng)設(shè)備只有ONVIF能力時(shí)就需要一個(gè)“翻譯官”把兩套機(jī)制串起來這就是后面要展開的協(xié)議網(wǎng)關(guān)。2. 協(xié)議棧差異拆解為什么ONVIF拉到的流不能直接送進(jìn)國標(biāo)平臺曾經(jīng)有個(gè)剛?cè)胄械耐聠栁摇凹热籓NVIF能拿到RTSP地址那平臺直接把RTSP拉流看不就行了為什么還要轉(zhuǎn)成GB28181”這個(gè)問題問到了協(xié)議集成的本質(zhì)。答案很簡單——平臺之間的資源共享不認(rèn)RTSP國標(biāo)平臺接收視頻流的信令流程和媒體封裝有自己的一套規(guī)矩。2.1 信令面SIP打電話與Web Service調(diào)接口的巨大差異GB28181的信令建立在SIPSession Initiation Protocol之上。你可以把它理解成給攝像機(jī)“打電話”設(shè)備向平臺的SIP服務(wù)器發(fā)起REGISTER注冊平臺回200 OK要預(yù)覽視頻時(shí)平臺用INVITE發(fā)起媒體協(xié)商設(shè)備用SDP描述自己準(zhǔn)備發(fā)送的媒體格式協(xié)商通過后RTP流就發(fā)過來。整個(gè)過程有明確的狀態(tài)機(jī)注冊、心跳、目錄訂閱、通知、實(shí)時(shí)音視頻、錄像查詢、云臺控制全是SIP方法定義好的。ONVIF則完全走另一條路線。它基于Web Services設(shè)備端跑著一個(gè)HTTP服務(wù)管理端通過SOAP/XML消息調(diào)用設(shè)備的各種接口。設(shè)備發(fā)現(xiàn)用的是WS-Discovery多播協(xié)議管理端往局域網(wǎng)發(fā)探測消息支持ONVIF的設(shè)備就會(huì)返回自己的接口地址。之后的操作比如“GetDeviceInformation”“GetProfiles”“GetStreamUri”本質(zhì)上都是往設(shè)備的HTTP端口發(fā)POST請求。這兩者的風(fēng)格差異很大SIP更像“建立會(huì)話、維護(hù)通話狀態(tài)”的通信協(xié)議Web Service更像是“調(diào)用API獲取結(jié)果”的管理接口。所以你不能指望ONVIF的接口消息能被國標(biāo)平臺識別平臺側(cè)根本不監(jiān)聽這個(gè)。2.2 媒體面PS流與RTSP裸流不是一回事媒體層面差異更大。ONVIF協(xié)議本身不直接傳輸視頻碼流它只負(fù)責(zé)告知客戶端“視頻流在哪個(gè)RTSP地址”。真正取流時(shí)播放器或NVR會(huì)向設(shè)備發(fā)起RTSP會(huì)話經(jīng)過OPTIONS、DESCRIBE、SETUP、PLAY等步驟然后接收RTP包。RTP包里封裝的具體媒體格式由設(shè)備決定可能是H.264、H.265或者M(jìn)JPEG封裝方式一般遵循RTP/AVP或RTP/AVPF直接就是單幀的分包傳輸。而GB28181規(guī)定的實(shí)時(shí)視音頻傳輸是把音視頻數(shù)據(jù)封裝成PS流Program Stream節(jié)目流再用RTP承載發(fā)送。PS流是從MPEG-2標(biāo)準(zhǔn)里來的封裝格式可以理解為把視頻幀、音頻幀按一定的系統(tǒng)層規(guī)則打包成連續(xù)的數(shù)據(jù)單元包里有PS頭、系統(tǒng)頭、節(jié)目流映射PSM等結(jié)構(gòu)。國標(biāo)要求設(shè)備把編碼后的數(shù)據(jù)封裝成PS包然后按負(fù)載類型96或97之類的動(dòng)態(tài)PT值通過RTP發(fā)給接收端。這意味著RTSP取到的裸RTP流和國標(biāo)要求的PS-over-RTP流在封裝層面完全對不上。平臺端收到RTP包后需要解析PS封裝再從中提取視頻幀解碼。如果直接塞一個(gè)RTSP的H.264裸流過去平臺根本解析不出圖像。2.3 網(wǎng)關(guān)為什么要做“剝殼再包殼”明白了差異你就能理解協(xié)議網(wǎng)關(guān)的核心工作用ONVIF與設(shè)備握手獲取RTSP地址和憑據(jù)向設(shè)備發(fā)起RTSP會(huì)話接收視頻幀和音頻幀把接收到的裸流重新封裝成GB28181要求的PS流以SIP UA的身份向國標(biāo)平臺注冊響應(yīng)平臺的INVITE請求把封裝好的PS-over-RTP推送到平臺指定的地址和端口。如果設(shè)備編碼格式平臺能接受這一步只做“轉(zhuǎn)封裝”不涉及轉(zhuǎn)碼CPU占用很低。如果設(shè)備只輸出MJPEG而平臺要求H.264或者平臺只收H.264但設(shè)備只支持H.265網(wǎng)關(guān)就必須做真正的轉(zhuǎn)碼這時(shí)的計(jì)算開銷和延遲會(huì)明顯上升。3. 集成方案選型設(shè)備原生國標(biāo)、協(xié)議網(wǎng)關(guān)與雙協(xié)議并存的取舍協(xié)議集成方案不是只有一種根據(jù)項(xiàng)目現(xiàn)場設(shè)備的實(shí)際能力我一般分三種情況處理。選錯(cuò)模式輕則多花錢買性能過剩的服務(wù)器重則根本接不通。3.1 模式A設(shè)備原生支持GB28181直接開國標(biāo)配置這是最省事的路徑。新一點(diǎn)的攝像機(jī)無論是???、大華還是天地偉業(yè)基本都內(nèi)置了GB28181功能只是菜單位置不同。做法就是在設(shè)備Web界面里找到“GB28181”或“SIP”配置項(xiàng)填入平臺側(cè)分配的SIP服務(wù)器IP、端口、設(shè)備國標(biāo)ID、密碼等信息保存后設(shè)備會(huì)主動(dòng)注冊。這種模式的優(yōu)點(diǎn)是鏈路最短不經(jīng)過中間服務(wù)穩(wěn)定性和實(shí)時(shí)性都最好。缺點(diǎn)也很明顯——它只適用于原生支持國標(biāo)的設(shè)備。如果設(shè)備固件版本太老或者產(chǎn)品線壓根沒做國標(biāo)功能你怎么填配置都白搭。需要留意的是有些設(shè)備雖然有GB28181菜單但實(shí)現(xiàn)得很粗糙可能不支持目錄訂閱上報(bào)或者對平臺下發(fā)的某些MESSAGE消息不響應(yīng)。這種“半殘”國標(biāo)設(shè)備反而比完全沒國標(biāo)的設(shè)備更浪費(fèi)時(shí)間。3.2 模式B設(shè)備只有ONVIF能力用協(xié)議網(wǎng)關(guān)做轉(zhuǎn)換接入這是本次項(xiàng)目的主力模式。架構(gòu)很簡單IPCONVIF - RTSP拉流域 - 協(xié)議網(wǎng)關(guān)轉(zhuǎn)封裝/轉(zhuǎn)碼 SIP注冊 - 國標(biāo)平臺網(wǎng)關(guān)可以是軟件方案部署在一臺Linux服務(wù)器上也可以是一臺硬件接入網(wǎng)關(guān)。軟件網(wǎng)關(guān)目前可選的開源項(xiàng)目不少比較成熟的方案有基于ZLMediaKit擴(kuò)展的wvp-GB28181-pro它自帶SIP信令服務(wù)、媒體服務(wù)、通道管理能通過RTSP接入設(shè)備再以GB28181標(biāo)準(zhǔn)向上級平臺注冊支持級聯(lián)項(xiàng)目活躍度也還可以。商用的也有不少廠家做買來即用適合不想折騰的場景。軟件網(wǎng)關(guān)的部署邏輯基本是安裝SIP服務(wù)組件監(jiān)聽5060端口處理注冊和設(shè)備目錄安裝流媒體服務(wù)組件接收RTSP拉流完成PS封裝與RTP推送配置設(shè)備接入列表填入每臺攝像機(jī)的RTSP地址、ONVIF賬號密碼在網(wǎng)關(guān)上為每一路通道分配一個(gè)國標(biāo)編碼配置平臺側(cè)SIP參數(shù)網(wǎng)關(guān)向平臺發(fā)起注冊。3.3 模式C平臺側(cè)雙協(xié)議并存還有一種常見場景綜合安防管理平臺本身支持ONVIF和GB28181兩種接入方式。我一般建議這樣分工用ONVIF做設(shè)備管理平臺主動(dòng)發(fā)現(xiàn)設(shè)備、批量添加攝像機(jī)、獲取設(shè)備能力集、訂閱設(shè)備的移動(dòng)偵測和遮擋報(bào)警事件、下發(fā)云臺控制指令。這些操作用ONVIF非常順手因?yàn)樗菫椤肮芾碓O(shè)備”設(shè)計(jì)的用GB28181做平臺互聯(lián)與上級監(jiān)管平臺、公安視頻專網(wǎng)平臺對接時(shí)統(tǒng)一走國標(biāo)。平臺作為國標(biāo)信令服務(wù)和媒體服務(wù)端接收下級設(shè)備或下級平臺的注冊和級聯(lián)。這種雙協(xié)議并存的模式在本級平臺內(nèi)部是最舒服的——設(shè)備管理體驗(yàn)好上級聯(lián)網(wǎng)又合規(guī)。難點(diǎn)在于平臺的內(nèi)部實(shí)現(xiàn)要預(yù)留兩套協(xié)議的通道綁定關(guān)系比如ONVIF添加的通道與國標(biāo)目錄里的通道要能一一映射。3.4 選型決策與成本對比我習(xí)慣用一個(gè)簡單的決策邏輯設(shè)備支持GB28181且實(shí)現(xiàn)穩(wěn)定優(yōu)先模式A設(shè)備不支持國標(biāo)但支持ONVIF走模式B網(wǎng)關(guān)按點(diǎn)位數(shù)量評估服務(wù)器性能設(shè)備連ONVIF都不完整只能走廠家SDK定制接入或者直接建議項(xiàng)目方更換前端設(shè)備本級平臺還需要管理大量異構(gòu)設(shè)備、同時(shí)要跟上級互聯(lián)就采用模式C。三種模式對比起來模式適用設(shè)備部署成本鏈路長度典型場景A 設(shè)備原生國標(biāo)新固件、支持國標(biāo)的IPC最低零額外硬件最短新改擴(kuò)建項(xiàng)目、前端設(shè)備統(tǒng)一B ONVIF協(xié)議網(wǎng)關(guān)僅支持ONVIF的老設(shè)備中等需要服務(wù)器或硬件網(wǎng)關(guān)較長有轉(zhuǎn)換環(huán)節(jié)存量設(shè)備利舊、混合品牌接入C 平臺雙協(xié)議并存任意ONVIF設(shè)備和國標(biāo)下級較高平臺需成熟按需選擇綜合安防平臺上級聯(lián)網(wǎng)4. 設(shè)備接入側(cè)實(shí)操批量摸清ONVIF家底的工具與方法接下來是干貨部分。無論選哪種模式第一步永遠(yuǎn)是搞清楚前端設(shè)備到底支持什么、RTSP地址是什么、ONVIF賬號密碼對不對。這一步做扎實(shí)后面接入能少踩一半坑。4.1 ODM工具先用它把局域網(wǎng)設(shè)備掃一遍現(xiàn)場排查設(shè)備能力時(shí)我最常用的工具是ONVIF Device Manager簡稱ODM。這是個(gè)開源小工具在SourceForge等渠道可以搜索“ONVIF Device Manager”下載安裝。它體積小、免安裝版也有跑在Windows機(jī)器上就能用。ODM的核心能力包括WS-Discovery設(shè)備發(fā)現(xiàn)點(diǎn)一下Discover自動(dòng)掃描同網(wǎng)段支持ONVIF的設(shè)備列出IP、廠商、型號、固件版本ONVIF賬號認(rèn)證輸入設(shè)備的ONVIF用戶名密碼管理設(shè)備RTSP地址獲取通過Media服務(wù)拿到設(shè)備各視頻通道、各Profile的RTSP流地址不用再猜URL格式實(shí)時(shí)預(yù)覽內(nèi)置播放器直接預(yù)覽ONVIF拉取的視頻流驗(yàn)證賬號權(quán)限和碼流是否正常PTZ與事件測試有些版本還能調(diào)試云臺、查看報(bào)警事件。進(jìn)行批量接入前我會(huì)拿一臺筆記本電腦接到監(jiān)控網(wǎng)交換機(jī)用ODM掃一遍整個(gè)網(wǎng)段導(dǎo)出設(shè)備清單一個(gè)個(gè)標(biāo)記哪些設(shè)備能通過ONVIF訪問、哪些設(shè)備彈認(rèn)證失敗、哪些設(shè)備根本不響應(yīng)發(fā)現(xiàn)消息。這個(gè)清單直接決定了后續(xù)走模式A、模式B還是SDK定制。4.2 用ODM確認(rèn)設(shè)備能力與RTSP地址ODM使用起來不復(fù)雜但有幾個(gè)細(xì)節(jié)要注意電腦要和攝像機(jī)在同一網(wǎng)段或者路由可達(dá)。不同VLAN的話WS-Discovery多播可能過不去這時(shí)只能按IP手動(dòng)添加ONVIF設(shè)備部分設(shè)備默認(rèn)禁用ONVIF服務(wù)ODM發(fā)現(xiàn)了設(shè)備但無法獲取視頻需要先到設(shè)備Web端開啟ONVIFONVIF賬號密碼不一定等于Web登錄的admin密碼。很多廠家為了安全要求單獨(dú)在“ONVIF設(shè)置”里創(chuàng)建賬號并分配權(quán)限ODM認(rèn)證時(shí)要用這個(gè)專用賬號成功認(rèn)證后ODM的Live Video頁簽里能預(yù)覽視頻Media頁簽?zāi)芸吹絇rofile列表和對應(yīng)的RTSP流地址。以??翟O(shè)備為例認(rèn)證成功后可看到類似rtsp://user:pass192.168.1.64:554/Streaming/Channels/101的主碼流地址101代表通道1的主碼流102是通道1的子碼流。大華設(shè)備則是rtsp://user:passip:554/cam/realmonitor?channel1subtype0這種帶參數(shù)的形式。天地偉業(yè)設(shè)備的RTSP路徑不同型號略有差異常見的是rtsp://ip:554/stream1或帶session參數(shù)的形式最好通過ODM的GetStreamUri接口拿到準(zhǔn)確地址不要憑印象硬寫。需要特別提醒如果RTSP地址里的密碼包含、:、/、?等特殊字符需要做URL編碼否則拉流時(shí)密碼解析會(huì)出錯(cuò)會(huì)一直報(bào)401。4.3 天地偉業(yè)攝像機(jī)是否支持ONVIF怎么開、怎么配熱搜詞里有人專門問天地偉業(yè)攝像機(jī)是否支持ONVIF我直接說結(jié)論天地偉業(yè)近年出廠的攝像機(jī)基本都支持ONVIF新固件大部分也支持GB28181但需要手動(dòng)開啟并配置賬號。天地偉業(yè)攝像機(jī)的ONVIF開啟步驟大致如下不同型號菜單名稱略有差異用瀏覽器登錄攝像機(jī)Web管理頁面默認(rèn)IP需要看機(jī)身標(biāo)簽或通過搜不到時(shí)用ONVIF發(fā)現(xiàn)找到“配置-網(wǎng)絡(luò)-高級設(shè)置”或“設(shè)置-網(wǎng)絡(luò)服務(wù)”下的ONVIF菜單打開ONVIF啟用開關(guān)在ONVIF用戶管理里添加一個(gè)專用賬號輸入用戶密碼權(quán)限選擇管理員或媒體操作權(quán)限保存后用這個(gè)賬號在ODM或第三方平臺里添加設(shè)備。如果登錄設(shè)備后發(fā)現(xiàn)根本沒有ONVIF菜單通常意味著固件版本過老。部分舊機(jī)型可以通過官網(wǎng)下載升級固件獲得ONVIF支持但要有“升級完功能缺失或變磚”的心理預(yù)期最好先在備機(jī)上驗(yàn)證。4.4 拿不到RTSP地址時(shí)的備用排查手段ODM失效的情況主要有兩種一是設(shè)備ONVIF服務(wù)未開啟或?qū)崿F(xiàn)存在Bug二是設(shè)備根本不支持ONVIF。第一種情況先到設(shè)備Web界面開啟ONVIF再重試。第二種情況比較麻煩但也不是沒有出路可以用設(shè)備自帶SDK開發(fā)包做二次開發(fā)拉流方式參考廠家文檔或者直接在設(shè)備Web預(yù)覽頁面右鍵查看源碼定位到播放器地址再用VLC等工具驗(yàn)證能否播放實(shí)在不行還可以咨詢廠家技術(shù)支持確認(rèn)該型號是否有支持國標(biāo)的固件版本可以刷。做這一步的核心目標(biāo)只有一個(gè)把每路視頻的穩(wěn)定拉流地址和對應(yīng)編碼格式記錄下來這份資產(chǎn)在后面的網(wǎng)關(guān)配置里直接復(fù)用。5. 國標(biāo)側(cè)對接配置SIP注冊、通道編碼與推流調(diào)優(yōu)設(shè)備側(cè)摸透了接下來就是國標(biāo)側(cè)的事。這部分的配置項(xiàng)其實(shí)不多但每個(gè)參數(shù)的含義必須吃透不然注冊失敗/注冊成功但不上線/上線但不出圖排查起來會(huì)很痛苦。5.1 先把幾個(gè)核心概念弄清楚先說編碼規(guī)則。GB28181要求每個(gè)設(shè)備、每個(gè)通道都有一個(gè)20位的數(shù)字ID這也是大家最容易搞混的地方。20位數(shù)字一般包含前8位通常是行政區(qū)劃編碼或平臺中心編碼中間幾位是行業(yè)編碼、類型編碼后面是設(shè)備序號或通道序號可能包含校驗(yàn)位。不同平臺對位的定義會(huì)有細(xì)微差異所以我通常不自己拍腦袋編而是直接找平臺方要“國標(biāo)編碼規(guī)范文檔”照著模板生成設(shè)備編碼和通道編碼。一般來說設(shè)備編碼和通道編碼要有清晰的對應(yīng)關(guān)系比如設(shè)備編碼的最后幾位加通道號就能得到通道編碼這樣在平臺里維護(hù)起來比較清晰。再說SIP服務(wù)器。國標(biāo)平臺側(cè)會(huì)啟動(dòng)一個(gè)SIP服務(wù)端監(jiān)聽默認(rèn)5060端口有些平臺為了安全會(huì)改成其他端口比如15060。設(shè)備或網(wǎng)關(guān)側(cè)配置的SIP服務(wù)器地址就是這個(gè)服務(wù)端的IP和端口。最后說信令用戶。設(shè)備注冊到平臺時(shí)需要攜帶SIP用戶名、認(rèn)證密碼。平臺會(huì)提前為下級設(shè)備分配好這些憑據(jù)同時(shí)綁定一個(gè)國標(biāo)設(shè)備編碼。設(shè)備編碼、用戶名、密碼三者必須和平臺側(cè)錄入的信息完全一致。5.2 設(shè)備或網(wǎng)關(guān)端的SIP配置清單以網(wǎng)關(guān)為例完整的配置項(xiàng)一般如下配置項(xiàng)推薦值/說明SIP服務(wù)器IP平臺國標(biāo)服務(wù)端地址必須路由可達(dá)SIP服務(wù)器端口默認(rèn)5060平臺側(cè)自定義時(shí)按實(shí)際填SIP用戶名平臺分配的國標(biāo)設(shè)備ID或?qū)?yīng)用戶名SIP密碼平臺側(cè)設(shè)置的認(rèn)證密碼設(shè)備國標(biāo)編碼20位數(shù)字按平臺規(guī)范生成通道國標(biāo)編碼每路通道一個(gè)建議與設(shè)備編碼關(guān)聯(lián)注冊有效期默認(rèn)3600秒部分平臺要求較短心跳周期默認(rèn)120秒平臺要求不符時(shí)改為60秒信令傳輸模式TCP或UDP按平臺能力選擇媒體傳輸模式TCP被動(dòng)/主動(dòng)或UDP需和平臺協(xié)商通道碼流可選主碼流/子碼流建議先用子碼流聯(lián)調(diào)填寫完畢后在網(wǎng)關(guān)日志里應(yīng)該能看到REGISTER請求發(fā)出平臺回復(fù)401質(zhì)詢設(shè)備帶認(rèn)證信息再次REGISTER平臺回復(fù)200 OK這一條完整的SIP注冊鏈路就算通了。需要特別說明的是“注冊有效期”和“心跳周期”。有些平臺把有效期設(shè)置得很短頻繁要求設(shè)備重新注冊如果設(shè)備不響應(yīng)就會(huì)標(biāo)記為離線。心跳的作用是?;钇脚_在幾個(gè)心跳周期內(nèi)收不到設(shè)備消息就會(huì)把設(shè)備置為離線。所以這兩個(gè)參數(shù)建議嚴(yán)格按照平臺要求配置不要想當(dāng)然用默認(rèn)值。5.3 平臺發(fā)起預(yù)覽時(shí)發(fā)生了什么設(shè)備注冊成功只是第一步平臺點(diǎn)開預(yù)覽時(shí)會(huì)走這樣一條鏈路平臺向設(shè)備的SIP地址發(fā)送INVITE請求攜帶SDP說明自己要接收的媒體類型、RTP接收IP和端口網(wǎng)關(guān)解析SDP向平臺回復(fù)200 OK攜帶自己這端的SDP描述包括PS封裝格式、負(fù)載類型PT、傳輸模式等網(wǎng)關(guān)向攝像機(jī)發(fā)起RTSP拉流拿到視頻幀網(wǎng)關(guān)把視頻幀封裝成PS包按平臺SDP指定的目標(biāo)IP和端口發(fā)送UDP或按TCP模式建立socket推送RTP數(shù)據(jù)平臺收到PS流解析出視頻幀并解碼顯示。這期間任何一步不對現(xiàn)象都可能是“預(yù)覽失敗”或“黑屏”。我在實(shí)際排查中見過最多的問題是第2步的SDP協(xié)商不一致比如平臺要求UDP傳輸網(wǎng)關(guān)卻回復(fù)TCP被動(dòng)模式雙方各說各話媒體包永遠(yuǎn)發(fā)不到平臺。5.4 推流模式與編碼參數(shù)調(diào)優(yōu)關(guān)于TCP和UDP的選擇我的建議是公網(wǎng)跨網(wǎng)段傳輸、防火墻環(huán)境復(fù)雜時(shí)優(yōu)先TCP被動(dòng)模式出流更穩(wěn)定局域網(wǎng)內(nèi)部、平臺要求低延遲時(shí)UDP更合適節(jié)省TCP拆包組包開銷國標(biāo)平臺同時(shí)支持TCP/UDP時(shí)需要確認(rèn)平臺對“TCP主動(dòng)”“TCP被動(dòng)”的具體定義不同平臺實(shí)現(xiàn)有差異容易踩坑。編碼參數(shù)方面GB28181-2016已經(jīng)支持H.265但很多老平臺還是只能穩(wěn)定解析H.264所以聯(lián)調(diào)前要先問平臺支持什么編碼。接入調(diào)試階段我習(xí)慣讓網(wǎng)關(guān)把通道碼流配置為子碼流分辨率720P以下幀率15到25關(guān)鍵幀間隔推薦2秒也就是I幀間隔50幀25fps先把鏈路跑通再逐步切換到主碼流或更高分辨率這樣能大大減少定位問題的難度。如果攝像機(jī)編碼是H.265而平臺只收H.264網(wǎng)關(guān)必須轉(zhuǎn)碼。轉(zhuǎn)碼參數(shù)建議視頻編碼H.264 High Profile分辨率按平臺要求碼率根據(jù)畫質(zhì)需求設(shè)置音頻按平臺要求設(shè)為G.711A或G.711U如果平臺不支持音頻要不就關(guān)閉音頻通道要不就做音頻轉(zhuǎn)碼否則預(yù)覽有畫面無聲倒是小事有些平臺遇到不認(rèn)識的音頻編碼會(huì)直接導(dǎo)致拉流失敗。5.5 網(wǎng)關(guān)轉(zhuǎn)碼的資源規(guī)劃為轉(zhuǎn)碼場景單獨(dú)提醒一句。一臺8路網(wǎng)關(guān)服務(wù)器如果全部走H.265轉(zhuǎn)H.264軟件轉(zhuǎn)碼8核16G的機(jī)器壓力會(huì)非常大實(shí)測碼流稍高就會(huì)出現(xiàn)幀率下降、花屏、卡頓。規(guī)劃網(wǎng)關(guān)服務(wù)器時(shí)按這個(gè)經(jīng)驗(yàn)來純轉(zhuǎn)封裝同編碼H.264轉(zhuǎn)H.264封裝或H.265轉(zhuǎn)H.265封裝一路約占用CPU 5%-10%內(nèi)存占用很低H.265轉(zhuǎn)H.264軟件轉(zhuǎn)碼一路1080P大約需要2-4個(gè)CPU核心8路至少要24核以上才穩(wěn)要考慮顯卡硬件轉(zhuǎn)碼或采購硬件網(wǎng)關(guān)否則高峰期必然扛不住。6. 上線后最常見的四類故障排查鏈路協(xié)議集成方案上線后故障率最高的不是配置階段而是并發(fā)場景下暴露出來的各種兼容性問題。這里記錄幾類我踩過的坑和對應(yīng)的排查鏈路你可以直接照著查。6.1 設(shè)備注冊不上先畫一條信令鏈路圖現(xiàn)象網(wǎng)關(guān)或設(shè)備配置了SIP參數(shù)但平臺“在線狀態(tài)”一直離線或者日志里看不到REGISTER請求。我的排查步驟先在網(wǎng)關(guān)所在服務(wù)器上ping平臺IP確認(rèn)網(wǎng)絡(luò)連通性用telnet 平臺IP 5060TCP模式時(shí)確認(rèn)端口通不通UDP模式下用抓包確認(rèn)收發(fā)包看網(wǎng)關(guān)日志里有沒有發(fā)出REGISTER如果壓根沒發(fā)檢查SIP服務(wù)器IP和端口配置如果發(fā)了REGISTER但沒收到平臺的401或200多半是防火墻攔了UDP 5060端口或者平臺SIP服務(wù)沒起來如果收到了401但后續(xù)REGISTER帶認(rèn)證信息后仍然401檢查SIP密碼是否與平臺錄入一致注意有些平臺的密碼是只對設(shè)備編碼生效不要填錯(cuò)。有個(gè)很容易被忽視的問題網(wǎng)關(guān)服務(wù)器上如果同時(shí)跑著多個(gè)SIP服務(wù)或者系統(tǒng)自帶其他SIP組件占用了5060端口注冊請求會(huì)發(fā)到錯(cuò)誤的進(jìn)程平臺自然收不到。我踩過一次Docker容器里映射了5060端口宿主機(jī)又裝了一個(gè)網(wǎng)關(guān)兩個(gè)服務(wù)搶端口注冊時(shí)好時(shí)壞。6.2 注冊成功但平臺看不到通道目錄訂閱與MESSAGE的坑現(xiàn)象設(shè)備在線但平臺資源列表里沒有這臺設(shè)備或者有設(shè)備但沒有通道。這種情況通常是“目錄”環(huán)節(jié)出了問題。設(shè)備注冊成功后平臺會(huì)通過MESSAGE消息向設(shè)備發(fā)送目錄查詢請求或者訂閱設(shè)備的目錄變化通知。設(shè)備收到后要返回帶通道信息的XML包括每個(gè)通道的國標(biāo)編碼、名稱、狀態(tài)。排查點(diǎn)看設(shè)備日志是否收到平臺的MESSAGE目錄請求如果沒收到說明平臺沒有主動(dòng)查目錄而設(shè)備又沒在REGISTER時(shí)帶目錄信息通道自然為空如果收到但平臺仍無通道重點(diǎn)檢查返回的XML格式是否正確、通道編碼是否符合平臺規(guī)范很多平臺對通道編碼的校驗(yàn)非常嚴(yán)格格式稍有不對就丟棄部分老設(shè)備對“目錄訂閱”支持不好設(shè)備只回了一次目錄就不再推送更新平臺側(cè)要關(guān)閉訂閱模式改成周期性目錄查詢兩邊節(jié)奏才能對上。6.3 拉流黑屏PS封裝與SDP協(xié)商是重點(diǎn)現(xiàn)象設(shè)備在線、通道在線平臺點(diǎn)預(yù)覽能調(diào)起但畫面黑屏或者一直轉(zhuǎn)圈。黑屏問題我把90%的精力放在兩條線索上線索一SDP協(xié)商不一致。抓包看INVITE消息和200 OK的SDP內(nèi)容確認(rèn)媒體描述里封裝的類型是否是PS格式視頻負(fù)載類型PT值是否雙方一致傳輸?shù)刂泛投丝谑遣皇瞧脚_可訪問的。最常見的坑是網(wǎng)關(guān)回復(fù)的媒體IP是內(nèi)網(wǎng)IP平臺在另一個(gè)網(wǎng)段收不到RTP包。解決方法是設(shè)置SDP中媒體IP為平臺可達(dá)的地址必要時(shí)做端口映射。線索二PS封裝錯(cuò)誤。網(wǎng)關(guān)把收到的裸流切成PS包時(shí)PS頭、PSM、PES包的語法必須嚴(yán)格遵循國標(biāo)。如果PS封裝不完整比如缺少系統(tǒng)頭或PSM很多平臺的解析庫會(huì)直接丟包。判斷方法是在網(wǎng)關(guān)服務(wù)器上抓包用Wireshark打開RTP流看能否正常解析出PS結(jié)構(gòu)如果顯示“PS”信息不完整基本就是封裝實(shí)現(xiàn)的問題需要換網(wǎng)關(guān)或升級版本。6.4 出圖花屏、卡頓、聲音異常從編碼參數(shù)到負(fù)載排查現(xiàn)象畫面能出來但不穩(wěn)定花屏、馬賽克、周期性卡頓或者預(yù)覽時(shí)有畫面無聲音。我的排查順序先確認(rèn)攝像機(jī)碼流本身是否穩(wěn)定。直接拿VLC拉RTSP流對比如果RTSP直穩(wěn)定再查轉(zhuǎn)換環(huán)節(jié)花屏多是丟包引起UDP模式下跨網(wǎng)段容易出這個(gè)問題優(yōu)先切TCP模式或加碼流帶寬限制卡頓經(jīng)常是鏈路里某個(gè)節(jié)點(diǎn)性能不夠。CPU占用高時(shí)優(yōu)先把子碼流方案補(bǔ)上讓預(yù)覽默認(rèn)走子碼流點(diǎn)大畫面再切主碼流無聲音先確認(rèn)攝像機(jī)的音頻編碼GB28181平臺普遍只認(rèn)G.711A/G.711U如果設(shè)備是AAC必須轉(zhuǎn)碼還有一部分設(shè)備默認(rèn)關(guān)閉了音頻輸出ONVIF配置里要開啟音頻通道如果使用的是廉價(jià)網(wǎng)關(guān)或OpenSource方案還需要檢查是否支持音頻封裝進(jìn)PS流不支持的話看到“視頻正常、音頻缺失”就不奇怪了。整個(gè)項(xiàng)目做下來我的體會(huì)是協(xié)議集成方案的復(fù)雜度不在某一個(gè)點(diǎn)而在兩個(gè)協(xié)議間的銜接段。把ONVIF設(shè)備發(fā)現(xiàn)、RTSP拉流、PS封裝、SIP注冊這幾個(gè)環(huán)節(jié)逐一看明白每個(gè)環(huán)節(jié)用什么工具驗(yàn)證、抓什么包、看什么日志都養(yǎng)成固定套路問題基本都能在半小時(shí)內(nèi)定位。最后分享一個(gè)個(gè)人經(jīng)驗(yàn)新項(xiàng)目開局不要急著大規(guī)模接入先拿一臺設(shè)備走通“ODM摸能力 - 網(wǎng)關(guān)拉流 - 國標(biāo)注冊 - 平臺預(yù)覽 - 錄像檢索”完整鏈路確認(rèn)各環(huán)節(jié)穩(wěn)定后再批量鋪開能省下大量返工時(shí)間。