从扩展 RTP 数据包解码 unix 时间戳 header 以计算延迟

Decoding unix time stamp from extended RTP packet header to calculate latency

我正在做一个项目,我试图计算使用 RTP 在两个 android 设备之间接收的数据包的延迟。

所以我继续用 unix 时间戳扩展 RTP header,在它的第 12-19 个字节中。

我现在已经收到数据包,试图从中提取 unix 时间。但是,正如您在屏幕截图中看到的那样,我在解码过程中做错了。左边是我从数据包中解码出来的时间,右边是到达时间。请忽略我手角的照片。 (对于大分辨率感到抱歉,不知道如何在 SO 上调整图像大小。

我已将字节转换为十六进制,以便尝试调试将字节数组转换为长整数时得到的巨大数字。我没有注意到很多线索,除了我的十六进制值中一致的“41”和我的长值中的“14”。

我目前不知道如何解决这个问题。 如何从我的数据包中提取正确的 Unix 时间(以毫秒为单位)?

我正在使用别人的代码生成我放入数据包中的字节,他使用此代码将 SSRC 放入 header(也是 64 位)。

private void setLong(byte[] buffer, long n, int begin, int end) {
    for (end--; end >= begin; end--) {
        buffer[end] = (byte) (n % 256);
        n >>= 8;
    }
}

我的代码使用上述方法:

public void setUnixTime() {
    for (int i=0;i<mBufferCount;i++) {
        setLong(mBuffers[i], System.currentTimeMillis(),13,20);
    }
}

我也对人们以这种方式计算 RTP 延迟的想法感兴趣(在数据包上设置 unix 时间并将该时间与到达时间进行比较)。

我相信既然你说你的时间戳应该在字节 12-19 中,你的开始和结束也应该分别是 12 和 20。正如目前所读,您的 for 循环只会执行 7 次,最后一个字节为空。将设置字节 19、18、17、16、15、14 和 13,但永远不会设置字节 12。

此外,您可以考虑使用按位 & 而不是模运算来截断较大的数字(n & 255),因为它稍微快一些。

以上都做对了。我得到不正确值的原因是 Libstreaming 库的分包器覆盖了我的扩展 header。我必须手动调整库代码中的 header 大小才能扩展它。