UDP协议转换TCP协议
项目背景:项目类似中间件 作用是数据搬运 ,可以搬运文件 ,视频,音频 。从互联网把数据搬运到内网中。有的时候拉取视频流数据的时候 使用UDP拉取会存在丢包的情况 通过TCP拉拉取视频流数据 再通过UDP发送这样可以保证质量也能提高效率。
着重说明协议转换
使用的技术
1.netty
2.scoket
过程描述
测试利用两个视频开源平台 LiveGBS 一个放在内网中充当视频播放设备 此处命名为SPA2 一个放在外网中充当视频源平台 此处命名为SPA1,在使用一个摄像头设备 海康或者宇视都可以,摄像头绑定到SPA1上。在SPA2平台点击播放视频 ,SPA1视频数据通过中间件搬运到SPA2播放出来。
- SPA2发起UDP协议播放视频请求
- A2端接收到UDP协议请求 通过netty发送到A1端
- A1端通过已有的监听,监听到过来的请求信息 解析请求数据
- 解析UDP协议 修改信令里面的标识 RTP/AVP -->TCP/RTP/AVP
- 修改以后的信令发送给视频源平台 建立连接
- 视频源平台 返回对应的视频源数据 TCP
- 接收到TCP类型视频源数据 转还为UDP协议 数据方法方法 因为此时A2那边还是UDP监听 以下是主要 TCP协议转换UDP协议方法 代码
data = headerBuffer.array();//每段报文最前面的两位 [5,-124]
int len = Util.getLen(data,0); //数组包长度 1412
headerBuffer.clear();
byte[] contentData = new byte[len];// 每段数据包字节数组长度
int realLen = in.read(contentData);//每段数据包真正的字节数组
ByteBuffer bb = ByteBuffer.allocate(len);//分配缓冲区
bb.put(contentData,0,realLen);//添加后面的数据包
while(realLen != len) {
byte[] tempArr = new byte[len-realLen];
int tempLen = in.read(tempArr);
bb.put(tempArr,0,tempLen);
realLen = tempLen + realLen;
}
byte[] result = bb.array();
RtpRtcpGapMsg rtpRtcpGapMsg = new RtpRtcpGapMsg(callId,oldIp,oldPort,protocol,isRtcp,result,packageIndex.getAndIncrement());
rtpRtcpGapMsg.setLastPackage(false);
msgTransfer(rtpRtcpGapMsg);
}
}
主要就是把每次发送的数据包 长度修改成符合UDP协议发送的长度 再把每次发送之前数据包的最前面标识位去掉 因为UDP协议是不需要的。
以上是简单的介绍,如有问题请私聊我,大家一起交流。