RTPS流媒体简介

时间:2022-09-10 05:47:28
  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 };