当前位置: 首页 > news >正文

网站设计与开发培训东莞市网站建设

网站设计与开发培训,东莞市网站建设,网页设计的流程ui,网站设计风格有几种背景 我们在做GB28181设备接入模块的时候#xff0c;考虑到好多设备性能一般#xff0c;我们一般的设计思路是#xff0c;先注册设备到平台侧#xff0c;平台侧发calalog过来#xff0c;获取设备信息#xff0c;然后#xff0c;设备侧和国标平台侧维持心跳#xff0c;…背景 我们在做GB28181设备接入模块的时候考虑到好多设备性能一般我们一般的设计思路是先注册设备到平台侧平台侧发calalog过来获取设备信息然后设备侧和国标平台侧维持心跳如果有位置订阅信息按照订阅时间间隔实时上报设备位置信息。 如果本地没有录像诉求或者国标平台侧不发起invite请求Android平台GB28181设备接入端不做视频编码甚至可以连摄像头都不打开等有实时录像或国标平台侧视频预览播放请求的时候再打开摄像头毕竟摄像头单纯的打开设备都有性能损耗甚至一些中低端记录仪还没编码就开始发热。 技术实现 本文以大牛直播SDK的Android平台GB28181设备接入侧为例先启动GB28181启动后直接注册到国标平台侧整体设计架构图如下 class ButtonGB28181AgentListener implements View.OnClickListener {public void onClick(View v) {stopAudioPlayer();destoryRTPReceiver();gb_broadcast_source_id_ null;gb_broadcast_target_id_ null;btnGB28181AudioBroadcast.setText(GB28181语音广播);btnGB28181AudioBroadcast.setEnabled(false);stopGB28181Stream();destoryRTPSender();if (null gb28181_agent_ ) {if( !initGB28181Agent() )return;}if (gb28181_agent_.isRunning()) {gb28181_agent_.terminateAllPlays(true);// 目前测试下来,发送BYE之后,有些服务器会立即发送INVITE,是否发送BYE根据实际情况看gb28181_agent_.stop();btnGB28181Agent.setText(启动GB28181);}else {if ( gb28181_agent_.start() ) {btnGB28181Agent.setText(停止GB28181);}}} } 其中initGB28181Agent()做的工作如下 private boolean initGB28181Agent() {if ( gb28181_agent_ ! null )return true;getLocation(context_);String local_ip_addr IPAddrUtils.getIpAddress(context_);Log.i(TAG, [daniusdk]initGB28181Agent local ip addr: local_ip_addr);if ( local_ip_addr null || local_ip_addr.isEmpty() ) {Log.e(TAG, [daniusdk]initGB28181Agent local ip is empty);return false;}gb28181_agent_ GBSIPAgentFactory.getInstance().create();if ( gb28181_agent_ null ) {Log.e(TAG, [daniusdk]initGB28181Agent create agent failed);return false;}gb28181_agent_.addListener(this);gb28181_agent_.addPlayListener(this);gb28181_agent_.addAudioBroadcastListener(this);gb28181_agent_.addDeviceControlListener(this);gb28181_agent_.addQueryCommandListener(this);// 必填信息gb28181_agent_.setLocalAddress(local_ip_addr);gb28181_agent_.setServerParameter(gb28181_sip_server_addr_, gb28181_sip_server_port_, gb28181_sip_server_id_, gb28181_sip_domain_);gb28181_agent_.setUserInfo(gb28181_sip_username_, gb28181_sip_password_);//gb28181_agent_.setUserInfo(gb28181_sip_username_, gb28181_sip_username_, gb28181_sip_password_);// 可选参数gb28181_agent_.setUserAgent(gb28181_sip_user_agent_filed_);gb28181_agent_.setTransportProtocol(gb28181_sip_trans_protocol_0?UDP:TCP);// GB28181配置gb28181_agent_.config(gb28181_reg_expired_, gb28181_heartbeat_interval_, gb28181_heartbeat_count_);com.gb.ntsignalling.Device gb_device new com.gb.ntsignalling.Device(34020000001380000001, 安卓测试设备, Build.MANUFACTURER, Build.MODEL,宇宙,火星1,火星, true);if (mLongitude ! null mLatitude ! null) {com.gb.ntsignalling.DevicePosition device_pos new com.gb.ntsignalling.DevicePosition();device_pos.setTime(mLocationTime);device_pos.setLongitude(mLongitude);device_pos.setLatitude(mLatitude);gb_device.setPosition(device_pos);gb_device.setSupportMobilePosition(true); // 设置支持移动位置上报}gb28181_agent_.addDevice(gb_device);if (!gb28181_agent_.createSipStack()) {gb28181_agent_ null;Log.e(TAG, [daniusdk]initGB28181Agent gb28181_agent_.createSipStack failed.);return false;}boolean is_bind_local_port_ok false;// 最多尝试5000个端口int try_end_port gb28181_sip_local_port_base_ 5000;try_end_port try_end_port 65536 ?65536: try_end_port;for (int i gb28181_sip_local_port_base_; i try_end_port; i) {if (gb28181_agent_.bindLocalPort(i)) {is_bind_local_port_ok true;break;}}if (!is_bind_local_port_ok) {gb28181_agent_.releaseSipStack();gb28181_agent_ null;Log.e(TAG, [daniusdk]initGB28181Agent gb28181_agent_.bindLocalPort failed.);return false;}if (!gb28181_agent_.initialize()) {gb28181_agent_.unBindLocalPort();gb28181_agent_.releaseSipStack();gb28181_agent_ null;Log.e(TAG, [daniusdk]initGB28181Agent gb28181_agent_.initialize failed.);return false;}return true; } 注册成功后会把国标平台侧返回200 OK时带的时间返回上来便于Android平台GB28181设备侧做校时如有注册异常也会返回 Override public void ntsRegisterOK(String dateString) {Log.i(TAG, ntsRegisterOK Date: (dateString! null? dateString : )); }Override public void ntsRegisterTimeout() {Log.e(TAG, ntsRegisterTimeout); }Override public void ntsRegisterTransportError(String errorInfo) {Log.e(TAG, ntsRegisterTransportError error: (errorInfo ! null?errorInfo :)); } 周期性的心跳如有异常我们也回调到上层 Override public void ntsOnHeartBeatException(int exceptionCount, String lastExceptionInfo) {Log.e(TAG, ntsOnHeartBeatException heart beat timeout count reached, count: exceptionCount, exception info: (lastExceptionInfo!null?lastExceptionInfo:));// 停止信令, 然后重启handler_.postDelayed(new Runnable() {Overridepublic void run() {Log.i(TAG, gb28281_heart_beart_timeout);stopAudioPlayer();destoryRTPReceiver();if (gb_broadcast_source_id_ ! null gb_broadcast_target_id_ ! null gb28181_agent_ ! null)gb28181_agent_.byeAudioBroadcast(gb_broadcast_source_id_, gb_broadcast_target_id_);gb_broadcast_source_id_ null;gb_broadcast_target_id_ null;btnGB28181AudioBroadcast.setText(GB28181语音广播);btnGB28181AudioBroadcast.setEnabled(false);stopGB28181Stream();destoryRTPSender();if (gb28181_agent_ ! null) {gb28181_agent_.terminateAllPlays(true);Log.i(TAG, gb28281_heart_beart_timeout sip stop);gb28181_agent_.stop();String local_ip_addr IPAddrUtils.getIpAddress(context_);if (local_ip_addr ! null !local_ip_addr.isEmpty() ) {Log.i(TAG, gb28281_heart_beart_timeout get local ip addr: local_ip_addr);gb28181_agent_.setLocalAddress(local_ip_addr);}Log.i(TAG, gb28281_heart_beart_timeout sip start);gb28181_agent_.start();}}},0); } 如果国标平台侧订阅了实时位置信息我们的处理如下 Override public void ntsOnDevicePositionRequest(String deviceId, int interval) {handler_.postDelayed(new Runnable() {Overridepublic void run() {getLocation(context_);if (mLongitude ! null mLatitude ! null) {com.gb.ntsignalling.DevicePosition device_pos new com.gb.ntsignalling.DevicePosition();device_pos.setTime(mLocationTime);device_pos.setLongitude(mLongitude);device_pos.setLatitude(mLatitude);if (gb28181_agent_ ! null ) {gb28181_agent_.updateDevicePosition(device_id_, device_pos);}}}private String device_id_;private int interval_;public Runnable set(String device_id, int interval) {this.device_id_ device_id;this.interval_ interval;return this;}}.set(deviceId, interval),0); }如果平台侧发起预览请求我们的处理如下 Override public void ntsOnInvitePlay(String deviceId, SessionDescription session_des) {handler_.postDelayed(new Runnable() {Overridepublic void run() {// 先振铃响应下gb28181_agent_.respondPlayInvite(180, device_id_);MediaSessionDescription video_des null;SDPRtpMapAttribute ps_rtpmap_attr null;// 28181 视频使用PS打包VectorMediaSessionDescription video_des_list session_des_.getVideoPSDescriptions();if (video_des_list ! null !video_des_list.isEmpty()) {for(MediaSessionDescription m : video_des_list) {if (m ! null m.isValidAddressType() m.isHasAddress() ) {video_des m;ps_rtpmap_attr video_des.getPSRtpMapAttribute();break;}}}if (null video_des) {gb28181_agent_.respondPlayInvite(488, device_id_);Log.i(TAG, ntsOnInvitePlay get video description is null, response 488, device_id: device_id_);return;}if (null ps_rtpmap_attr) {gb28181_agent_.respondPlayInvite(488, device_id_);Log.i(TAG, ntsOnInvitePlay get ps rtp map attribute is null, response 488, device_id: device_id_);return;}long rtp_sender_handle libPublisher.CreateRTPSender(0);if ( rtp_sender_handle 0 ) {gb28181_agent_.respondPlayInvite(488, device_id_);Log.i(TAG, ntsOnInvitePlay CreateRTPSender failed, response 488, device_id: device_id_);return;}gb28181_rtp_payload_type_ ps_rtpmap_attr.getPayloadType();gb28181_rtp_encoding_name_ ps_rtpmap_attr.getEncodingName();libPublisher.SetRTPSenderTransportProtocol(rtp_sender_handle, video_des.isRTPOverUDP()?0:1);libPublisher.SetRTPSenderIPAddressType(rtp_sender_handle, video_des.isIPv4()?0:1);libPublisher.SetRTPSenderLocalPort(rtp_sender_handle, 0);libPublisher.SetRTPSenderSSRC(rtp_sender_handle, video_des.getSSRC());libPublisher.SetRTPSenderSocketSendBuffer(rtp_sender_handle, 2*1024*1024); // 设置到2MlibPublisher.SetRTPSenderClockRate(rtp_sender_handle, ps_rtpmap_attr.getClockRate());libPublisher.SetRTPSenderDestination(rtp_sender_handle, video_des.getAddress(), video_des.getPort());if ( libPublisher.InitRTPSender(rtp_sender_handle) ! 0 ) {gb28181_agent_.respondPlayInvite(488, device_id_);libPublisher.DestoryRTPSender(rtp_sender_handle);return;}int local_port libPublisher.GetRTPSenderLocalPort(rtp_sender_handle);if (local_port 0) {gb28181_agent_.respondPlayInvite(488, device_id_);libPublisher.DestoryRTPSender(rtp_sender_handle);return;}Log.i(TAG,get local_port: local_port);String local_ip_addr IPAddrUtils.getIpAddress(context_);MediaSessionDescription local_video_des new MediaSessionDescription(video_des.getType());local_video_des.addFormat(String.valueOf(ps_rtpmap_attr.getPayloadType()));local_video_des.addRtpMapAttribute(ps_rtpmap_attr);local_video_des.setAddressType(video_des.getAddressType());local_video_des.setAddress(local_ip_addr);local_video_des.setPort(local_port);local_video_des.setTransportProtocol(video_des.getTransportProtocol());local_video_des.setSSRC(video_des.getSSRC());if (!gb28181_agent_.respondPlayInviteOK(device_id_,local_video_des) ) {libPublisher.DestoryRTPSender(rtp_sender_handle);Log.e(TAG, ntsOnInvitePlay call respondPlayInviteOK failed.);return;}gb28181_rtp_sender_handle_ rtp_sender_handle;}private String device_id_;private SessionDescription session_des_;public Runnable set(String device_id, SessionDescription session_des) {this.device_id_ device_id;this.session_des_ session_des;return this;}}.set(deviceId, session_des),0); } 收到Ack后才开始真正发送数据 Override public void ntsOnAckPlay(String deviceId) {handler_.postDelayed(new Runnable() {Overridepublic void run() {Log.i(TAG,ntsOnACKPlay, device_id: device_id_);if (!isRTSPPublisherRunning !isPushingRtmp !isRecording) {InitAndSetConfig();}libPublisher.SetGB28181RTPSender(publisherHandle, gb28181_rtp_sender_handle_, gb28181_rtp_payload_type_, gb28181_rtp_encoding_name_);//libPublisher.SetGBTCPConnectTimeout(publisherHandle, 10*60*1000);//libPublisher.SetGBInitialTCPReconnectInterval(publisherHandle, 1000);//libPublisher.SetGBInitialTCPMaxReconnectAttempts(publisherHandle, 3);int startRet libPublisher.StartGB28181MediaStream(publisherHandle);if (startRet ! 0) {if (!isRTSPPublisherRunning !isPushingRtmp !isRecording) {if (publisherHandle ! 0) {long handle publisherHandle;publisherHandle 0;libPublisher.SmartPublisherClose(handle);}}destoryRTPSender();Log.e(TAG, Failed to start GB28181 service..);return;}if (!isRTSPPublisherRunning !isPushingRtmp !isRecording) {CheckInitAudioRecorder();}startLayerPostThread();isGB28181StreamRunning true;}private String device_id_;public Runnable set(String device_id) {this.device_id_ device_id;return this;}}.set(deviceId),0); } 总结 除此之外还有语音广播和语音对讲这里不再赘述GB28181规范普及之前要想从外网远程访问局域网内的监控设备非常麻烦一般要么RTSP转RTMP推到RTMP服务器此外还要单独构建信令。GB28181规范让远程、跨网访问监控设备更方便把GB28181平台部署到外网后前端设备只要注册到国标服务器就可以被远程访问、管理和调取视频。但由于设备侧性能并不是非常好如果要有好的稳定性和性能要求需尽可能的减少性能消耗按需打开摄像头、按需编码等。
http://www.w-s-a.com/news/798923/

