【问题标题】:Decoding unix time stamp from extended RTP packet header to calculate latency从扩展的 RTP 数据包头中解码 unix 时间戳以计算延迟
【发布时间】:2015-03-06 11:24:06
【问题描述】:

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

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

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

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

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

我正在使用其他人的代码来生成我要放入数据包的字节,他使用此代码将 SSRC 放入标头(也是 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 时间并将该时间与到达时间进行比较)。

【问题讨论】:

  • 我想问一下您是使用android RTP库还是自定义库?

标签: java android rtsp rtp


【解决方案1】:

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

此外,您可以考虑使用按位 & 代替模来截断较大的数字(n 和 255),因为它会稍微快一些。

【讨论】:

  • 这并没有解决问题。
【解决方案2】:

上面的一切都做对了。我得到不正确值的原因是因为 Libstreaming 库的分包器覆盖了我的扩展标头。为了扩展它,我不得不手动调整库代码中的标头大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 2012-01-30
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多