package com.rtsp.task;
import com.rtsp.param.IoSession;
import com.rtsp.param.SessionManage;
import com.rtsp.util.Hex;
import io.netty.buffer.ByteBufAllocator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.UnpooledByteBufAllocator;
import java.util.concurrent.ConcurrentHashMap;
/**
* RTP封包和发送
*/
public class RTPPackage {
private final static Logger logger = LoggerFactory.getLogger(RTPPackage.class);
private byte[] sendbuf = new byte[1500];
private int packageSize = 900;
private int singlePackageSize = 100;
public int timeFrameRate = 90000; //时钟频率
public int fps = 25; //帧率
public byte rtpFlag = 0x24; //RTP/TCP数据标识符"$"
public String address = ""; //RTP/UDP数据发送IP地址
public int rtpChannelId = 0; //RTP/TCP通信渠道标识
public int rtpClientPort = -1; //RTP/UDP客户端端口号
public boolean RTP_TCP = false; //RTPTCP标识 控制RTP包发送模式
public String uuid; //会话标识
public byte naluType = 0;
public RTPSubHeader subHead = new RTPSubHeader();
public RTPHeader head = new RTPHeader();
public IoSession ioSession = null;
public int readPos = 0;
//是否有分割头 00 00 00 01 或 00 00 01 没有直接返回fileData
public boolean havHead;
/**
* 读取nalu数据
*
* @param streamData
* @param dataLen
* @return
*/
public boolean readNalu(byte[] streamData, int maxPos, int dataLen, int split) {
int bufLen = maxPos;
if (readPos >= bufLen)
return false;
int pos = readPos;
int naluPos = -1;
while (pos < (bufLen - 2)) {
if (naluPos == -1) {
if (streamData[pos] == 0x00 && streamData[pos + 1] == 0x00) {
if (streamData[pos + 2] == 0x01) {
naluPos = pos + 3;
//有分割头
havHead = true;
//有分割头,但分割头不是第一位,分割头前面的数据当成尾包发出去
if(pos > readPos) {
int naluLen = pos - readPos;
naluToRtp(streamData, readPos, naluLen, 2);
}
pos += 3;
continue;
} else if (streamData[pos + 2] == 0x00 && (pos + 3) < bufLen && streamData[pos + 3] == 0x01) {
naluPos = pos + 4;
//有分割头
havHead = true;
//有分割头,但分割头不是第一位,分割头前面的数据当成尾包发出去
if(pos > readPos) {
int naluLen = pos - readPos;
naluToRtp(streamData, readPos, naluLen, 2);
}
pos += 4;
continue;
}
}
pos++;
continue;
}
//找到下一个nalu开头
if (streamData[pos] == 0x00 && streamData[pos + 1] == 0x00) {
if (streamData[pos + 2] == 0x01) {
int naluLen = pos - naluPos;
readPos = pos;
//有分割头
havHead = true;
naluToRtp(streamData, naluPos, naluLen, 1);
return true;
} else if (streamData[pos + 2] == 0x00 && (pos + 3) < bufLen && streamData[pos + 3] == 0x01) {
int naluLen = pos - naluPos;
readPos = pos;
//有分割头
havHead = true;
naluToRtp(streamData, naluPos, naluLen, 1);
return true;
}
}
pos++;
continue;
}
if (naluPos == -1 && havHead) {
readPos = 0;
return false;
}
if (naluPos == -1 && !havHead) {
naluToRtp(streamData, readPos, dataLen, split);
readPos = 0;
return false;
}
//最后一个
int naluLen = bufLen - naluPos;
readPos = bufLen;
try {
naluToRtp(streamData, naluPos, naluLen, 1);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 本地h264文件nalu rtp封包
*
* @throws Exception
*/
public void naluToRtp(byte[] nalu) throws Exception {
int naluLen = nalu.length;
byte naluType = nalu[0];
if (naluLen <= packageSize) {
head.m = 1;
int sendBufLen = 0;
sendBufLen = head.encode(sendbuf, sendBufLen);
System.arraycopy(nalu, 0, sendbuf, sendBufLen, nalu.length);
sendBufLen += nalu.length;
sendRTP(sendbuf, sendBufLen);
head.seq++;
} else if (naluLen > packageSize) {
int pktNum = naluLen / packageSize;
int remainPktSize = naluLen % packageSize;
int i, pos = 0;
for (i = 0; i < pktNum; i++) {
head.m = 0;
subHead.nri = (byte) ((naluType & 0x60) >> 5);
subHead.type = 28;
subHead.s = 0;
subHead.e = 0;
subHead.r = 0;
subHead.type2 = (byte) (naluType & 0x1F);
int offset = 0;
if (i == 0) {
offset = 1;
subHead.s = 1;
} else if (remainPktSize == 0 && i == pktNum - 1) {
head.m = 1;
subHead.e = 1;
}
int sendBufLen = 0;
sendBufLen = head.encode(sendbuf, sendBufLen);
sendBufLen = subHead.encode(sendbuf, sendBufLen);
System.arraycopy(nalu, pos + offset, sendbuf, sendBufLen, packageSize - offset);
sendBufLen += (packageSize - offset);
sendRTP(sendbuf, sendBufLen);
head.seq++;
pos += packageSize;
}
if (remainPktSize > 0) {
head.m = 1;
subHead.nri = (byte) ((naluType & 0x60) >> 5);
subHead.type = 28;
subHead.s = 0;
subHead.e = 1;
subHead.r = 0;
subHead.type2 = (byte) (naluType & 0x1F);
int sendBufLen = 0;
sendBufLen = head.encode(sendbuf, sendBufLen);
sendBufLen = subHead.encode(sendbuf, sendBufLen);
System.arraycopy(nalu, pos, sendbuf, sendBufLen, remainPktSize);
sendBufLen += remainPktSize;
sendRTP(sendbuf, sendBufLen);
head.seq++;
}
}
}
/**
* 终端数据RTP封包
*
* @param nalu
* @param split
* @throws Exception
*/
public void naluToRtp(byte[] nalu, int redPos, int dataLen, int split){
//logger.debug(" naluToRtp.naluData:" + split + " > " + dataLen + " > " + Hex.encodeHexStr(nalu, redPos, dataLen, false));
try {
int naluLen = dataLen;
if (split == 1) {
naluType = nalu[redPos];
}
if (split == 1 && naluLen <= singlePackageSize) { //单包
head.m = 1;
int sendBufLen = 0;
sendBufLen = head.encode(sendbuf, sendBufLen);
System.arraycopy(nalu, redPos, sendbuf, sendBufLen, naluLen);
sendBufLen += naluLen;
sendRTP(sendbuf, sendBufLen);
head.seq++;
return;
}
head.m = 0;
subHead.nri = (byte) ((naluType & 0x60) >> 5);
subHead.type = 28;
subHea
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java的RTSP服务源码.zip
共36个文件
java:32个
xml:2个
properties:1个
1 下载量 128 浏览量
2023-06-14
19:57:45
上传
评论
收藏 908KB ZIP 举报
温馨提示
基于Java的RTSP服务源码.zip
资源推荐
资源详情
资源评论
收起资源包目录
基于Java的RTSP服务源码.zip (36个子文件)
基于Java的RTSP服务源码
pom.xml 2KB
src
test
java
JavaCVTest.java 818B
main
resources
logback.xml 5KB
java
com
rtsp
udp
UDPSocket.java 3KB
param
IoSession.java 6KB
SessionManage.java 498B
VideoCmd.java 2KB
User.java 703B
handler
ProtocolHandler.java 267B
RTCPTCPHandler.java 799B
RTSPDescribeHandler.java 1KB
RTCPSocketHandler.java 344B
RTPTCPHandler.java 798B
RTSPPlayHandler.java 773B
RTSPHandler.java 9KB
RTSPBaseHandler.java 4KB
RTSPOptionHandler.java 1003B
RTPSocketHandler.java 342B
RTSPSetupHandler.java 1KB
RTSPPauseHandler.java 707B
RTSPTeardownHandler.java 779B
TCPSocketHandler.java 349B
task
RTPTaskQueue.java 1KB
TaskQueue.java 3KB
RTPPackage.java 12KB
RTSPServer.java 4KB
util
Hex.java 5KB
TruncateUrl.java 2KB
PropsConfig.java 1KB
MapUtils.java 2KB
ChannelUtils.java 965B
Constant.java 631B
H264File.java 2KB
ServerStartLock.java 2KB
rtsp.properties 58B
video.h264 869KB
共 36 条
- 1
资源评论
阿星先森
- 粉丝: 164
- 资源: 1452
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功