这个简单的代码如何解析RTP标头?

问题描述

我试图了解下面的代码如何解析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数据包上,字节23是序列号

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...