播放多个连续音频文件后延迟

Posted

技术标签:

【中文标题】播放多个连续音频文件后延迟【英文标题】:Delays after playing multiple sequential audio files 【发布时间】:2013-12-20 22:51:37 【问题描述】:

我目前正在开发一种对讲机类型的环境。录制和重新采样音频现在可以正常工作(感谢您的帮助),播放作品.. 有点。

我的数据以 (WAV-) blob 形式出现,所以这就是我所做的:

audioPlay(blob)

        var fileReader = new FileReader();
        fileReader.onload = function() 
                theContext.decodeAudioData(this.result, function(buffer) 
                        var source = theContext.createBufferSource(); 
                        source.buffer = buffer;
                        source.connect(theContext.destination);
                        source.start(0);
                        );
                ;
        fileReader.readAsArrayBuffer(blob);

但每个新音频都会增加一个轻微的启动延迟,该延迟会随着每个新音频而增长。几声音频后,延迟增加了将近 2-3 秒。日志记录没有显示任何延迟,程序一直流畅到 .source.start。

有什么想法吗?

【问题讨论】:

【参考方案1】:

不要从 0 开始播放每个样本。而是跟踪时间。

 if (nextTime == 0)  nextTime = context.currentTime 
 source.start(nextTime);
 nextTime+=source.buffer.duration; 

【讨论】:

感谢@Brad 会尝试并报告。虽然恕我直言,这并没有什么意义,因为我创建了新的缓冲区和新的 source.connects - 完全独立的进程。 audioPlay 内部有两个顺序异步操作。 fileReader.onload 事件回调是异步的,decodeAudioData 是异步的。你真的不能以这种方式对可预测的时间有任何期望。这就是为什么调用 source.start(0) 不起作用的原因。 @KevinEnnis 我不关注你。我不期望任何精确或可预测的时间。我假设,在 onload 完成和 decodeAudioData 完成后(pcm 数据在缓冲区中可用并准备好播放)应该立即开始播放。我们说的是小型的独立样本,最多 100K。这正是它对第一个样本的工作原理,为任何后续样本添加了一小部分延迟 - 在 4 或 5 个样本后加起来大约一秒钟,依此类推。 start(0) 和 start(context.currentTime) 在语义上是等价的。【参考方案2】:

Michaela,这听起来更像是源中的问题 - 你确定每个传入的 blob 都是正确的(长度正确,并且开头有音频吗?)看起来你可能只是将新记录添加到该端的空缓冲区的末尾。除非有这个特定问题,否则我会看看传入的音频 blob - 也许由于某些原因解码太贵了? (即,如果您有 2-3 秒的累积延迟,您应该能够从日志中判断延迟是在接收数据、解码还是在缓冲区本身。

【讨论】:

我看过了。每个独立播放的音频都会立即开始(在页面重新加载后),日志显示现在延迟 - 是一个谜 :) 但是一个,我要解决 :D

以上是关于播放多个连续音频文件后延迟的主要内容,如果未能解决你的问题,请参考以下文章

如何将侦听器添加到音频元素以进行连续播放

使用 AVAudioPlayer 播放多个音频文件

如何用js控制audio元素连续播放mp3文件

点击播放音频时出现不必要的延迟

颤动音频播放延迟

[js常用]连续播放音频