如何使用Web Audio API将音频从合成器渲染到缓冲区(PCM值数组)

时间:2016-04-08 18:01:34

标签: javascript audio web-audio web-audio-api

我有一个简单的合成器,可以在一段时间内播放音符:

// Creating audio graph
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var oscillator = audioCtx.createOscillator();
var gainNode = audioCtx.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioCtx.destination);

// Setting parameters
oscillator.type = "sine";
oscillator.frequency.value = 2500;

// Run audio graph
var currentTime = offlineCtx.currentTime;
oscillator.start(currentTime);
oscillator.stop(currentTime + 1);

如何获取合成器发出的声音的PCM数据?我已经设法使用decodeAudioData对音频样本进行了此操作,但我无法找到基于加载样本的音频图形的等效项。

我特别想用OfflineAudioContext渲染音频图,因为我只关心尽可能快地检索PCM数据。

谢谢!

2 个答案:

答案 0 :(得分:2)

您说您想要使用离线上下文,然后您实际上并未使用离线上下文。所以你应该做

var offlineCtx = new OfflineAudioContext(nc, length, rate)

其中nc =渠道数量,length是样本数量,rate是您要使用的样本率。

创建图表,启动所有内容,然后执行

offlineCtx.startRendering().then(function (buffer) {
  // buffer has the PCM data you want. Save it somewhere, 
  // or whatever
})

(我不确定所有浏览器是否支持来自离线上下文的承诺。如果没有,请使用offlineCtx.oncomplete获取数据。请参阅规范。)

答案 1 :(得分:0)

最终我在这里找到了答案:http://www.pp4s.co.uk/main/tu-sms-audio-recording.html#co-tu-sms-audio-recording__js但你不会喜欢它。显然,Audio API不够标准化,因此无法在所有浏览器上运行。所以我能够在Firefox中运行上面的代码,但不能运行Chrome。

基本想法: