结论
多亏@JFSebastian 和他的代码,我才知道:
- 最好使用截止日期作为时间参考,而不是在每个循环中创建新的参考
- 使用截止日期可以使time.sleep的不精确度“摊销”,在所需的比特率附近振荡一点,但会得出正确的(并且要更稳定)的平均值。
- 您只需要使用一次time.time(),这意味着更少的计算误差。
结果,我得到了恒定的32000 B / s振荡到31999,很少能振荡到31745。
现在我可以听到音乐了,没有任何滞后或抖动!
我尝试仅使用
%运算符来使用@JFSebastian强制性操作来使其余部分hibernate,但KB /
s异常地波动,因此我决定保留截止日期实现,因为通过增加浮点值会造成不精确性。但是,总体结果足以满足我的需求。
谢谢大家。
最终密码
def read(self): self.deadline += 0.020 delay = self.deadline - time.perf_counter() if delay > 0: time.sleep(delay) return self._read()



