佛山新网站制作特色,修改wordpress前端,狼窝网站更新升级通知,wordpress主题wpgo规范解读
GB28181 中的 “INVITE” 是会话初始协议#xff08;SIP#xff09;中的一种请求方法#xff0c;主要用于邀请一个或多个参与者加入特定的会话。在 GB28181 标准中#xff0c;“INVITE” 请求通常用于发起媒体流的传输请求。当一个设备想要接收来自另一个设备的媒…规范解读
GB28181 中的 “INVITE” 是会话初始协议SIP中的一种请求方法主要用于邀请一个或多个参与者加入特定的会话。在 GB28181 标准中“INVITE” 请求通常用于发起媒体流的传输请求。当一个设备想要接收来自另一个设备的媒体流时它会向目标设备发送一个 “INVITE” 请求其中包含了关于会话的描述信息如媒体类型、编码格式、传输协议等。
以下是 GB28181 中 “INVITE” 请求的一些关键特点和作用
一、发起会话
触发媒体流传输“INVITE” 请求是启动媒体流传输的关键步骤。当源设备发送 “INVITE” 请求时它向目标设备表明了希望建立一个媒体会话的意图。这个请求中包含了源设备支持的媒体格式、编码方式和传输协议等信息以便目标设备能够确定是否可以满足这些要求并接受会话邀请。携带会话描述信息“INVITE” 请求中通常包含会话描述协议SDP信息用于描述媒体流的特性。SDP 信息包括媒体类型音频、视频或两者兼有、编码格式、媒体的传输地址和端口等。目标设备通过解析 SDP 信息可以了解源设备的媒体能力并决定是否能够参与会话。
二、协商媒体参数
媒体能力协商在 GB28181 中不同的设备可能具有不同的媒体处理能力。通过 “INVITE” 请求和响应的交互过程可以进行媒体能力的协商。目标设备在接收到 “INVITE” 请求后会检查自己的媒体能力并根据源设备的要求进行相应的调整。如果目标设备无法满足源设备的要求它可以返回一个错误响应或者提出替代的媒体参数建议。编码格式选择“INVITE” 请求还可以用于协商媒体流的编码格式。不同的编码格式在压缩效率、图像质量和带宽需求等方面有所不同。通过协商可以选择一种双方都支持的编码格式以确保媒体流的正常传输和播放。
三、建立连接
确定传输路径一旦目标设备接受了 “INVITE” 请求双方就可以开始建立媒体流的传输连接。这个过程涉及确定媒体流的传输协议如 RTP/RTCP、传输地址和端口等信息。根据 GB28181 标准媒体流可以通过 IP 网络进行传输使用 UDP 或 TCP 协议。会话管理在媒体流传输过程中“INVITE” 请求所建立的会话可以通过其他 SIP 方法进行管理如 “BYE” 用于结束会话“ACK” 用于确认会话的建立等。这些方法可以帮助设备在会话期间进行状态监测、错误处理和资源管理。
Android GB28181技术实现
本文以大牛直播SDK的GB28181设备接入模块为例大牛直播SDK推出的Android平台GB28181接入SDKSmartGBD可实现不具备国标音视频能力的 Android终端通过平台注册接入到现有的GB/T28181—2016服务可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景。进入系统后先启动GB28181注册到平台等待国标平台发起回传请求。 class ButtonGB28181AgentListener implements View.OnClickListener {public void onClick(View v) {record_executor_.cancel_tasks();stopRecordDownloads(true);stopPlaybacks(true);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_.terminateAllAudioBroadcasts(true);gb28181_agent_.terminateAllPlays(true);// 目前测试下来,发送BYE之后,有些服务器会立即发送INVITE,是否发送BYE根据实际情况看gb28181_agent_.stop();btnGB28181Agent.setText(启动GB28181);}else {record_executor_.cancel_tasks();initPlaybacks(null);initRecordDownloads(null);if ( gb28181_agent_.start() ) {btnGB28181Agent.setText(停止GB28181);}}}
} GBSIPAgentPlayListener主要系GB28181的Invite、Ack、Bye等处理
public interface GBSIPAgentPlayListener {/**收到sPlay的实时视音频点播*/void ntsOnInvitePlay(String deviceId, SessionDescription sessionDescription);/**发送play invite response 异常*/void ntsOnPlayInviteResponseException(String deviceId, int statusCode, String errorInfo);/** 收到CANCEL play INVITE请求*/void ntsOnCancelPlay(String deviceId);/** 收到Ack*/void ntsOnAckPlay(String deviceId);/** 收到Bye*/void ntsOnByePlay(String deviceId);/** 不是在收到BYE Message情况下 终止Play*/void ntsOnTerminatePlay(String deviceId);/** Play会话对应的对话终止, 一般不会出发这个回调,目前只有在响应了200K, 但在64*T1时间后还没收到ACK,才可能会出发收到这个, 请做相关清理处理*/void ntsOnPlayDialogTerminated(String deviceId);
}
平台发起回传请求时ntsOnInvitePlay()来响应invite请求。
/** Camera2MainActivity.java* Author: daniusdk.com* WeChat: xinsheng120*/
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;}Log.i(TAG,ntsOnInvitePlay, device_id: device_id_, is_tcp: video_des.isRTPOverTCP() rtp_port: video_des.getPort() ssrc: video_des.getSSRC() address_type: video_des.getAddressType() address: video_des.getAddress());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);
}Override
public void ntsOnCancelPlay(String deviceId) {// 这里取消Play会话handler_.postDelayed(new Runnable() {Overridepublic void run() {Log.i(TAG, ntsOnCancelPlay, deviceId device_id_);destoryRTPSender();}private String device_id_;public Runnable set(String device_id) {this.device_id_ device_id;return this;}}.set(deviceId),0);
}
收到Ack后ntsOnAckPlay()处理后续逻辑
Override
public void ntsOnAckPlay(String deviceId) {handler_.postDelayed(new Runnable() {Overridepublic void run() {Log.i(TAG,ntsOnACKPlay, device_id: device_id_);InitAndSetConfig();stream_publisher_.SetGB28181RTPSender(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);boolean start_ret stream_publisher_.StartGB28181MediaStream();if (!start_ret) {stream_publisher_.try_release();destoryRTPSender();Log.e(TAG, Failed to start GB28181 service..);return;}startAudioRecorder();startLayerPostThread();}private String device_id_;public Runnable set(String device_id) {this.device_id_ device_id;return this;}}.set(deviceId),0);
}Override
public void ntsOnPlayInviteResponseException(String deviceId, int statusCode, String errorInfo) {// 这里要释放掉响应的资源Log.i(TAG, ntsOnPlayInviteResponseException, deviceId deviceId statusCode statusCode errorInfo: errorInfo);handler_.postDelayed(new Runnable() {Overridepublic void run() {Log.i(TAG, ntsOnPlayInviteResponseException, deviceId device_id_);destoryRTPSender();}private String device_id_;public Runnable set(String device_id) {this.device_id_ device_id;return this;}}.set(deviceId),0);
}
总结
GB28181 中的 “INVITE” 请求在媒体流传输中起着至关重要的作用它通过发起会话、协商媒体参数和建立连接等步骤实现了设备之间的媒体通信。在实际应用中需要根据具体的需求和场景合理地使用 “INVITE” 请求和其他 SIP 方法以确保媒体流的稳定传输和高质量播放。 文章转载自: http://www.morning.mzydm.cn.gov.cn.mzydm.cn http://www.morning.0small.cn.gov.cn.0small.cn http://www.morning.tpkxs.cn.gov.cn.tpkxs.cn http://www.morning.rkfxc.cn.gov.cn.rkfxc.cn http://www.morning.bpmdr.cn.gov.cn.bpmdr.cn http://www.morning.plpqf.cn.gov.cn.plpqf.cn http://www.morning.ykkrg.cn.gov.cn.ykkrg.cn http://www.morning.gbrdx.cn.gov.cn.gbrdx.cn http://www.morning.xcfmh.cn.gov.cn.xcfmh.cn http://www.morning.btmwd.cn.gov.cn.btmwd.cn http://www.morning.yrjhr.cn.gov.cn.yrjhr.cn http://www.morning.trzzm.cn.gov.cn.trzzm.cn http://www.morning.rzjfn.cn.gov.cn.rzjfn.cn http://www.morning.cykqb.cn.gov.cn.cykqb.cn http://www.morning.rkxqh.cn.gov.cn.rkxqh.cn http://www.morning.fsqbx.cn.gov.cn.fsqbx.cn http://www.morning.zsfooo.com.gov.cn.zsfooo.com http://www.morning.niukaji.com.gov.cn.niukaji.com http://www.morning.hrrmb.cn.gov.cn.hrrmb.cn http://www.morning.wtcd.cn.gov.cn.wtcd.cn http://www.morning.lqytk.cn.gov.cn.lqytk.cn http://www.morning.qrlsy.cn.gov.cn.qrlsy.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.bwrbm.cn.gov.cn.bwrbm.cn http://www.morning.knlyl.cn.gov.cn.knlyl.cn http://www.morning.dphmj.cn.gov.cn.dphmj.cn http://www.morning.mgwpy.cn.gov.cn.mgwpy.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn http://www.morning.pqbkk.cn.gov.cn.pqbkk.cn http://www.morning.qswws.cn.gov.cn.qswws.cn http://www.morning.kwcnf.cn.gov.cn.kwcnf.cn http://www.morning.fhhry.cn.gov.cn.fhhry.cn http://www.morning.bqpgq.cn.gov.cn.bqpgq.cn http://www.morning.jxwhr.cn.gov.cn.jxwhr.cn http://www.morning.jfzbk.cn.gov.cn.jfzbk.cn http://www.morning.twmp.cn.gov.cn.twmp.cn http://www.morning.ybnps.cn.gov.cn.ybnps.cn http://www.morning.tqrjj.cn.gov.cn.tqrjj.cn http://www.morning.hsrch.cn.gov.cn.hsrch.cn http://www.morning.rlsd.cn.gov.cn.rlsd.cn http://www.morning.lqchz.cn.gov.cn.lqchz.cn http://www.morning.slwqt.cn.gov.cn.slwqt.cn http://www.morning.gwzfj.cn.gov.cn.gwzfj.cn http://www.morning.rknhd.cn.gov.cn.rknhd.cn http://www.morning.wmdbn.cn.gov.cn.wmdbn.cn http://www.morning.zzfjh.cn.gov.cn.zzfjh.cn http://www.morning.jjhrj.cn.gov.cn.jjhrj.cn http://www.morning.xjbtb.cn.gov.cn.xjbtb.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.ltpmy.cn.gov.cn.ltpmy.cn http://www.morning.wmmqf.cn.gov.cn.wmmqf.cn http://www.morning.sgfpn.cn.gov.cn.sgfpn.cn http://www.morning.kwfnt.cn.gov.cn.kwfnt.cn http://www.morning.xzgbj.cn.gov.cn.xzgbj.cn http://www.morning.gtnyq.cn.gov.cn.gtnyq.cn http://www.morning.duckgpt.cn.gov.cn.duckgpt.cn http://www.morning.shnqh.cn.gov.cn.shnqh.cn http://www.morning.dlwzm.cn.gov.cn.dlwzm.cn http://www.morning.fyglr.cn.gov.cn.fyglr.cn http://www.morning.drndl.cn.gov.cn.drndl.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.wknbc.cn.gov.cn.wknbc.cn http://www.morning.rjmb.cn.gov.cn.rjmb.cn http://www.morning.qwdqq.cn.gov.cn.qwdqq.cn http://www.morning.ypcbm.cn.gov.cn.ypcbm.cn http://www.morning.jzlfq.cn.gov.cn.jzlfq.cn http://www.morning.xwlmg.cn.gov.cn.xwlmg.cn http://www.morning.hrtct.cn.gov.cn.hrtct.cn http://www.morning.lfdzr.cn.gov.cn.lfdzr.cn http://www.morning.rtryr.cn.gov.cn.rtryr.cn http://www.morning.frfnb.cn.gov.cn.frfnb.cn http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn http://www.morning.8yitong.com.gov.cn.8yitong.com http://www.morning.ysybx.cn.gov.cn.ysybx.cn http://www.morning.elmtw.cn.gov.cn.elmtw.cn http://www.morning.nnjq.cn.gov.cn.nnjq.cn http://www.morning.dhrbj.cn.gov.cn.dhrbj.cn http://www.morning.mbaiwan.com.gov.cn.mbaiwan.com