天天看点

android实现onvif(rtsp)转GB28181

     现在因为众所周知的原因,海思的芯片价格疯狂的上涨, 行业的摄像机多采用华为海思的芯片,其制作成本水涨船高。

     我们其实可以通过一个低配的android盒子,装一个apk,就可以实现将普通的onvif摄像头转成GB28181的摄像头接入到GB28181平台,实现GB28181的联网共享。

     其数据流逻辑图如下:

android实现onvif(rtsp)转GB28181

由上图可知,通过android实现一个onvif转gb28181的网关,安装在android的设备上即可。该网关首先要具有onvif搜索功能,搜索到设备,通过设备的onvif用户名和密码,获取设备的rtsp url与设备信息,然后以GB28181视音频源设备的身份注册到GB28181平台,每个onvif设备以其一个通道的身份接入,比如局域网内有5个设备,那么转换为GB28181其实就是以一个带有5个视音频通道的设备注册到GB28181平台中。实现需要实现onvif的jni,同时实现gb28181设备端的JNI。由于GB28181设备端的其他文章已描述,可以参考文件https://blog.csdn.net/wangjie_jack/article/details/102968738

  本文着重描述onvif的jni接口,如下:

public static native void OnvifInit(String  localip);

	public static native void OnvifUnInit();
    //查找设备
	public static native String[] OnvifDiscoveryDevice();
    //获取设备的媒体url
	public static native String OnvifGetUrl(String deviceurl, String user, String pwd);
    //获取设备信息
	public static native DeviceInformation  OnvifGetDeviceInformation(String jdevice_url, String user, String psw);
           

其中类DeviceInformation为设备信息类,定义如下:

package com.shiyue.onvif;

public class DeviceInformation
{
	public String szManufacturer;
	public String szModel;
	public String szFirmwareVersion;
	public String szSerialNumber;
	public String szHardwareId;

	public DeviceInformation(String Manufacturer, String Model,String FirmwareVersion,String SerialNumber,String HardwareId)
	{
		this.szManufacturer = Manufacturer;
		this.szModel = Model;
		this.szFirmwareVersion = FirmwareVersion;
		this.szSerialNumber = SerialNumber;
		this.szHardwareId = HardwareId;
	}
}
           

android基于onvif进行设备搜索代码如下:

//设备搜索
		ImageButton imageButton = findViewById(R.id.search);
		imageButton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				progressSearch.setVisibility(View.VISIBLE);
				new Thread(new Runnable(){
					@Override
					public void run() {
						SYGbtDeviceApp.getInstance().urls = OnVifNative.OnvifDiscoveryDevice();
						if(SYGbtDeviceApp.getInstance().urls.length > 0)
						{
							SYGbtDeviceApp.getInstance().deviceurls = new String[SYGbtDeviceApp.getInstance().urls.length];
							System.arraycopy(SYGbtDeviceApp.getInstance().urls, 0, SYGbtDeviceApp.getInstance().deviceurls, 0, SYGbtDeviceApp.getInstance().urls.length);
						}
						Message msg = Message.obtain();
						msg.what = SYGbtDeviceApp.getInstance().urls.length ;
						sthandler.sendMessage(msg);
					}
				}).start();
			}
		});
           

输入onvif用户名和密码,获取设备的rtsp url代码如下:

//弹用户名和密码对话框
					final int index = position;
					LayoutInflater factory = LayoutInflater.from(ActivityDevice.this);
					final View textOnvifView = factory.inflate(R.layout.dialog_set_user_pwd, null);
					final EditText edit_onvif_user = (EditText) textOnvifView.findViewById(R.id.onvif_user);
					final EditText edit_onvif_pwd  = (EditText)textOnvifView.findViewById(R.id.onvif_pwd);
					AlertDialog.Builder ad1 = new AlertDialog.Builder(ActivityDevice.this);
					ad1.setTitle("设置onvif用户密码:");
					ad1.setIcon(R.mipmap.set);
					ad1.setView(textOnvifView);
					ad1.setPositiveButton("保存", new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int i) {
							String url = OnVifNative.OnvifGetUrl(SYGbtDeviceApp.getInstance().urls[index], edit_onvif_user.getText().toString(), edit_onvif_pwd.getText().toString());
							if(url != null)
								SYGbtDeviceApp.getInstance().urls[index] = url;
							mAdapter.notifyDataSetChanged();

							//添加到map
							OnvifUser ou = new OnvifUser();
							ou.user = edit_onvif_user.getText().toString();
							ou.pwd = edit_onvif_pwd.getText().toString();
							SYGbtDeviceApp.getInstance().onvif_map.put(SYGbtDeviceApp.getInstance().deviceurls[index],ou);
						}
					});
					ad1.setNegativeButton("取消", new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int i) {

						}
					});
					ad1.show();// 显示对话框
           

打开demo app,搜索后会出现设备的url列表,点击输入onvif用户名和密码后会变成rtsp的url,如下图:

android实现onvif(rtsp)转GB28181

点击列表中指定的设备列表,可以进行设备的实时视频预览,如下图:

android实现onvif(rtsp)转GB28181

如果点击接入平台,注册到GB28181平台上后,平台上会出现1个带有5个视频通道的设备,点击任意通道都可以通过GB28181协议预览视频,如下图(以视跃的realgbs平台为例):

android实现onvif(rtsp)转GB28181

demo可免费下载并免费试用,下载地址

更多信息

e-mail: [email protected]

tel: 13971177602

web:www.founu.com