我有一个基本能用的系统,
- 能在服务器上生成1秒的WAV文件音频
- 能读取该WAV文件并通过websocket发送
- websocket将二进制数据发送到AudioContext.decodeAudioData
- 解码后的音频数据被缓冲,直到收集了4个封包(即4秒)
- 缓冲区被处理并发送到AudioBufferSourceNode.start(time),其中time = (clip_count * duration)
所以如果我有4个音频片段,调用看起来像:
AudioBufferSourceNode.start(0);
AudioBufferSourceNode.start(1);
AudioBufferSourceNode.start(2);
AudioBufferSourceNode.start(3);
我原以为这样能够完美地安排4秒钟的音频,但似乎我遇到了时钟问题,也许是因为我期望音频时钟完美无缺。我已经使用增益节点来消除每个声音片段(1秒)之间的噪音,但是我开始出现时间上的问题,或者很快就会出现,或者在很长一段时间后才会出现。最糟糕的情况是,我的音频播放起来像这样。
---------------------- ----------- ----------- -----------
| 1 second | 1 second | | 950ms | | 900ms | | 850ms |
---------------------- ----------- ----------- -----------
gap gap gap
在这个图中,“1秒”和“#ms”代表正在播放的音频时长。它应该始终为1秒。随着音频的播放,似乎也会出现间隙。我想即使我告诉音频上下文在0时刻精确播放文件,但其他计划的音频剪辑可能会或可能不会准时。这是正确的吗?还是我的系统出了什么问题?是否有100%的可靠性,我可以安排音频剪辑在完全正确的时间播放,还是我需要添加一些计算来确定何时播放的误差范围为几毫秒?