標籤:
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 };
RTPS流媒體簡介