亚洲av无码专区在线观看漫画_三级黄色大片欧美_91免费观看国产_免费一级毛片激情_国产亚洲高级一区_九一精品裸体偷拍视频_亚洲中文精品不卡_宅男无码av最新无码av专区_4399视频在线观看免费播放_另类视频综合

如何讓Android平臺像網絡攝像機一樣實現(xiàn)GB28181前端設備接入?

發(fā)布日期:2023-09-04 點擊次數(shù):95

 

技術背景

好多開發(fā)者在做國標對接的時候,首先想到的是IPC(網絡攝像頭),通過參數(shù)化配置,接入到國標平臺,實現(xiàn)媒體數(shù)據(jù)的按需查看等操作。
像執(zhí)法記錄儀等智能終端,跑在Android平臺,對接GB28181平臺的需求也非常大,網上相關demo也不少,但真正設計符合相關協(xié)議規(guī)范、功能完善、長時間穩(wěn)定運行的并不多。基于此,華脈智聯(lián)研發(fā)了Android平臺GB28181接入模塊,目前功能設計,總的來說,IPC有的功能要有,IPC缺失的,但是對業(yè)務訴求有要求的,也要有,比如MobilePosition實時位置上報,實時快照、本地錄像、屏幕采集、拉取RTSP或RTMP對接到GB28181平臺、實時動態(tài)水印、實時音量調節(jié)、外部編碼前后對接等:
圖片
[視頻格式]H.264/H.265(Android H.265硬編碼);
[音頻格式]G.711 A律、AAC;
[音量調節(jié)]Android平臺采集端支持實時音量調節(jié);
[H.264硬編碼]支持H.264特定機型硬編碼;
[H.265硬編碼]支持H.265特定機型硬編碼;
[軟硬編碼參數(shù)配置]支持gop間隔、幀率、bit-rate設置;
[軟編碼參數(shù)配置]支持軟編碼profile、軟編碼速度、可變碼率設置;
支持橫屏、豎屏推流;
Android平臺支持后臺service推送屏幕(推送屏幕需要5.0+版本);
支持純視頻、音視頻PS打包傳輸;
支持RTP OVER UDP和RTP OVER TCP被動模式;
支持信令通道網絡傳輸協(xié)議TCP/UDP設置;
支持注冊、注銷,支持注冊刷新及注冊有效期設置;
支持設備目錄查詢應答;
支持心跳機制,支持心跳間隔、心跳檢測次數(shù)設置;
支持移動設備位置(MobilePosition)訂閱和通知;
支持國標GB/T28181—2016平臺接入;
支持語音廣播及語音對講;
[實時水印]支持動態(tài)文字水印、png水?。?/span>
[鏡像]Android平臺支持前置攝像頭實時鏡像功能;
[實時靜音]支持實時靜音/取消靜音;
[實時快照]支持實時快照;
[降噪]支持環(huán)境音、手機干擾等引起的噪音降噪處理、自動增益、VAD檢測;
[外部編碼前視頻數(shù)據(jù)對接]支持YUV數(shù)據(jù)對接;
[外部編碼前音頻數(shù)據(jù)對接]支持PCM對接;
[外部編碼后視頻數(shù)據(jù)對接]支持外部H.264數(shù)據(jù)對接;
[外部編碼后音頻數(shù)據(jù)對接]外部AAC數(shù)據(jù)對接;
[擴展錄像功能]支持錄像相關功能。
 
技術接口設計
接口設計這塊,我們分三個部分:一個是供Publisher實例調用的接口,一個是RTP發(fā)送相關的接口,還有一個是針對語音廣播這塊,實現(xiàn)的接收RTP數(shù)據(jù)播放接口。
先說供GB28181推送實例調用的接口:

/*+++++++++++++++GB28181相關接口+++++++++++++++*/private native long nativeCreate(String server_ip, intport, String server_id, Stringserver_domain, String device_id, String device_pwd, Stringdevice_name, int tcpudp, int heartbeat_interval, intreg_expire, String sdk_version);


private native void nativeRegister(final long ptr);private native void nativeUnRegister(final long ptr);/*+++++++++++++++GB28181相關接口+++++++++++++++*/


再說RTP發(fā)送相關的接口:

/*+++++++++++++++RTP Sender相關接口+++++++++++++++*/public native void nativePushEncodedAudio(long handle,int devId, byte[] data, int length);public native void nativePushEncodedVideo(long handle,int devId, byte[] data, int length);
/*+++++++++++++++RTP Sender相關接口+++++++++++++++*/

 

接收相關的接口

void sip_audio_decode_cb(AVFrame * frame, void *userdata){log_print(HT_LOG_INFO,"PTT- %s startsip_audio_decode_cb",__FUNCTION__ ); SUA * p_sua =(SUA *) userdata; if (NULL ==p_sua->media_info.audio_player) {log_print(HT_LOG_INFO,"PTT- %s, p_sua->media_info.audio_playeris null###",__FUNCTION__ );#ifdef ANDROID_ASp_sua->media_info.dataQueue = new DataQueue();p_sua->media_info.audio_player = newOpenSlEsPlayer(p_sua->media_info.dataQueue, 8000);p_sua->media_info.audio_player->play();#endif } if(p_sua->media_info.audio_player) { PcmData*pdata = new PcmData((char *) frame->data[0], frame->nb_samples *frame->channels * av_get_bytes_per_sample((enumAVSampleFormat)frame->format));p_sua->media_info.dataQueue->putPcmData(pdata); }}

 

上述接口說過之后,大家可能疑惑,信令交互呢?信令交互,我們是在Android上層實現(xiàn)。
如基礎參數(shù)配置:

GBParam( ip ="222.185.255.66", port = 5060, server_id ="34020000002000000001", server_domain ="3402000000", device_id ="34020000001320000609", device_pwd ="123456", device_name ="GB28181 Device", tcpudp = 0,heartbeat_interval = 30, reg_expire =3600)

信令交互處理:

private val engineEventHandler =IEngineEventHandler { type, state -> if (type ==EventHandlerStatus.EventHandlerType.type_register) { when(state) {EventHandlerStatus.RegisterState.unregister -> { //反注冊logI("onState: id=${type.toCallTypeString()},state=unregister($state)") }EventHandlerStatus.RegisterState.register_fail -> { //注冊失敗logI("onState: id=${type.toCallTypeString()},state=register_fail($state)") } EventHandlerStatus.RegisterState.register_success-> { //注冊成功logI("onState: id=${type.toCallTypeString()},state=register_success($state)") }EventHandlerStatus.RegisterState.register_forbidden -> { //注冊失敗,udp/tcp協(xié)議不對、密碼不對等注冊參數(shù)不對logI("onState: id=${type.toCallTypeString()},state=register_forbidden($state)") }else -> {logI("onState: id=${type.toCallTypeString()},state=PUEVT_REG_PASS($state)") } } } else {logI("onState: id=${type.toCallTypeString()},state=${state.toEventString()}") } if (type ==EventHandlerStatus.EventHandlerType.type_call_in) { //呼入事件 when(state) {EventHandlerStatus.EventState.PUEVT_CALL_IN -> { //視頻監(jiān)控呼入 }EventHandlerStatus.EventState.PUEVT_CONNECT -> { //視頻監(jiān)控接通 }EventHandlerStatus.EventState.PUEVT_HANGUP -> { //視頻監(jiān)控掛斷 } } } }

 

除了基礎的Camera接口外,5.0開始新的Camera2數(shù)據(jù)依舊可以正常對接,感興趣的開發(fā)者可酌情參考。