用android实现GB28181的视音频前端设备
目前几乎主流的厂家,比如接入海康、大华、华为、科达、宇视等等各家摄像头都支持GB28181的协议,但是如果没有摄像头怎么办?需要买吗?答案是否定的,其实我们可以用android手机写一个app支持国标28181协议。
国标28181协议对于前端设备(就是摄像机)而言,主要就是实现注册与退出注册,会话保活,返回目录查询结果,响应invite,返回录像查询结果,响应录像回放,语音对讲。
当然用手机做,要做就支持4G/5G。我们得考虑媒体流网络穿透啦,网络穿透是很简单的,P2P采用ace,用服务器转发就可以直接用rtp端口反向给服务器发数据报即可。
整个过程还是一如既往的简单可控,针对gb28181的协议进行开发。这里主要说一下重点部分,语音对讲,刚实现时,其实是有回音的和噪音的,所以对手机端采集的声音去噪和回声消除其实是很重要的。
对于回音的消除,好在现在手机都已经很好的从硬件层面支持了,我们直接使用android的AcousticEchoCanceler进行回声消除,首先判断手机是否支持AcousticEchoCanceler,但是我想到9102年底了,找到不支持的手机很难了吧,如果你的手机中了大奖确实不支持,可以使用webrtc的aec功能,这个几年前做过,用webrtc的aec一定要计算好延时,保证输入和输出的音频数据。我们这里只讲支持AcousticEchoCanceler的情况,同样作为回声消除功能,则需要传入AudioRecord的信息,只需要传递其sessionid即可,然后就可以开启回声消除了,代码如下:
private AcousticEchoCanceler acousticEchoCanceler;
public void initAEC() {
if (AcousticEchoCanceler.isAvailable()) {
if (acousticEchoCanceler == null) {
acousticEchoCanceler = AcousticEchoCanceler.create(getAudioSessionId());
Log.d(TAG, "initAEC: ---->" + acousticEchoCanceler + "\t" + getAudioSessionId());
if (acousticEchoCanceler == null) {
Log.e(TAG, "initAEC: ----->AcousticEchoCanceler create fail.");
} else {
acousticEchoCanceler.setEnabled(true);
}
}
}
}
去噪采用的webrtc的audio_processing模块,因为是c++代码,以下部分在jni实现,WebRtcNs_Process函数可以进行很好的去噪,只要知道通道,采样率就可以了,首先初始化创建去噪句柄,代码如下:
if (WebRtcNs_Create(&denoise_handle))
{
denoise_handle = NULL;
return S_FALSE;
}
WebRtcNs_Init(denoise_handle, dwSampleRate);
WebRtcNs_set_policy(denoise_handle, 3);
然后就可以愉快的去噪了:
WebRtcNs_Process(denoise_handle, src_buf, 0, des_buf, 0);
按照以上思路,我们完成了android 上的gb28181摄像机。支持4G/5G网络,因为GB28181的设备属性里除了行政区划外,还有经纬度等位置信息的,所以我们也支持了手机的定位信息。如下图:
通过这种方式,以后调试gb28181协议不需要用各种设备了,简洁,方便。
app提供了下载地址 : app下载地址,提取码qjhz
这是我们的网站 www.founu.com,欢迎大家交流合作。