【问题标题】:Twilio Voice TimestampsTwilio 语音时间戳
【发布时间】:2020-07-10 23:16:32
【问题描述】:

我们的应用程序使用适用于 iOS、Android 和 Web 的 Twilio 语音 SDK。我们的用例依赖于精确的设备同步和时间戳。我们正在多个相邻设备上播放音频流(在 Twilio 电话会议中),我们需要音频播放同步。大多数情况下,它运行良好,但时不时地,其中一个设备会稍微落后一点,并会影响整个体验。我们想检测设备何时落后(接收数据包延迟),以便我们可以暂时将其静音,以免影响我们想要的用户体验。

我们相信 Twilio 语音在后台使用实时通信 (Web RTC) 和实时传输协议 (RTP)。我们还认为 RTP 具有关于何时发送数据包和何时接收数据包的时间戳信息。

我们正在寻找有关如何读取此时间戳信息(发送和接收)以检测设备同步问题的任何建议。

我们的 iOS 和 Android 客户端是使用 Flutter 和 Dart 构建的,因此使用 Dart 来查看此数据包信息的任何方式都很棒。如果没有,我们可以通过 Swift 和 Kotlin 使用原生通道。对于网络,我们需要一种方法来使用 javascript 查看这个时间戳数据。

如果可能,我们希望通过 SDK 访问这些信息。我在 Twilio 的语音文档中没有看到任何关于时间戳的信息。那么,如果不可能,我们可能不得不在设备上嗅探数据包?这样,我们可以查看来自 Twilio 的 RTP 数据包以了解可用的信息。只要这不违反 Twilio 服务条款,当然 :)

【问题讨论】:

    标签: flutter dart twilio webrtc rtp


    【解决方案1】:

    即使你能得到这些信息,我也不认为它会有用。 RTP 中的timestamp 字段与实时关系不大。在语音中,它实际上是音频流中的样本偏移量。使用具有固定比特率且无静音抑制的典型窄带编解码器,它完全可以从 RTP 序列号预测。例如,对于 20ms 的 G.711 数据包,每个数据包将增加 160。

    RTP 接收器期望数据包的接收时间与其时间戳之间存在随机变化 - 称为抖动。这是由发送方、网络和接收方的延迟引入的。这就是为什么接收器使用抖动缓冲区来减少播放时缓冲区欠载的可能性。 RTCP 的抖动定义 - the interarrival jitter - 是衡量这一点的计算。即 - (可预测的)RTP 时间戳和接收器处测量的挂钟时间之间的变化。

    也许您在客户端和服务器之间需要更像 NTP 协议的东西。

    【讨论】:

    • 谢谢,这个答案给了我很多我们需要研究的指针。我们正在尝试通过许多相邻设备(在同一个房间)同步播放音频流。我们计划使用时间戳信息的方式是,如果我们可以检测到设备接收数据包的时间晚于相邻设备,则将其静音,直到它恢复同步为止。鉴于该用例,您有进一步的建议吗?
    • 大多数“好的”抖动缓冲实现的问题在于它们是自适应的:它们遇到的抖动和延迟越多,它们添加的缓冲就越多,效果就是在数据包接收之间增加了一点延迟并传送到声卡。因此,如果您的一个设备在传输过程中遇到短暂的故障,它将通过临时增加其抖动缓冲区的延迟来进行补偿——这听起来与您想要的完全相反。您可能希望实现自己的堆栈和抖动缓冲区,它不能容忍延迟(改为引入静默)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多