GB28181基于TCP协议的视音频媒体传输探究及实现

我们先看看官方规范针对TCP协议的视音频传输描述:

实时视频点播、历史视频回放与下载的 TCP媒体传输应支持基于RTP封装的视音频PS流,封装格式参照IETFRFC4571。

流媒体服务器宜同时支持作为TCP媒体流传输服务端和客户端。默认情况下,前端设备向流媒体服务器发送媒体流时前端设备应作为TCP媒体流传输客户端,流媒体服务器作为 TCP媒体流传输服务端;同级或跨级流媒体服务器间基于 TCP协议传输视频流时,媒体流的接收方宜作为TCP媒体流传输服务端。

媒体流的发送方和接收方可扩展SDP参数进行TCP媒体流传输服务端和客户端的协商,协商机制参考附录 F及IETFRFC4571的定义。

这里我们看个INVITE信令交互示例:

INVITE sip:34020000001320000001@3402000000 SIP/2.0
Via: SIP/2.0/TCP 192.168.0.105:15060;rport;branch=z9hG4bK630055772
From: <sip:34020000002000000001@3402000000>;tag=562055772
To: <sip:34020000001320000001@3402000000>
Call-ID: 589055668
CSeq: 183 INVITE
Content-Type: APPLICATION/SDP
Contact: <sip:34020000002000000001@192.168.0.105:15060>
Max-Forwards: 70
User-Agent: LiveGB28181
Subject: 34020000001320000001:0200000001,34020000002000000001:0
Content-Length: 222v=0
o=34020000001320000001 0 0 IN IP4 192.168.0.105
s=Play
c=IN IP4 192.168.0.105
t=0 0
m=video 30076 RTP/AVP 96 97 98
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:97 MPEG4/90000
a=rtpmap:98 H264/90000
y=0200000001

判断媒体流走TCP还是UDP,主要看这里:

m=video 30076 RTP/AVP 96 97 98

传输方式采用“RTP/AVP”标识传输层协议为 RTP over UDP,采用“TCP/RTP/AVP”标识传输层协议为 RTP over TCP,需要注意的是,我们实际对接的时候,部分厂商SDP非常随意,有的甚至直接标记个tcp,这让我们对接的时候,很困惑。

技术实现:

 

本文以大牛直播SDK的Android平台GB28181设备接入端为例,启动GB28181,完成注册、catalog等交互后,Invite上来后,设置媒体流通过TCP还是UDP发送出去:

@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打包Vector<MediaSessionDescription> 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);
}

接口设计如下:

/***设置 RTP Sender传输协议** @param rtp_sender_handle, CreateRTPSender返回值* @param transport_protocol, 0:UDP, 1:TCP, 默认是UDP** @return {0} if successful*/public native int SetRTPSenderTransportProtocol(long rtp_sender_handle, int transport_protocol);

以上是GB28181基于TCP协议的视音频媒体传输探究及实现,感兴趣的开发者,可以查看相关协议规范,根据需求实现自己的业务逻辑即可。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qq浏览器怎么导入其他浏览器收藏夹

现在浏览器种类非常多&#xff0c;有时候由于特殊需要&#xff0c;一个电脑有好几个浏览器&#xff0c;在使用浏览器的过程中收藏夹里的东西非常的多&#xff0c;但时间越久&#xff0c;收藏夹东西累计得越来也多&#xff0c;我们记性再好也会偶尔记不住自己需要的东西是在哪个…

Android平台GB28181接入端如何对接UVC摄像头?

我们在对接Android平台GB28181接入的时候&#xff0c;有公司提出这样的需求&#xff0c;除了采集执法记录仪摄像头自带的数据外&#xff0c;还想通过执法记录仪采集外接UVC摄像头。 实际上&#xff0c;这块对我们来说有点炒冷饭了&#xff0c;不算新的诉求。​大牛直播SDK​在2…

win10系统电脑wifi图标不见了的开启方法

很多的用户都习惯了在桌面右下方的小图标中设置网络&#xff0c;但是很多时候都遇到了图标不见了的情况&#xff0c;win10系统电脑wifi图标不见了怎么办呢&#xff1f;就此问题&#xff0c;今天就为你们带来了win10系统电脑wifi图标不见了的开启方法&#xff0c;一起看看吧。 w…

Android平台实现系统内录(捕获播放的音频)并推送RTMP服务技术方案探究

几年来&#xff0c;我们在做无纸化同屏或在线教育相关场景的时候&#xff0c;总是被一件事情困扰&#xff1a;如何实现Android平台的系统内录&#xff0c;并推送到其他播放端&#xff0c;常用的场景比如做无纸化会议或教育的时候&#xff0c;主讲人或老师需要放一个视频&#x…

windows10电脑无法连接到internet怎么解决

许多上网的小伙伴都不知道电脑无法连接到internet怎么办而导致电脑没法上网的问题&#xff0c;windows10电脑无法连接到internet怎么解决?就此问题&#xff0c;今天就专门为大家带来了电脑无法连接到internet解决方法&#xff0c;快来学习看看吧。 windows10电脑无法连接到int…

Android平台GB28181设备接入端PTZ对接详解

PTZCmd实现背景 上一篇blog“Android平台GB28181设备接入模块之球机/云台控制探究”谈到&#xff0c;Android平台做国标GB28181设备接入端的时候&#xff0c;PTZ控制要不要处理&#xff1f;如果处理&#xff0c;难度大不大&#xff1f; 首先说要不要处理&#xff1a;如果只是…

Win7笔记本查看无线网卡是否“支持的承载网络”的方法

