欧美日韩一区二区成人免费观看_欧美成人v片在线观看_三级新婚之夜完整版_欧美日韩亚洲国产激情_英语老师解开胸罩喂我乳_午夜黄色一级片电影_亚洲日韩最人妻无码_99久久九九国产精品国产喷水_强乱强乱中文字幕_浪货趴办公桌h揉秘书电影无码

如何讓Android平臺(tái)像網(wǎng)絡(luò)攝像機(jī)一樣實(shí)現(xiàn)GB28181前端設(shè)備接入?

發(fā)布日期:2023-09-04 點(diǎn)擊次數(shù):589

 

技術(shù)背景

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

/*+++++++++++++++GB28181相關(guān)接口+++++++++++++++*/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相關(guān)接口+++++++++++++++*/


再說(shuō)RTP發(fā)送相關(guān)的接口:

/*+++++++++++++++RTP Sender相關(guān)接口+++++++++++++++*/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相關(guān)接口+++++++++++++++*/

 

接收相關(guān)的接口

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); }}

 

上述接口說(shuō)過(guò)之后,大家可能疑惑,信令交互呢?信令交互,我們是在Android上層實(shí)現(xiàn)。
如基礎(chǔ)參數(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 -> { //反注冊(cè)logI("onState: id=${type.toCallTypeString()},state=unregister($state)") }EventHandlerStatus.RegisterState.register_fail -> { //注冊(cè)失敗logI("onState: id=${type.toCallTypeString()},state=register_fail($state)") } EventHandlerStatus.RegisterState.register_success-> { //注冊(cè)成功logI("onState: id=${type.toCallTypeString()},state=register_success($state)") }EventHandlerStatus.RegisterState.register_forbidden -> { //注冊(cè)失敗,udp/tcp協(xié)議不對(duì)、密碼不對(duì)等注冊(cè)參數(shù)不對(duì)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)控掛斷 } } } }

 

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

在線客服

Online Service