[英]Web Audio API Buffer Callback?
所以我正在制作一個游戲機模擬器,我現在在音頻部分。 如果重要的話,基本上我將樣本推送到 mono 音頻緩沖區(1 通道,2048 長度,22000 采樣率)。 所以我推到這個緩沖區,每次它滿了,我就玩它。 但這會導致雙倍生銹的爆裂聲。 這太糟糕了。
我聽說最佳方法是在緩沖區滿時排隊,等待“內部緩沖區”完成播放然后播放該緩沖區。 但是,我在 api 中找不到類似的東西。 我在想可能是完成后的回調或其他任何事情,但沒有。
有誰知道是否有這樣的事情? 或者是否有與 go 不同的方法? 謝謝大家 !
當 AudioBufferSoruce 完成播放時,會有一個onended
事件。 但是,這可能會在緩沖區結束和您開始播放新緩沖區之間存在間隙。 之所以會出現這種差距,是因為音頻線程需要時間通知主線程緩沖區已結束,並且您接收事件並啟動新緩沖區也需要時間。
正如您所提到的,權利是緩沖數據,然后安排緩沖源開始播放,就像前一個緩沖區結束一樣。 類似於以下內容:
s0 = new AudioBufferSourceNode(context, {buffer: buffer0});
// delta is a small amount of time, about 3 ms or so to allow for the fact that
// by the time you call start(), the audio thread may have already incremented
// currentTime. If it has, the calculations of when the buffer ends will be
// wrong.
startTime = context.currentTime + delta;
s0.start(startTime);
// Create second buffer in buffer1. Then
s1 = new AudioBufferSourceNode(context, {buffer: buffer1});
startTime += buffer0.duration;
s1.start(startTime);
s1
應該在s0
結束時開始播放。 它們之間不應有間隙。 (但是,如果 buffer0 中的最后一個值不接近 buffer1 中的第一個值,則可能會出現點擊或故障。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.