如果你笔记本电脑无线网卡可以支持的承载网络&#xff0c;那么我们就可以将无线网卡开启wifi共享&#xff0c;不过我们要怎么查看呢?就此问题&#xff0c;下面小编介绍Win7笔记本查看无线网卡是否“支持的承载网络”的方法&#xff0c;一起来学习吧! Win7笔记本查看无线网卡是…

Android平台GB28181设备接入模块摄像头采集方向不对怎么办?

背景 我们在做Android平台GB28181设备接入模块的时候&#xff0c;有开发者提到这样的诉求&#xff1a;他们的智能头盔、执法记录仪等设备&#xff0c;采集到的图像&#xff0c;是旋转了90、180甚至270的&#xff0c;设备本身无法针对图像做翻转或者旋转操作&#xff0c;问我们…

Win7系统无法复制粘贴怎么解决

现在电脑已经成为了我们每天都要使用的工具&#xff0c;然而随着使用的时间越长&#xff0c;就越容易出现各种电脑问题&#xff0c;不管是多小的问题&#xff0c;都会影响我们使用电脑。Win7系统无法复制粘贴怎么解决&#xff1f;今天请跟小编一起来看看Win7系统的电脑突然无法…

Android平台GB28181设备接入模块分辨率发生变化怎么办?

技术背景 我们在做Android平台gb28181设备接入模块的时候&#xff0c;遇到这样的情况&#xff0c;比如横竖屏分辨率不锁定&#xff0c;采集摄像头的时候&#xff0c;可以实现&#xff0c;横屏状态采集横屏&#xff0c;竖屏状态采集竖屏&#xff0c;简单来说&#xff0c;横屏状…

如何查看Win11系统的版本号

北京时间6月24日的晚上&#xff0c;微软正式的发布了全新一代的操作系统——Windows11&#xff0c;很多朋友都想第一时间去尝尝鲜&#xff0c;Win11系统有很多版本号&#xff0c;为了深入了解自己系统&#xff0c;于是想要查看一下系统版本&#xff0c;这要怎么查看呢?接下来小…

Win11无法使用以太网怎么办 Win11无法连接网络怎么办

最近有不少Windows用户都将自己的电脑升级到了Windows11系统&#xff0c;但是不少用户在使用的时候也遇到了一些问题&#xff0c;例如有些用户升级后发现自己的以太网无法使用&#xff0c;这要怎么解决呢?下面小编就带着大家一起看看吧! 操作方法&#xff1a; 1、我们可以看…

Win11系统如何设置黑暗模式

微软已经正式的发布了Windows11操作系统&#xff0c;Win11采用的是全新的界面&#xff0c;开始菜单和图标的设计&#xff0c;现在&#xff0c;暗黑模式开始逐渐流行了&#xff0c;很多朋友对黑暗主题情有独钟&#xff0c;黑色的主题特别适合晚上使用电脑&#xff0c;Win11操作系…

RTSP、RTMP播放器拉到的视频图像角度不对怎么办?

我们在做RTSP、RTMP播放器的时候&#xff0c;遇到这样的诉求&#xff1a;特别是RTSP&#xff0c;有些摄像头安装可能倒置或者旋转了90亦或270&#xff0c;拉取到图像&#xff0c;势必需要对视频图像做一定的处理&#xff0c;确保显示正常。 为此&#xff0c;我们提供了以下接口…

Android平台GB28181设备接入端如何调节实时音量?

我们在对接Android平台GB28181设备接入端的时候&#xff0c;有开发者提出这样的疑惑&#xff0c;如何调整设备接入端的实时音量&#xff1f; 实际上&#xff0c;这块我们前几年在做RTMP直播推送模块的时候&#xff0c;已经发布了相关的接口&#xff0c;这里再回顾下&#xff1…

Win10系统如何查看声卡ID

在Win10系统的日常使用过程中&#xff0c;我们可能经常需要去查看电脑的声卡ID&#xff0c;但很多小伙伴都不知道要如何查看声卡ID&#xff0c;那么碰到这种情况时&#xff0c;Win10系统如何查看声卡ID呢?下面就和小编一起来看看Win10系统查看声卡ID的方法吧。 Win10系统如何查…

Win10系统如何退出桌面磁贴功能

桌面磁贴是Modern开始界面下的那些方格&#xff0c;但是很多小伙都用不太习惯却不知道如何去关闭这个功能&#xff0c;那么Win10系统如何退出桌面磁贴功能呢?就此问题&#xff0c;下面小编整理了Win10系统退出桌面磁贴功能的解决方法&#xff0c;一来看看解决办法吧。 Win10系…

【技术分享】如何实现功能完备性能优异的RTMP、RTSP播放器?

技术背景 这几年&#xff0c;我们对接了太多有RTSP或RTMP直播播放器诉求的开发者&#xff0c;他们当中除了寻求完整的解决方案的&#xff0c;还有些是技术探讨&#xff0c;希望能借鉴我们播放端的开发思路或功能特性&#xff0c;完善自己的产品。 忙里偷闲&#xff0c;今天我…

我正在参加2022年度博客之星评选,大家帮我点个五星好评

大家好&#xff0c;我是音视频牛哥&#xff0c;致力于跨平台的实时RTMP推流、转发、RTMP/RTSP直播播放、GB28181设备接入。 有幸参加2022年度博客之星评选&#xff0c;欢迎大家帮点五星好评。如果我的博客能给开发者带来哪怕一丝启发&#xff0c;对博主来说&#xff0c;也甚感…

Win10系统切换输入法快捷键设置方法

无论是家用电脑还是办公电脑&#xff0c;一般都没有单一的输入法。有些人每次使用时都必须使用鼠标单击&#xff0c;其实真的很麻烦。Windows10系统切换输入法与以往的都不同&#xff0c;Win10系统如何修改切换输入法按键?就此问题&#xff0c;小编今天就把Win10切换输入法快捷…