我试图了解就缓冲区管理而言,实时音频流是如何完成的。
对于音频案例:如果您有一个源以 44100hz +/- 时钟误差捕获帧,而带有声卡 DAC 的接收器以 44100hz +/- 时钟误差消耗帧。
由于每一端的时钟错误,接收器处的缓冲区将(最终)失控或运行不足。
对于一个源向多个接收器进行实时流式传输,流控制流是不可能的。
我对解决方案的唯一猜测是跟踪接收器的缓冲区填充(比网络抖动效应更长的时间)并插入样本或丢弃样本。
对此的任何见解将不胜感激。谢谢!
我试图了解就缓冲区管理而言,实时音频流是如何完成的。
对于音频案例:如果您有一个源以 44100hz +/- 时钟误差捕获帧,而带有声卡 DAC 的接收器以 44100hz +/- 时钟误差消耗帧。
由于每一端的时钟错误,接收器处的缓冲区将(最终)失控或运行不足。
对于一个源向多个接收器进行实时流式传输,流控制流是不可能的。
我对解决方案的唯一猜测是跟踪接收器的缓冲区填充(比网络抖动效应更长的时间)并插入样本或丢弃样本。
对此的任何见解将不胜感激。谢谢!
这很重要。通过网络流式传输连续、长期、实时的音频通常在行业中完成,这不是开玩笑的事情。假设两个振荡器的偏差很小以至于可以忽略不计,这太简单了。
(顺便说一句,在某些情况下说这无关紧要是可以的。例如,当看到两个邪恶的成年人掉进敞开的坟墓时,帕格斯利亚当问他的姐姐星期三亚当斯的问题。他问“他们死了吗?”她干巴巴地回答,“这有关系吗?”)
以下是解决问题的三种可能方法,如果您能想到更多或更好的解决方案,请分享:1)实现某种锁频环,从而稍微调整接收器的时钟以适应输入流 2)在接收器执行采样率转换以纠正错误 3) 监控缓冲区或队列中的样本数,以便在即将发生欠载或溢出时生成或丢弃一些样本,以避免音频质量严重下降。
如果您可以控制接收器的时钟,那么第一个解决方案是最好的。我不确定如何使用 ALSA 或 PulseAudio 之类的高级音频软件模块来做到这一点(任何建议都非常感谢!)从哲学上讲,执行采样率转换可能很好,但 CPU 密集度会远远超过它的价值(并添加不必要的失败风险)所以我赞成监测缓冲区深度(如 May 所建议的那样)并在不显眼的情况下将样本滑入或滑出。
还有什么想法吗?
时钟不同步的情况肯定是这样。事实是,没关系。
假设时钟关闭多达 5Hz(这比正常值高几个数量级)。在一个小时的过程中,时钟只漂移了 0.4 秒,这比通常的 2-5 秒的缓冲时间要短。
网络问题通常比时钟同步问题更频繁地导致重新缓冲。实际上,时钟通常相差 1Hz 或更小,这几乎不是问题。
现在,如果您想同步播放,那完全不是问题。幸运的是,流式音频的听众通常不会这样做。