问题描述
我试图了解下面的代码如何解析RTP数据包并返回其结尾的索引:
const char *RtspSplitter::onSearchPacketTail(const char *data,int len) {
auto ret = onSearchPacketTail_l(data,len);
if(ret){
return ret;
}
if (len > 256 * 1024) {
//rtp大于256KB
ret = (char *) memchr(data,'$',len);
if (!ret) {
WarnL << "rtp缓存溢出:" << hexdump(data,1024);
reset();
}
}
return ret;
}
const char *RtspSplitter::onSearchPacketTail_l(const char *data,int len) {
if(!_enableRecvRtp || data[0] != '$'){
//这是rtsp包
_isRtpPacket = false;
return HttpRequestSplitter::onSearchPacketTail(data,len);
}
//这是rtp包
if(len < 4){
//数据不够
return nullptr;
}
uint16_t length = (((uint8_t *)data)[2] << 8) | ((uint8_t *)data)[3];
if(len < length + 4){
//数据不够
return nullptr;
}
//返回rtp包末尾
_isRtpPacket = true;
return data + 4 + length;
}
它首先尝试查看第一个字节是否不是$
:
if(!_enableRecvRtp || data[0] != '$'){
ASCII中的 $
是36 = b00100100
。如果我们看一下RTP数据包的格式为here,则第一个字节应为VVPXCCCC
,其中VV
是版本,当前为2
。但是$ = b00100100
意味着版本0
。
此外,uint16_t length = (((uint8_t *)data)[2] << 8) | ((uint8_t *)data)[3];
应该计算长度。但是在RTP数据包上,字节2
和3
是序列号
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)