GB28181 设备端(国标设备,车载,单兵)的实现心得

     GB28181标准制定多年,应用也逐渐广泛,从传统固定的摄像头到可移动的设备,对于前端设备的形态要求也十分多样化。比如单兵,车载等行业领域,传统的摄像头无法满足其便携性,以及丰富的功能接口要求。

     单兵,车载,以及执法仪等使用场景,除了对设备端的便携性外,对于网络的布局基本都是4G/5G的环境,即设备都使用运营商提供的4G物联网卡,对于网络互联互通以及视音频的质量也提出了很高的要求。

     对于GB28181在于公网的使用,除了GB28181-2016的完善外,其实对于技术的实现也是一个变革,如何在低带宽,不可靠的连接下实现流畅音视频交互是作为移动GB28181设备端很有意义的事情。

     从数据流通信来讲,设备端与国标平台的交互主要是sip信令和媒体流(rtp/ps流),设备端做的人性化一点自然会提供web配置页面,那么对外也提供http的访问协议。所以其数据流图如下:

 

        我们完整的实现了设备端全部的GB28181协议,这个协议比较多,因为我们的实现不仅仅是音视频,对讲,云台,录像,报警,位置定位 等功能模块都需要。

        但是国标设备端是一个被动性的终端,几乎所有GB28181的业务发起都是被动的,被客户端发起的(比如被预览,对讲,都是受控于客户端的,无需设备端主动发起交互),所以功能很多,但是其实封装成sdk,接口反而很简单。主要是一些配置接口,比如设置对讲模式(可以使用默认模式,我们支持外网对讲),配置接口完成后,只需要注册接口注册到平台上之后就可以坐等奇迹的出现了,后面的业务都是接收平台的GB信令,进行对应的响应了。

       将GB28181设备端实现封装成sdk后,接口如下:

 //注册到国标平台
 public int open(String serverip,String localip,int serverport,int localport,String serverid,String userid,String userpwd);
 //退出注册
 public void close();
 //设置设备的经纬度位置
 setPosition( double longitude,double latitude);
 //开启采集音视流
 public boolean start(int cameraId, SurfaceHolder surfaceHolder);
 //停止采集音视频流
 public void stop();

    其实注册上平台后,就已经大功告成,调用代码如下:

  

    public void startCapture() {
        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
        String channelid = sharedPrefs.getString("channelID", "");
        String localip = sharedPrefs.getString("localip", "");
        int localport = PreferenceUtil.getPrefInt(sharedPrefs, "port", 5860);
        int talkprotocol = PreferenceUtil.getPrefInt(sharedPrefs, "protocol", 3);
        boolean isEnableTalk  = PreferenceUtil.getPrefBoolean(sharedPrefs, "enabletalk", false);
        GbtDeviceJni.gbtdevice_setTalkEnable(isEnableTalk);

        //视频设置
        int pix_index  = PreferenceUtil.getPrefInt(sharedPrefs, "video_pix", 0);
        int frame_rate = PreferenceUtil.getPrefInt(sharedPrefs, "video_framerate", 15);
        int video_rate = PreferenceUtil.getPrefInt(sharedPrefs, "video_rate", 512);
        int video_gop  = PreferenceUtil.getPrefInt(sharedPrefs, "video_gop", 2);
        int video_codec  = PreferenceUtil.getPrefInt(sharedPrefs, "video_codec", 0);
        int audio_codec  = PreferenceUtil.getPrefInt(sharedPrefs, "audio_codec", 0);
        int width  = 640;
        int height = 480;

        if(pix_index == 0)
        {
            width  = 640;
            height = 480;
        }
        else if(pix_index == 1)
        {
            width  = 1280;
            height = 720;
        }
        else if(pix_index == 2)
        {
            width  = 1920;
            height = 1080;
        }
        else if(pix_index == 3)
        {
            width  = 3840;
            height = 2160;
        }

        MFormat fmt = new MFormat();
        fmt.width  = width;
        fmt.height = height;
        if(video_codec == 0)
            fmt.codec = MediaType.MCODEC_H264;
        else
            fmt.codec = MediaType.MCODEC_H265;
        fmt.fps = frame_rate;
        fmt.gop = video_gop;
        fmt.bitrate = 1024 * video_rate;
        if(audio_codec == 1)
            fmt.audioCodec = MediaType.MCODEC_G711U;
        else if(audio_codec == 2)
            fmt.audioCodec = MediaType.MCODEC_AAC;
        else
            fmt.audioCodec = MediaType.MCODEC_G711A;
        fmt.channels = 1;
        fmt.sampleRate = 8000;

        gbtdevice = SYGbtDeviceApp.getInstance().gbtdevice;
        gbtdevice.setFormat(fmt);

        //字幕叠加
        configOsd();
        if(localip == null || localip.equals("") )
            localip = NetUtil.getLocalAddr(this);
        if(localip == null)
        {
            localip = "0.0.0.0";
            showToast("请确认该设备网络是否已连接.");
        }
        int cameraId = 0;
        String serverip = m_serverip.getText().toString();
        String serverid = m_serverid.getText().toString();
        String userid   = m_userid.getText().toString();
        String userpwd  = m_userpwd.getText().toString();
        int serverport = Integer.parseInt(m_serverport.getText().toString());
        //注册成功回调
        GbtTrack.setloginhandler(sthandler);
        //采集画面和显示画面旋转90度
        gbtdevice.setRotation(90);
        gbtdevice.setDisplayOrientation(90);
        //注册到GB平台
        int ret = gbtdevice.open(serverip,localip,serverport,localport,serverid,userid,userpwd);
        if (ret == 0) {
           //打开音视频采集流
           boolean isStart = gbtdevice.start(cameraId, surfaceView.getHolder());
            if(isStart == false)
            {
                showToast("该设备的camera不支持该分辨率!");
                gbtdevice.close();
                gbtdevice = null;
                return;
            }
        }
        else if(ret == -1)
        {
            showToast("camera打开 失败.");
        }
        else if(ret == -2)
        {
            showToast("GB28181注册 失败.");
        }
        else
        {
            showToast("其他未知错误.");
        }
        //设置对讲模式,我们支持外网对讲
        GbtDeviceJni.gbtdevice_setTalkMode(gbtdevice.GetDeviceHandle(), talkprotocol);
        SharedPreferences settings = this.getSharedPreferences(this.getClass().getName(), 0);
        Editor editor = settings.edit();
        editor.putString("serveripd", m_serverip.getText().toString());
        editor.putString("serverport", m_serverport.getText().toString());
        editor.putString("serverid", m_serverid.getText().toString());
        editor.putString("userid", m_userid.getText().toString());
        editor.putString("userpwd", m_userpwd.getText().toString());
        editor.commit();
    }

     调用的代码很简单,但是功能还是很丰富的,以上实现了全套的GB28181设备端的协议,对于一些公网使用情况并进行了优化和扩展,比如支持外网的持续对讲,对讲时支持回声消除。

     下载测试:http://www.founu.com/a/product/gb28181/30.html

     主要功能:

      1.H264/H265 多分辨率码率的音视频预览

      2.4G外网的双向对讲,回声消除

      3.录像回放和录像下载

      4.报警上报

      5.位置信息订阅

  通过以上代码函数,就可以实现注册到GB28181平台,然后可以进行呼叫和对讲了。如下图:

   

