2016-04-08 32 views
3

我有一个简单的合成器,可播放音符的时间有些长:如何使从合成器的音频缓冲器(PCM值的阵列)与Web音频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数据。

谢谢!

+0

在这里尝试我的项目,会让你记录一定数量的秒进入一组你可以处理的帧:http://stackoverflow.com/questions/37728518/how-to-export-last-3s -data-的-A-网络音频流/ 38638448#38638448 –

回答

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来获取数据。参见规范)

0

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

基本思路: