Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Twilio语音时间戳_Flutter_Dart_Twilio_Webrtc_Rtp - Fatal编程技术网

Flutter Twilio语音时间戳

Flutter Twilio语音时间戳,flutter,dart,twilio,webrtc,rtp,Flutter,Dart,Twilio,Webrtc,Rtp,我们的应用程序使用适用于iOS、Android和Web的Twilio语音SDK。我们的用例依赖于精确的设备同步和时间戳。我们正在多个相邻设备上播放音频流(在Twilio电话会议中),我们需要音频播放同步。大多数情况下,它工作得很好,但有时,其中一台设备会落后一点,从而影响整个体验。我们希望检测设备何时落后(延迟接收数据包),这样我们可以暂时将其静音,这样它就不会影响我们想要的用户体验 我们相信Twilio语音在幕后使用实时通信(web RTC)和实时传输协议(RTP)。我们还相信RTP具有数据包

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

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

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

我们的iOS和Android客户端都是使用Flatter和Dart构建的,因此任何使用Dart查看此数据包信息的方法都是非常好的。如果没有,我们可以通过Swift和Kotlin使用本机频道。对于web,我们需要一种使用javascript查看时间戳数据的方法


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

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

RTP接收器期望在数据包的接收时间和时间戳之间存在随机变化,称为抖动。这是由发送方、网络和接收方的延迟引起的。这就是为什么接收机使用抖动缓冲区来降低播放时缓冲区不足的可能性。RTCP的抖动定义——是一种测量抖动的计算方法。也就是说,(可预测的)RTP时间戳和接收器处测得的墙时钟时间之间的变化


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

谢谢,这个答案给了我很多我们需要研究的提示。我们正在尝试通过许多相邻设备(在同一房间)同步播放音频流。我们计划使用时间戳信息的方法是,如果我们能够检测到设备比相邻设备晚接收数据包,则将设备从播放音频中静音,直到它恢复同步。考虑到该用例,您是否有进一步的建议?大多数“好的”抖动缓冲区实现的问题在于它们是自适应的:它们遇到的抖动和延迟越多,它们添加的缓冲越多,其效果是在数据包接收和发送到声卡之间增加一点延迟。因此,如果你的一台设备在传输过程中遇到了一个小故障,它会通过抖动缓冲区暂时增加延迟来进行补偿,这听起来与你想要的正好相反。您可能想要实现自己的堆栈和抖动缓冲区,它不能容忍延迟(引入静默)。