RTSP数据流简介:
RTSP_HEADER + RTP_HEADER + 1、视频:NALU_HEADER(type*) + FU_HEADER
2、音频: + 音频数据;
RTSP_HEADER payloadLen = RTSP_HEADER后的包长度;
dollar = 36(0x24);
RTP_HEADER payloadtype = 数据类型(H264 、G711_A、G711_U、MPEG.......);
timeStamp = 当前包的时间戳;
version = 2;
sequenceNumber
= 包序号,递增+1;
NALU_HEADER type(NAL_UNIT_TYPE) = 1、SEQ_PARAMETER_SET_RBSP(7):关键帧,取帧的高度和宽度;
2、SLICE_LAYER_WITHOUT_PARTITIONING_RBSP至SINGLE_TIME_AGGREGATION_PACKET_A之间时,数据前需要加上RTP_START_CODE;
FU_HEADER start_bit = 1、第一个包,需要加上RTP_START_CODE + (FU_HEADER.nri << 5) | (FU_HEADER.forbidden_zero_bit << 6) | FU_HEADER.type;
音频数据:每个包前加上RTP_AUDIO_CODE;
class RTSP_HEADER
{
public byte dollar; /* 8, $:dollar sign(24 decimal) */
public byte channelid; /* 8, channel id */
public short payloadLen; /* 16, payload length */
}
class RTP_HEADER
{
public byte csrccount;// 4位Bit;
public byte extension;// 1位Bit;
public byte padding;// 1位Bit;
public byte version;// 2位Bit;
public byte payloadtype;// 7位Bit;
public byte marker;// 1位Bit;
public short sequenceNumber;
public long timeStamp;
public int ssrc;
}
class NALU_HEADER
{
public byte type;// :5位Bit;
public byte nri;// :2位Bit;
public byte forbidden_zero_bit;// :1位Bit;
}
class FU_HEADER
{
public byte type;// :5位Bit; //和原始数据中nalu中的type一样
public byte reserve_bit;// :1位Bit; //保留位,必须是0
public byte end_bit;// :1位Bit; //指示是不是这一帧的最后一个分片
public byte start_bit;// :1位Bit; //指示是不是这一帧的第一个分片
}
public final byte[] RTP_START_CODE = new byte[] { 0x00, 0x00, 0x00, 0x01 };
public final byte[] RTP_AUDIO_CODE = new byte[] { 0x00, 0x01, (byte) 0xA0, 0x00 };