Android前端音视频数据接入GB28181平台意义
技術背景
在我們研發Android平臺GB28181前端音視頻接入模塊之前,業內聽到最多的是,如何用Android或者Windows端,在沒有國標IPC設備的前提下,模擬GB28181的信令和媒體流交互流程,實現GB28181整體方案的測試?
Android端真的沒有必要做個支持GB28181的接入模塊?
如果說做一個設備端IPC國標設備接入模擬模塊是完成從0到1的工作,那么從設備端模擬IPC到一個可以產品化的Android平臺GB28181前端音視頻接入模塊,需要更嚴謹更符合相關spec的方式,實現不具備國標音視頻能力的Android終端,通過平臺注冊的形式,接入到現有的GB28181服務,最終用于如智能監控、智慧零售、智慧教育、遠程辦公、生產運輸、智慧交通、車載或執法記錄儀等場景,可以說應用場景非常廣泛。
除了支持常規的音視頻媒體流數據接入外,還可以支持Subscribe訂閱實時位置(MobilePosition)、實時目錄查詢等,完成標準服務的對接。產品設計方面,媒體流支持最新GB28181-2016的UDP和TCP被動模式,參數配置,支持注冊有效期、心跳間隔、心跳間隔次數、TCP/UDP信令設置,支持RTP Sender IP地址類型、RTP Socket本地端口、SS-R-C、RTP socket 發送Buffer大小、RTP時間戳時鐘頻率設置,支持注冊成功、注冊超時、INVITE、ACK、BYE狀態回調。
設計思路
信令設計和媒體數據傳輸分離,上層實現國標GB28181的注冊、注銷、CATALOG、INVITE、ACK、BYE、SUBSCRIBE等交互處理,如注冊成功后,返回注冊時間,并檢測傳輸或心跳等異常狀態,服務端發送catalog請求后,組織本地catalog信息,并以message的形式發送到服務端,服務端收到相關信息后,開始發送invite請求,客戶端解析INVITE返回的SDP信息,組織相關的response,創建RTP Sender,根據返回的信息,設定相關參數。待收到服務端的Ack后,發送編碼、打包后的媒體流數據。在此期間,按照設定間隔,定時發送keepalive。
如上圖所示,模塊除了常規的音視頻參數配置外,系統可同時亦或單獨實現如RTMP推送、RTSP推送、輕量級RTSP服務、實時錄像、GB28181前端接入。
信令接口設計:
public interface GBSIPAgent {void addListener(GBSIPAgentListener listener);/** 設置SIP本地鏈接地址* @param address 本地IP地址, 如192.168.0.111* @param port本地SIP端口, 如 15070*/void setLocalAddressInfo(String address, int port);/** 設置SIP Server配置參數* @param address SIP服務器地址, 如 192.168.0.101* @param port SIP服務器端口, 如 15060* @param id SIP服務器ID, 如 34020000002000000001* @param domain SIP服務器域, 如 3402000000*/void setServerParameter(String address, int port, String id, String domain);/** 設置GB28181 SIP User配置參數* @param userName SIP用戶名, 如 34020000001110000045* @param password 如 123456*/void setUserInfo(String userName, String password);/** 設置SIP請求頭中的UserAgent* @param userAgent用戶代理*/void setUserAgent(String userAgent);/** 設置SIP傳輸協議* @param transport_protocol, 設置SIP信令傳輸協議: UDP, TCP, 默認是UDP*/void setTransportProtocol(String transport_protocol);/** 設置GB28181配置參數* @param regExpired 注冊有效期, 單位: 秒, 如 3600* @param heartBeatInterval 心跳間隔, 單位: 秒, 默認60* @param heartBeatCount 心跳超時次數, 默認3次*/void config(int regExpired, int heartBeatInterval, int heartBeatCount);void clearDevices();boolean addDevice(Device device);boolean initialize();/**啟動*/boolean start();boolean isRunning();/**響應Invite play 200OK*/boolean respondPlayInviteOK(String deviceId, String localAddress, int localPort);/**響應Invite play其他狀態碼*/boolean respondPlayInvite(int statusCode, String deviceId);/**終止會話*/void terminatePlay(String deviceId, boolean isSendBYE);/**終止所有會話*/void terminateAllPlays(boolean isSendBYE);/**停止*/void stop();void unInitialize(); }相關狀態回調:
public interface GBSIPAgentListener {/*注冊成功* @param dateString: 服務器日期,用來矯正設備端時間,用戶自行決定是否矯正設備時間*/void ntsRegisterOK(String dateString);/**注冊超時*/void ntsRegisterTimeout();/**注冊網絡傳輸曾異常*/void ntsRegisterTransportError(String errorInfo);/**心跳達到異常次數*/void ntsOnHeartBeatException(int exceptionCount, String lastExceptionInfo);/**收到s=Play的實時視音頻點播*/void ntsOnInvitePlay(String deviceId, InvitePlaySessionDescription sessionDescription);/**發送play invite response 異常*/void ntsOnPlayInviteResponseException(String deviceId, int statusCode, String errorInfo);/** 收到CANCEL play INVITE請求*/void ntsOnCancelPlay(String deviceId);/** 收到Ack*/void ntsOnAckPlay(String deviceId);/** 收到Bye*/void ntsOnByePlay(String deviceId);/** Play會話對應的對話終止, 一般不會出發這個回調,目前只有在響應了200K, 但在64*T1時間后還沒收到ACK,才可能會出發收到這個, 請做相關清理處理*/void ntsOnPlayDialogTerminated(String deviceId); }總結
Android平臺GB28181音視頻接入模塊研發之前,大牛直播SDK(官方)已經在RTSP、RTMP和音視頻采集、編碼傳輸等有了多年積累,GB28181接入,對我們來說,只是在現有架構的基礎上,完成信令交互和數據打包傳輸(H264, H265打包成PS流,然后拆成RTP包發送即可),RTP傳輸支持TCP、UDP模式,配合國標28181服務器測試,延時非常低,設計支持多通道,可實現RTSP或RTMP流數據到GB28181的轉換。為Android平臺賦能,像支持GB28181協議的IPC一樣,方便的把攝像頭、屏幕、麥克風或外部RTSP、RTMP流,順利接入到GB28181平臺。
?
總結
以上是生活随笔為你收集整理的Android前端音视频数据接入GB28181平台意义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】Python机器学习的神器-
- 下一篇: 【Python】7种方案,彻底实现可视化