更多信息

e-mail: yujesoft@163.com

tel: 13971177602

web:www.founu.com

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GB28181设备SDK是一种用于实现GB28181视频监控设备标准的软件开发工具包。该SDK可以帮助开发人员快速、高效地构建符合GB28181标准的设备应用程序。 GB28181设备SDK主要包括以下功能: 1. 实时视频传输:可以通过该SDK实现设备的实时视频传输功能,将视频数据实时传输给平台或客户应用程序。 2. 视频录像回放:支持设备的视频录像回放功能,通过SDK可以实现设备存储视频数据的回放操作。 3. 网络管理:提供网络管理接口,可以对设备网络参数进行配置和管理,确保设备的正常运行。 4. 设备状态监控:可以监控设备的运行状态,包括设备连接状态、网络质量等,及时发现并解决设备故障。 5. 报警处理:支持设备的报警处理功能,可以将设备上的报警信息实时传输给平台或客户应用程序。 6. 设备配置管理:提供对设备配置参数的管理,包括设备ID、设备名称、设备通信参数等。 7. SDK集成支持:该SDK可以被集成到设备厂商的产品中,为设备提供符合GB28181标准的功能。 通过使用GB28181设备SDK,用户可以轻松地开发出符合GB28181标准的设备应用程序,实现与平台和客户的数据交互和管理。这样可以大大提高设备的互操作性和兼容性,并且简化了设备的管理和运维工作。 ### 回答2: GB28181设备SDK是基于GB28181协议开发的软件开发工具包(SDK)。GB28181是中国国家标准化管理委员会发布的一个视频监控领域的标准协议,用于实现视频监控系统中设备之间的互联互通。 GB28181设备SDK提供了一系列的函数和接口,用于设备开发人员快速集成和开发符合GB28181标准的设备软件。通过SDK,开发人员可以方便地实现设备的注册、邀请和控制等基本功能,包括视频的编码、解码、存储和传输等核心技术。 使用GB28181设备SDK可以帮助开发人员实现以下功能: 1. 设备注册和呼叫管理:可以通过调用SDK提供的函数实现设备的注册和呼叫等管理功能,包括设备的状态维护和传输通道的建立。 2. 视频编码与解码:SDK提供了视频编码和解码的接口,可以将实时视频数据进行压缩和解压缩,实现视频的传输和显示。 3. 视频存储和传输:SDK支持将视频数据保存到本地存储设备,或者通过网络传输到其他设备。可以实现视频的实时监控和远程回放等功能。 4. 设备控制和事件处理:SDK提供了设备控制和事件处理的接口,可以实现设备的远程控制和事件的处理,如设备的PTZ控制和告警事件的响应等。 总之,GB28181设备SDK是一款用于开发符合GB28181协议的设备软件的工具包,通过使用SDK可以方便地实现设备的注册、呼叫、编码、解码、存储、传输和控制等功能。它为开发人员提供了丰富的接口和功能,帮助他们更快速、高效地进行开发工作。 ### 回答3: GB28181设备SDK是一种用于实现GB28181协议的网络视频监控设备的软件开发工具包。该SDK可以帮助开发者快速集成和开发符合GB28181标准的视频监控设备。它提供了一系列的接口和功能,包括视频流采集、编码压缩、网络传输、远程控制等,使开发者能够在满足GB28181标准的前提下,轻松地开发出稳定、高效的设备GB28181设备SDK的特点有以下几点: 1.易于使用:该SDK提供了简洁、易用的接口和文档,以及详细的示例代码,使开发者能够快速上手。无论是初学者还是有经验的开发者都可以使用它进行开发。 2.高度兼容:SDK严格遵循GB28181的规范,保证了设备与其他符合协议的设备之间的兼容性。无论是与其他GB28181设备进行集成,还是与监控中心进行对接,都可以实现无缝连接。 3.稳定性和可靠性:SDK经过了大量的测试和验证,具有很好的稳定性和可靠性。它能够实时采集、编码、传输视频流,并保证数据的完整性和可靠性,使得设备可以长时间稳定运行。 4.灵活性:SDK提供了丰富的配置选项,开发者可以根据实际需求进行定制。可以根据设备的性能、网络环境等因素进行调整,以达到最佳的性能和效果。 总之,GB28181设备SDK是一种强大的工具,可以帮助开发者快速开发符合GB28181标准的视频监控设备。它提供了丰富的功能和灵活的配置选项,能够实现稳定、高效的视频传输和远程控制,满足不同应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值