如何使从合成器的音频缓冲器(PCM值的阵列)与Web音频API
问题描述:
我有一个简单的合成器,可播放音符的时间有些长:如何使从合成器的音频缓冲器(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数据。
谢谢!
答
你说你希望使用脱机环境,然后你不实际使用离线上下文。所以,你应该做的
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来获取数据。参见规范)
答
最终我在这里找到了答案:http://www.pp4s.co.uk/main/tu-sms-audio-recording.html#co-tu-sms-audio-recording__js但你不会喜欢它。显然,音频API并不是标准化的,因此无法在所有浏览器上运行。所以我已经能够在Firefox中运行上面的代码,但不能运行Chrome。
基本思路:
- 使用DEST =交流。 createMediaStreamDestination();得到目的地 的声音
- 使用新MediaRecorder(dest.stream);得到记录
- 使用MediaRecorder ondataavailable和stop事件来获取数据,并将其合并到一个Blob
在这里尝试我的项目,会让你记录一定数量的秒进入一组你可以处理的帧:http://stackoverflow.com/questions/37728518/how-to-export-last-3s -data-的-A-网络音频流/ 38638448#38638448 –