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