代码之家  ›  专栏  ›  技术社区  ›  Sherif

如何计算音频流中每个数据包的RTP时间戳

  •  6
  • Sherif  · 技术社区  · 10 年前

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

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

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

    1 回复  |  直到 10 年前
        1
  •  12
  •   Ralf    10 年前

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

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

    此外,请注意RTP时间戳应该以随机数开始,而不是以零开始。

    一般来说,RTP的良好参考可以在Colin Perkins的书中找到, RTP - Audio and video for the Internet 。虽然有些信息可能已经过时,但它会让您更好地了解RTP。

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

    更新2:

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