技术背景
好多开发者在做国标对接的时候,首先想到的是IPC(网络摄像头),通过参数化配置,接入到国标平台,实现媒体数据的按需查看等操作。
像执法记录仪等智能终端,跑在Android平台,对接GB28181平台的需求也非常大,网上相关demo也不少,但真正设计符合相关协议规范、功能完善、长时间稳定运行的并不多。基于此,华脉智联研发了Android平台GB28181接入模块,目前功能设计,总的来说,IPC有的功能要有,IPC缺失的,但是对业务诉求有要求的,也要有,比如MobilePosition实时位置上报,实时快照、本地录像、屏幕采集、拉取RTSP或RTMP对接到GB28181平台、实时动态水印、实时音量调节、外部编码前后对接等:
[视频格式]H.264/H.265(Android H.265硬编码);
[音频格式]G.711 A律、AAC;
[音量调节]Android平台采集端支持实时音量调节;
[H.264硬编码]支持H.264特定机型硬编码;
[H.265硬编码]支持H.265特定机型硬编码;
[软硬编码参数配置]支持gop间隔、帧率、bit-rate设置;
[软编码参数配置]支持软编码profile、软编码速度、可变码率设置;
支持横屏、竖屏推流;
Android平台支持后台service推送屏幕(推送屏幕需要5.0+版本);
支持纯视频、音视频PS打包传输;
支持RTP OVER UDP和RTP OVER TCP被动模式;
支持信令通道网络传输协议TCP/UDP设置;
支持注册、注销,支持注册刷新及注册有效期设置;
支持设备目录查询应答;
支持心跳机制,支持心跳间隔、心跳检测次数设置;
支持移动设备位置(MobilePosition)订阅和通知;
支持国标GB/T28181—2016平台接入;
支持语音广播及语音对讲;
[实时水印]支持动态文字水印、png水印;
[镜像]Android平台支持前置摄像头实时镜像功能;
[实时静音]支持实时静音/取消静音;
[实时快照]支持实时快照;
[降噪]支持环境音、手机干扰等引起的噪音降噪处理、自动增益、VAD检测;
[外部编码前视频数据对接]支持YUV数据对接;
[外部编码前音频数据对接]支持PCM对接;
[外部编码后视频数据对接]支持外部H.264数据对接;
[外部编码后音频数据对接]外部AAC数据对接;
[扩展录像功能]支持录像相关功能。
技术接口设计
接口设计这块,我们分三个部分:一个是供Publisher实例调用的接口,一个是RTP发送相关的接口,还有一个是针对语音广播这块,实现的接收RTP数据播放接口。
先说供GB28181推送实例调用的接口:
/*+++++++++++++++GB28181相关接口+++++++++++++++*/ private native long nativeCreate(String server_ip, int port, String server_id, String server_domain, String device_id, String device_pwd, String device_name, int tcpudp, int heartbeat_interval, int reg_expire, String sdk_version); private native void nativeRegister(final long ptr); private native void nativeUnRegister(final long ptr); /*+++++++++++++++GB28181相关接口+++++++++++++++*/
再说RTP发送相关的接口:
/*+++++++++++++++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 start sip_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_player is null###",__FUNCTION__ ); #ifdef ANDROID_AS p_sua->media_info.dataQueue = new DataQueue(); p_sua->media_info.audio_player = new OpenSlEsPlayer(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((enum AVSampleFormat)frame->format)); p_sua->media_info.dataQueue->putPcmData(pdata); } }
上述接口说过之后,大家可能疑惑,信令交互呢?信令交互,我们是在Android上层实现。
如基础参数配置:
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协议不对、密码不对等注册参数不对 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 -> { //视频监控呼入 } EventHandlerStatus.EventState.PUEVT_CONNECT -> { //视频监控接通 } EventHandlerStatus.EventState.PUEVT_HANGUP -> { //视频监控挂断 } } } }
除了基础的Camera接口外,5.0开始新的Camera2数据依旧可以正常对接,感兴趣的开发者可酌情参考。
标签:编码,GB28181,支持,摄像机,state,接口,Android,type,id From: https://www.cnblogs.com/pttlink/p/17690968.html