RTP协议接收和播放
前面讲过RTP协议的重要性,说过发送RTP协议,RTP协议重要性下面我们开始写发送和接收程序,不依赖于jrtplib等RTP库,自行接收。这样,有利于以后将RTP直接转到Webrtc上
RTP接收首先定义RTPFrame结构体,一般来讲,我们都是12字节头部,但不是一定的,自行扩展是允许的,具体看RTP的头部字节含义。maker是代表结束,为1,没有结束为0,还有一个更简单的方法,当一帧结束时,timstamp一定会改变,也可以这样来断定,具体来说,也没有一帧的概念,或者称为一个nalu视频的切换。ok,show me the code,注意,像时间戳,seq no,以及ssrc等都是网络字节序,是大端格式,读者必须将这些字节序理解。seq no 为16位两字节,达到最大值又从零开始。
struct RTPFrame {
RTPFrame(const unsigned char * frame, int frameLen) {
_frame = (unsigned char*) frame;
_frameLen = frameLen;
};
RTPFrame(unsigned char * frame, int frameLen, unsigned char payloadType) {
_frame = frame;
_frameLen = frameLen;
if (_frameLen > 0)
_frame [0] = 0x80;
SetPayloadType(payloadType);
}
unsigned GetPayloadSize() const {
return (_frameLen - GetHeaderSize());
}
void SetPayloadSize(int size) {
_frameLen = size + GetHeaderSize();
}
int GetFrameLen () const {
return (_frameLen);
}
unsigned char * GetPayloadPtr() const {
return (_frame + GetHeaderSize());
}
int GetHeaderSize() const {
int size;
size = 12;
if (_frameLen
关注
打赏