我试着在两个设备上同时播放一种蜂鸣音(两者之间最大的50毫秒差)。到目前为止,我所做的是通过SNTP获取网络时间,然后使用handler.postDelayed(runnable, difference of network time and phone time + delay)来执行可运行的,但这似乎只在有时和其他情况下起作用,设备发出的声音相差高达3-4秒。
简而言之,这里是这样的场景:我们有两个设备,我们希望它们每10秒一起播放一次蜂鸣声。
有什么更好的方法来做我不知道的事吗?
发布于 2014-08-17 10:59:57
我试着在两个设备上同时播放一种蜂鸣音(两者之间最大的50毫秒差)。
引用谷歌的斯科特·巴塔( Scott )在他的answer to a suspiciously similar question上的话
我不知道你的总体目标是什么,但不要把你的希望提高到能够在太紧的容忍范围内同时实现--很多事情都在和你作对。Android并不是作为一个实时操作系统设计的,即使在诸如实时音频这样的延迟很重要的地方,它也要迎头赶上。操作系统可能不会给您进程所需的调度延迟,而且Android上的Java可能会有点不可预测,除非您非常小心地分配内存等(在错误的时间进行垃圾收集,并且所有东西都超出了窗口)。如果有其他事情发生,您的流程可能在任何时候都会出现颠簸。即使您在开始时的NTP同步也可能有点麻烦,特别是当您正在通过移动网络连接而不是WiFi进行同步时(尽管如此,我不知道协议在处理这个问题上有多好)。让东西在半秒钟内完成应该是可行的,也许,我认为,把东西控制在小于10毫秒是非常困难的,而介于两者之间的be...somewhere可能会非常困难。
我鼓励你重新考虑这一做法。如果这两台设备的距离足够近,可以听到它们的嘟嘟声,那么这些设备就可以通过蓝牙或WiFiDirect连接起来。让一个设备作为主设备。它将一个信号发送到另一个设备,以指示何时播放声音,从接收到信号时起以毫秒为单位进行偏移。现在你只有一只钟。通过实验,您可以确定一个“模糊因素”来处理发送消息的延迟。
然后使用handler.postDelayed(可运行、网络时间差和电话时间+延迟)来执行可运行的
postDelayed()不是为精确的计时而设计的,而且postDelayed()专门将您与主应用程序线程联系在一起。音频回放API通常在后台线程上很好地工作。因此,我会使用ScheduledExecutorService。
发布于 2014-08-17 11:30:20
假设
这两个设备同时达到分钟滴答。
步骤:
基于这样的假设,这将从第一次开始工作。只有当连接太慢,使得通信几乎需要1分钟或更短的时间时,故障机制才能正常工作。
https://stackoverflow.com/questions/25348241
复制相似问题