相关文章:

  • 电子商务网站开发与应用的介绍怎么查询域名是否备案
  • 想做一个自己设计公司的网站怎么做的权威发布型舆情回应
  • 做ppt用的音效网站python基础教程网易
  • 可以做免费广告的网站有哪些做视频赚钱的国外网站
  • 苏州做物流网站电话郑州网站高端网站设计
  • 网站建设音乐插件怎么弄wordpress添加数据库文件
  • 汽车行业做网站福建省第二电力建设公司网站
  • delphi做网站开发商城网站建设价位
  • 网站宣传片3 阐述网站建设的步骤过程 9分
  • 公司网站怎么做站外链接哪里有做胎儿dna亲子鉴定
  • 潍坊做电商的网站建设wordpress 特效主题
  • 做网站和app哪个难公司网上注册系统
  • 关于网站建设外文文献系部网站建设
  • 高端设计网站都有哪些月付网站空间提供商
  • 家政 东莞网站建设优化设计官方电子版
  • 做网站如何使用网页插件上海造价信息网
  • 承德网站制作加盟天津做优化的网站有多少家
  • 北京市保障性住建设投资中心网站首页专业做网站联系电话
  • 镇江网站建设方式优化单页面网站教程
  • 做手机网站公司北京网页设计公司兴田德润实惠
  • 域名申请好了 要怎么做网站百度推广开户渠道
  • 电商网站建设 数商云焦作黄河交通学院
  • 做一个网站成本多少太原网站维护
  • 网站建设制作设计优化怎么制作网页步骤
  • 花都区pc端网站建设画册设计多少钱一页
  • 国外买域名的网站廊坊网站制作网页
  • 抚顺市城市建设档案馆网站制作网页时经常用的一种动态位图格式是
  • 公司网站站群是什么运营网站
  • 昆明网站建设大全安徽教育机构网站建设
  • 广州网站排名怎么优化中华衣柜网