gpt4 book ai didi

javascript - Javascript 中的现场声音合成 : any way to reduce latency?

转载 作者:行者123 更新时间:2023-11-28 10:56:53 24 4
gpt4 key购买 nike

我正在开发一个 Javascript 音乐应用程序。

离线渲染工作正常,即生成一个缓冲区,使用 AudioBufferSourceNode 在给定时间播放它。时机几乎是完美的。

但我需要生成无法使用 API 的默认节点创建的音调。因此,我将声音生成逻辑放入 ScriptProcessorNode 的回调中。

我相当确定我的 ScriptProcessorNode 中的代码足够快,因为一旦开始,声音就会在我想要的任意数量的缓冲周期内没有故障地播放 - 因此及时填充缓冲区可能不是这里的问题。从我的实验中,我发现 ScriptProcessorNode 的 onaudioprocess 事件是定期触发的,而不取决于处理器节点的创建时间。这会在应用程序中产生不可预测的延迟:如果用户在回调开始后立即按下某个键,那么它会等到下一个周期开始播放。

我创建了this fiddle来展示它。有一个简单的仪器和两个按钮来控制它。播放预先录制的缓冲区:

function playBuffer()
{
source = ac.createBufferSource();
source.buffer = buffer;
source.connect(ac.destination);
source.start(0);
};

另一个播放相同的声音,但是是实时的:

function playLive()
{
processor = ac.createScriptProcessor(4096, 0, 1);
processor.onaudioprocess = function(e)
{
sineStrument.fillBuffer(e.outputBuffer.getChannelData(0), e.outputBuffer.length);
}
processor.connect(ac.destination);
};

使用第一个按钮,您可以生成节奏并听到它完美地工作。无法使用第二个按钮,因为声音开始需要大约 50 毫秒以上的时间。

现在请注意,该仪器非常简单,我认为这里没有计算速度问题。另外,如果时机正确,您可以让实时处理的声音与您的点击同步播放 - 我认为您“仅”需要在调用 onaudioprocess 回调之前点击。

以下事实:1) playBuffer 函数立即播放,2) 可以使用 playLive 函数获得正确的计时,这告诉我应该有一种技术方法来使 ScriptProcessorNode 计时正确。

我该怎么做?为什么播放缓冲区没有固定的开始时间?

我也尝试过减小 ScriptProcessorNode 的缓冲区大小,但声音很快就会失真。为什么会这样呢?如果回调中的代码不够快,一段时间后声音不会出现故障吗?事实并非如此!

最佳答案

将您的 ScriptProcessorNode 连接到增益值初始化为 0 的 GainNode。让“Play Live”按钮在按下时将增益值设置为 1,在释放时将增益值设置为 0。

关于javascript - Javascript 中的现场声音合成 : any way to reduce latency?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19667352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com