【问题标题】:How to calculate the RTP Timestamp for each packet in an audio stream如何计算音频流中每个数据包的 RTP 时间戳
【发布时间】:2014-08-30 18:21:25
【问题描述】:

我阅读了 RTP 规范,但似乎无法理解 RTP 数据包时间戳。我试图在我的服务器中以不同的方式实现它,但我无法让玩家正确播放它。

我在这里遇到的“错误”行为是(我使用 VLC 播放器将 RTSP url 播放到我的服务器)我发现播放器的日志说 “缓冲方式太晚了”和“PTS值错误”。这意味着音频帧以某种方式到达时间戳未正确设置的数据包。我试图以不同的方式实现时间戳的生成,但没有这样的运气。

我需要一些详细的资源或参考资料,让我真正了解 RTP 时间戳的工作原理和生成方式。

【问题讨论】:

    标签: timestamp audio-streaming vlc network-protocols rtp


    【解决方案1】:

    音频和视频时间戳的计算方式相同。

    音频 RTP 负载格式通常使用 8Khz 时钟。然后获取包含例如的第一个音频样本20 毫秒并分配此时间戳 t = 0。20 毫秒是 1/50 秒,因此这等于以下示例的 8000/50 = 160 时间戳增量。对于音频,您可以根据采样率、每个样本的位数和通道数来计算采样持续时间。在实时源的情况下,样本可能已经带有时间戳,您只需将时间戳转换为 RTP 时间戳。

    另外,请注意,RTP 时间戳应该从一个随机数开始,而不是从零开始。

    可以在 Colin Perkins 的书RTP - Audio and video for the Internet 中找到有关 RTP 的一般参考资料。虽然其中一些信息可能已经过时,但它会让您对 RTP 有一个很好的了解。

    更新: 挂钟是通过使用 RTCP SR 中的 NTP 时间戳确定的,它告诉您 RTP 时间戳映射到什么时间,即 RTP 时间戳 160 = 某个日期时间。这是必需的,例如用于同步到两个 RTP 时间戳都使用不同随机偏移量的视频。当然,日期/时间的有效性取决于发送方的 NTP 时间戳是如何计算的,并且不能保证这反映了实际的日期/时间。您可以使用 wireshark 嗅探流量,它会告诉您 NTP 时间戳表示的日期/时间。

    更新 2:

    这取决于客户的期望以及客户的实现方式。如果您正在编写自己的 RTSP 客户端,它可能就足够了。例如,如果您编写了 DirectShow 源过滤器,您可以将 RTP 时间戳直接转换为媒体时间戳,这样就可以了。但是,由于您使用的是现有客户端,因此它可以例如是客户端只使用同步的 RTP 时间戳,所以在这种情况下,它不够。总之,它取决于客户端的实现。我不确定 VLC 期待什么。

    【讨论】:

    • 那么“挂钟”的部分是哪里来的?
    • RTSP 和 RTP 的最小实现可以忽略使用 RTCP 并因此忽略 NTP 时间戳(挂钟)?
    • 通过最小的实现,你只写服务器?客户端和服务器?
    • 为什么RTP时间戳总是从一个随机数开始?这不会让找出当前的播放点变得更加混乱吗?
    • @Srevilo 随机初始序列号和时间戳增加安全性,如RTP RFC3550中所述"序列号的初始值应该是随机的(不可预测的),以对加密进行已知明文攻击更难...时间戳的初始值应该是随机的,至于序号。”
    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2018-03-01
    • 2017-01-07
    相关资源
    最近更新 更多